296. Best Meeting Point

求到所有点距离和最小的点。由于是麦哈顿距离,横坐标和纵坐标计算是独立的,于是问题转化为找一维数轴上到所有点距离和最小的点。

这个问题是老生常谈的问题了,如果是点的个数是奇数,答案就是中位数;如果是偶数,则最内侧两个点中间所有的数都可以是答案。两种情况都可以用 nums[nums.size()/2] 来求解。

class Solution {
public:
    int minTotalDistance(vector<vector<int>>& grid) {
        vector<int> is,js;
        for (int i=0;i<grid.size();++i){
            for (int j=0;j<grid[0].size();++j){
                if (grid[i][j]){
                    is.push_back(i);
                    js.push_back(j);
                }
            }
        }

        sort(js.begin(),js.end());
        int i_med = is[is.size()/2];
        int j_med = js[is.size()/2];
        
        int res=0;
        for (int i:is) res+=abs(i-i_med);
        for (int j:js) res+=abs(j-j_med);
        return res;
    }
};

代码中is数组由于生成时就是有序的,因此不需要排序。当然也可以有序生成js,可以降低时间复杂度。

posted @ 2018-06-06 13:32  約束の空  阅读(114)  评论(0)    收藏  举报