LeetCode218. The Skyline Problem分治法

题意:轮廓问题,不好描述。

首先怎么分:

  • 不停对半分
  • 停止条件1:为空时,直接返回空
  • 停止条件2:大小为1时,直接返回左上角点和右下角点。

那么怎么合并?

  • 维护两个变量:l,r l为左半部分当前位置,r为右半部分当前位置
  • 维护两个变量:h1,h2 h1表示左半部分当前位置高度,h2表示右半部分档期位置高度
  • 如果当前位置左半部分横坐标更小,就更新h1,从左半部分选元素;
  • 如果当前位置右半部分横坐标更小,就更新h2,从右半部分选元素;
  • 如果一样大,就更新h1,h2,从左(或右)半部分选元素
  • 当向结果中插入点时,只有和结果中最后一个点高度不同的点才能插入到结果里,且一直使用高度max(h1,h2)。
  • 当某一部分全部访问过后,就将另一部分(和结果中最后一个点高度不同的点)直接插入结果里。
#include 

class Solution {
public:
    vectorint, int>> getSkyline(vector<vector<int>>& buildings) {
        if(buildings.empty()) return vectorint, int> >();
        if(buildings.size()==1){
            vectorint, int> > vec;
            vec.push_back(pair<int,int>(buildings[0][0],buildings[0][2]));
            vec.push_back(pair<int,int>(buildings[0][1],0));
            return vec;
        }
        int mid=buildings.size()/2;
        vector<vector<int>> bl(buildings.begin(),buildings.begin()+mid);
        vector<vector<int>> br(buildings.begin()+mid,buildings.end());
        vectorint, int>> left=getSkyline(bl);
        vectorint, int>> right=getSkyline(br);
        return merge(left,right);
    }
    vectorint, int>> merge(vectorint, int>>& left, vectorint, int>>& right){
        int h1=0,h2=0;
        int l=0,r=0;
        vectorint, int>> ans;
        while(lif(left[l].firstif(ans.empty()||ans.back().second!=max(h1,h2))
                    ans.push_back(pair<int,int>(left[l].first,max(h1,h2)));
                l++;
            }
            else if(left[l].first>right[r].first){
                h2=right[r].second;
                if(ans.empty()||ans.back().second!=max(h1,h2))
                    ans.push_back(pair<int,int>(right[r].first,max(h1,h2)));
                r++;
            }
            else{
                h1=left[l].second;
                h2=right[r].second;
                if(ans.empty()||ans.back().second!=max(h1,h2))
                    ans.push_back(pair<int,int>(left[l].first,max(h1,h2)));
                l++,r++;
            }
        }
        for(int i=l;iif(ans.empty()||ans.back().second!=left[i].second) ans.push_back(left[i]);
        for(int i=r;iif(ans.empty()||ans.back().second!=right[i].second) ans.push_back(right[i]);
        return ans;
    }
};

你可能感兴趣的:(LeetCode,leetcode)