ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

LC 面试题 08.13. Pile Box LCCI

2020-05-27 10:04:26  阅读:262  来源: 互联网

标签:Box 面试题 LC idx idy int mid xleft xright


link

 

 题解:

按高度升序排序,若高度相同,按宽度降序排序。到i后,用线段树找w,d 在[0,0]-[wi-1,di-1]的最大值,更新此节点。

class Solution {
public:
    unordered_map<int,int> seg[3010<<2];
    int qx1,qy1,qx2,qy2;
    int x,y,val;
    int n;
    int cur;
    int queryx(int idx, int xleft, int xright){
        if(xleft>xright || qx1>xright || qx2<xleft) return 0;
        if(qx1<=xleft && qx2>=xright){
            int res=queryy(idx,0,0,n);
            return res;
        }

        int mid=(xleft+xright)/2;
        int l=queryx(idx*2+1,xleft,mid);
        int r=queryx(idx*2+2,mid+1,xright);
        return max(l,r);
    }
    int queryy(int idx, int idy, int yleft, int yright){
        if(qy1>yright || qy2<yleft) return 0;
        if(qy1<=yleft && qy2>=yright) return seg[idx][idy];

        int mid=(yleft+yright)/2;
        int l=queryy(idx,idy*2+1,yleft,mid);
        int r=queryy(idx,idy*2+2,mid+1,yright);
        return max(l,r);
    }

    void updatex(int idx, int xleft, int xright){
        if(xleft>xright || x<xleft || x>xright) return;
        if(xleft==xright){
            updatey(idx,xleft,xright,0,0,n);
            return;
        }
        int mid=(xleft+xright)/2;
        updatex(idx*2+1,xleft,mid);
        updatex(idx*2+2,mid+1,xright);
        updatey(idx,xleft,xright,0,0,n);
    }

    void updatey(int idx, int xleft, int xright, int idy, int yleft, int yright){
        if(yleft>yright || y<yleft || y>yright) return;
        if(yleft==yright){
            if(xleft==xright) {
                seg[idx][idy]=val;
            }
            else seg[idx][idy]=max(seg[idx*2+1][idy],seg[idx*2+2][idy]);
            return;
        }
        int mid=(yleft+yright)/2;
        updatey(idx,xleft,xright,idy*2+1,yleft,mid);
        updatey(idx,xleft,xright,idy*2+2,mid+1,yright);
        seg[idx][idy]=max(seg[idx][idy*2+1],seg[idx][idy*2+2]);
    }

    int pileBox(vector<vector<int>>& box) {
        unordered_map<int,int> wid;
        unordered_map<int,int> did;
        sort(box.begin(),box.end(),[](vector<int>& v1, vector<int>& v2){
            return v1[0]<v2[0];
        });
        n=box.size();
        for(int i=0;i<n;i++){
            if(i==0) wid[box[i][0]]=1;
            else {
                if(box[i][0]>box[i-1][0]) wid[box[i][0]]=i+1;
            }
        }
        sort(box.begin(),box.end(),[](vector<int>& v1, vector<int>& v2){
            return v1[1]<v2[1];
        });
        for(int i=0;i<n;i++){
            if(i==0) did[box[i][1]]=1;
            else {
                if(box[i][1]>box[i-1][1]) did[box[i][1]]=i+1;
            }
        }
        sort(box.begin(),box.end(),[](vector<int>& v1, vector<int>& v2){
            return v1[2]==v2[2]?v1[0]>v2[0]: v1[2]<v2[2];
        });
      
        int res=0;
        vector<int> dp(n,0);
        for(int i=0;i<n;i++){
            qx1=0;
            qy1=0;
            qx2=wid[box[i][0]]-1;
            qy2=did[box[i][1]]-1;
            int q=queryx(0,0,n);
            dp[i]=q+box[i][2];
            res=max(res,dp[i]);
            x=wid[box[i][0]];
            y=did[box[i][1]];
            val=dp[i];
            cur=i;
            updatex(0,0,n);
        }
        return res;
    }

   
};

 

标签:Box,面试题,LC,idx,idy,int,mid,xleft,xright
来源: https://www.cnblogs.com/FEIIEF/p/12970710.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有