• 296. Best Meeting Point


    问题描述:

    A group of two or more people wants to meet and minimize the total travel distance. You are given a 2D grid of values 0 or 1, where each 1 marks the home of someone in the group. The distance is calculated using Manhattan Distance, where distance(p1, p2) = |p2.x - p1.x| + |p2.y - p1.y|.

    Example:

    Input: 
    
    1 - 0 - 0 - 0 - 1
    |   |   |   |   |
    0 - 0 - 0 - 0 - 0
    |   |   |   |   |
    0 - 0 - 1 - 0 - 0
    
    Output: 6 
    
    Explanation: Given three people living at (0,0), (0,4), and (2,2):
                 The point (0,2) is an ideal meeting point, as the total travel distance 
                 of 2+2+2=6 is minimal. So return 6.

    解题思路:

    我的想法是,首先找到所有为1的点,用一个vector存储起来

    再遍历整个矩阵并计算每个点到其他房子的距离,取最小值返回。

    时间复杂度为O(mnk)其中k为为1的点。

    再来看看最快的解法:

    参考解释:6ms C++ one pass O(mn) solution no sort, Easiest Solution O(n) + O(m) extra space

    因为我们使用的是汉密尔顿距离,而汉密尔顿距离的水平距离和垂直距离是相互独立的,并不会互相影响。

    代码:

    O(mnk):

    class Solution {
    public:
        int minTotalDistance(vector<vector<int>>& grid) {
            vector<pair<int,int>> peoples;
            int m = grid.size(), n = grid[0].size();
            for(int i = 0 ; i < m; i++){
                for(int j = 0; j < n; j++){
                    if(grid[i][j] == 1) peoples.push_back({i,j});
                }
            }
            int ret = INT_MAX;
            for(int i = 0; i < m; i++){
                for(int j = 0; j < n; j++){
                    int cur = 0;
                    pair<int,int> pos = {i, j};
                    for(auto p : peoples){
                        cur += calDistance(p,pos);
                    }
                    ret = min(cur, ret);
                }
            }
            return ret;
        }
        int calDistance(pair<int,int> a, pair<int,int> b){
            return abs(a.first - b.first) + abs(a.second - b.second);
        }
    };

    最快的解法:

    class Solution {
    public:
        int findDist(const vector<int>& points) {
            int dist = 0;
            int i = 0;
            int j = points.size() - 1;
            while (i < j) {
                dist += (points[j] - points[i]);
                ++i;
                --j;
            }
            return dist;
        }
        int minTotalDistance(vector<vector<int>>& grid) {
            vector<int> rows;
            vector<int> cols;
            for (int i = 0; i < grid.size(); ++i) {
                for (int j = 0; j < grid[0].size(); ++j) {
                    if (grid[i][j] == 1) {
                        rows.push_back(i);
                    }
                }
            }
            for (int i = 0; i < grid[0].size(); ++i) {
                for (int j = 0; j < grid.size(); ++j) {
                    if (grid[j][i] == 1) {
                        cols.push_back(i);
                    }
                }
            }
            int ans = findDist(rows) + findDist(cols);
            return ans;
        }
    };
  • 相关阅读:
    leetcode刷题-131~
    leetcode刷题-106~114/116~122/125/127/129~130
    leetcode刷题-100~105
    Intel-Pin的windows安装
    九、appium自动化框架综合实践
    QQ传文件用例设计
    mysql常用语句
    谐云试用的日子
    码农开发资料集
    MyBatis中一个SQL语句的执行过程解析
  • 原文地址:https://www.cnblogs.com/yaoyudadudu/p/9417253.html
Copyright © 2020-2023  润新知