LeetCode_Dec_2nd_Week

Posted KuoGavin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode_Dec_2nd_Week相关的知识,希望对你有一定的参考价值。

December 13rd : 807. 保持城市天际线
December 14th : 630. 课程表 III


December 13rd : 807. 保持城市天际线

昨天把Porsche拼完啦~到时整个亚克力展示柜就更快乐啦!!!

今天的题,统计出各行各列的最大值,然后遍历整个城市格子,找出行列最大值中的较小值减去格子的值也即是该格子最大高度增量,累加返回结果即可。

class Solution 
public:
    int maxIncreaseKeepingSkyline(vector<vector<int>>& grid) 
        int n = grid.size();
        vector<int> rows = vector<int>(n, 0), cols = vector<int>(n, 0);
        for(int i = 0; i < n; ++i) 
            for(int j = 0; j < n; ++j) 
                rows[i] = max(grid[i][j], rows[i]);
                cols[i] = max(grid[j][i], cols[i]);
            
        
        int ret = 0;
        for(int i = 0; i < n; ++i) 
            for(int j = 0; j < n; ++j) 
                ret += min(rows[i], cols[j]) - grid[i][j];
        return ret;
    
;

December 14th : 630. 课程表 III

经典贪心算法题目,每次选取截止时间当前最小的课程(排序后遍历):如果选取该课程学习后的时间没超出截止时间,那么就学习这门课程;如果超出截止时间,则选出目前所要学习的课程当中的最长学习时间的课程(优先队列/大根堆存储获取),将其替换为当前所遍历到的课程,也即是学习同样门数的课程,所花费的总时间较短。

具体的推导过程见:方法一:优先队列 + 贪心

class Solution 
public:
    int scheduleCourse(vector<vector<int>>& courses) 
        sort(courses.begin(), courses.end(), 
             [](vector<int>& a, vector<int>& b)return a[1] < b[1];);
        priority_queue<int, vector<int>, less<int>> q;
        int total = 0;
        for(const auto& course : courses) 
            int ti = course[0], di = course[1];
            if(total + ti <= di) 
                total += ti;
                q.push(ti);
             else if(!q.empty() && q.top() > ti) 
                total -= q.top() - ti;
                q.pop();
                q.push(ti);
            
        
        return q.size();
    
;

以上是关于LeetCode_Dec_2nd_Week的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode_22_Apr_2nd_Week

LeetCode_22_Apr_2nd_Week

LeetCode_Nov_2nd_Week

LeetCode_Dec_1st_Week

LeetCode_Dec_3rd_Week

LeetCode_Dec_3rd_Week