给你一个房屋数组houses 和一个整数 k ,其中 houses[i] 是第 i 栋房子在一条街上的位置,现需要在这条街上安排 k 个邮筒。
请你返回每栋房子与离它最近的邮筒之间的距离的 最小 总和。
答案保证在 32 位有符号整数范围以内。
示例 1:
输入:houses = [1,4,8,10,20], k = 3
输出:5
解释:将邮筒分别安放在位置 3, 9 和 20 处。
每个房子到最近邮筒的距离和为 |3-1| + |4-3| + |9-8| + |10-9| + |20-20| = 5 。
示例 2:
输入:houses = [2,3,5,12,18], k = 2
输出:9
解释:将邮筒分别安放在位置 3 和 14 处。
每个房子到最近邮筒距离和为 |2-3| + |3-3| + |5-3| + |12-14| + |18-14| = 9 。
示例 3:
输入:houses = [7,4,6,1], k = 1
输出:8
示例 4:
输入:houses = [3,6,14,10], k = 4
输出:0
提示:
n == houses.length
1 <= n <= 100
1 <= houses[i] <= 10^4
1 <= k <= n
数组 houses 中的整数互不相同。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/allocate-mailboxes
思路1:
滑动窗口+双指针
class Solution {
public:
int minDistance(vector<int>& houses, int k) {
sort(houses.begin(),houses.end());
vector < vector <int> > res(houses.size(),vector <int> (houses.size(),0));
for(int i=0;i<houses.size();i++){//滑动窗口
for(int j=i;j<houses.size();j++){
auto mid =( i + j )>> 1;
int total=0;
for(int k=i;k<=j;k++){
total+=abs(houses[k]-houses[mid]);
}
res[i][j]=total;
}
}
vector < vector <int> > dp(k+1,vector <int> (houses.size()+1,0));
for(auto i=1;i<=houses.size();i++){
dp[1][i]=res[0][i-1];
}
for(auto i=2;i<=k;i++){//双指针
for(auto j=1;j<=houses.size();j++){
dp[i][j]=1<<30;
for(auto m=1;m<j;m++){
dp[i][j]=min(dp[i][j],dp[i-1][m]+res[m][j-1]);
}
}
}
return dp[k][houses.size()];
}
};