ICode9

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

LeetCode/排序贪心综合

2022-07-23 06:31:07  阅读:134  来源: 互联网

标签:return nums int public ++ vector 排序 LeetCode 贪心


1. 根据身高重建队列

假设有打乱顺序的一群人站成一个队列,数组 people 表示队列中一些人的属性(不一定按顺序)
每个 people[i] = [hi, ki] 表示第 i 个人的身高为 hi ,前面 正好有 ki 个身高大于或等于 hi 的人

class Solution {
public:
    vector<vector<int>> reconstructQueue(vector<vector<int>>& people) {
        sort(people.begin(), people.end(), [&](vector<int>& a, vector<int>& b) {
            return a[0] > b[0] || (a[0] == b[0] && a[1] < b[1]);
            //左边界降序,右边界升序
        });
        vector<vector<int>> ans;//维护一个比插入数大的数组
        for (vector<int>& person: people) {//从高往低
            ans.insert(ans.begin() + person[1], person);//插到指定位置,后面插入的不会影响前面
        }
        return ans;
    }
};

2. 无重叠区间

求最多无重叠区域(或最少删除次数)

//贪心选择最早结束的区间,以便后续更大选择范围
class Solution {
public:
    int eraseOverlapIntervals(vector<vector<int>>& intervals) {
        sort(intervals.begin(), intervals.end(), [](const auto& u, const auto& v) {
            return u[1] < v[1]; });
        int n = intervals.size();
        int right = intervals[0][1];
        int ans = 1;
        for (int i = 1; i < n; ++i) {
            if (intervals[i][0] >= right) {//不重叠的话
                ++ans;
                right = intervals[i][1];//更新右边界
            }
        }
        return n - ans;
    }
};

3. 用最少数量的箭引爆气球

等价于选取点集,与每个区间交集至少为1

class Solution {
public:
    int findMinArrowShots(vector<vector<int>>& points) {
        sort(points.begin(),points.end(),[&](vector<int>&a,vector<int>&b){
            return a[1]<b[1];
        });
        int target = points[0][1]; int res = 1;
        for(int i=1;i<points.size();i++)
            if(points[i][0]>target){//箭在左边界左方
                target = points[i][1];//再射一箭
                res++;
            }
        return res;
    }
};

4. 设置交集大小至少为2

5. 使数组最小的增量

给你一个整数数组 nums 。每次 move 操作将会选择任意一个满足 0 <= i < nums.length 的下标 i,并将 nums[i] 递增 1
返回使 nums 中的每个值都变成唯一的所需要的最少操作次数

//还可以用线性探测法,消耗空间
class Solution {
public:
    int minIncrementForUnique(vector<int>& nums) {
        sort(nums.begin(),nums.end());
        int move = 0;
        for (int i = 1; i < nums.size(); i++) {
            if (nums[i] <= nums[i - 1]) {
                int pre = nums[i];
                nums[i] = nums[i - 1] + 1;
                move += nums[i] - pre;
            }
        }
        return move;
    }
};

6. 三角形的最大周长

//从后往前枚举最长边,然后贪心选择最近两个数作为边进行判断
class Solution {
public:
    int largestPerimeter(vector<int>& A) {
        sort(A.begin(), A.end());
        for (int i = A.size() - 1; i >= 2; --i) {
            if (A[i - 2] + A[i - 1] > A[i]) {
                return A[i - 2] + A[i - 1] + A[i];
            }
        }
        return 0;
    }
};

7. 删除一个元素使数组严格递增

class Solution {
public:
    bool canBeIncreasing(vector<int>& nums) {
        int cnt = 0;
        for(int i=1;i<nums.size()&&cnt<=1;i++){
            if(nums[i]>nums[i-1]) continue;
            cnt++;
            //判断要删除哪个
            if(i>1&&nums[i]<=nums[i-2])
                nums[i] = nums[i-1];
        }
        return cnt<2;
    }
};

8. 消灭怪物的最大数量

class Solution {
public:
    int eliminateMaximum(vector<int>& dist, vector<int>& speed) {
        int n = dist.size();
        vector<int> time;   // 每个怪物的最晚可被消灭时间
        for (int i = 0; i < n; ++i){
            time.push_back((dist[i] - 1) / speed[i]);
        }
        sort(time.begin(), time.end());
        for (int i = 0; i < n; ++i)
            if (time[i] < i) // 无法消灭该怪物,返回消灭的怪物数量
                return i;
        return n;
    }
};

9. 向数组中追加k个整数

//类似贪心最远距离,忽视相同元素
class Solution {
public:
    long long minimalKSum(vector<int>& nums, int k) {
        sort(nums.begin(),nums.end());
        long long sum = 0;
        for(int i=0;i<nums.size()&&k>=nums[i];i++){
            if(i>0&&nums[i]==nums[i-1]) continue;//跳过重复的
            sum+=nums[i];
            k = k+1;
        }
        return (long long)(1+k)*k/2 - sum;
    }
};

标签:return,nums,int,public,++,vector,排序,LeetCode,贪心
来源: https://www.cnblogs.com/929code/p/16508437.html

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

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

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

ICode9版权所有