LeetCode 1478.安排邮筒 (1、滑动窗口)

给你一个房屋数组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()];
    }
};

 

上一篇:PAT A1072 Gas Station (30 分)


下一篇:PAT-A-1072 Gas Station 【Dijkstra】