【九日集训】leetcode——贪心和sort函数相关题目 来做几题吧~

【九日集训】leetcode——贪心和sort方法相关题目

前言

  今天刷了几题leetcode,都和sort函数以及贪心有关。
涉及到的题目有:
912. 排序数组
169. 多数元素
217. 存在重复元素
164. 最大间距
905. 按奇偶排序数组
539. 最小时间差
976. 三角形的最大周长
881. 救生艇
点击即可传送至题目哦!

【九日集训】leetcode——贪心和sort函数相关题目 来做几题吧~_第1张图片

912. 排序数组

这一题就是sort函数的应用。

#include
class Solution {
public:
    vector<int> sortArray(vector<int>& nums) {
        sort(nums.begin(), nums.begin() + nums.size());
        return nums;
    }
};

169. 多数元素

相同元素占数组元素数量一半以上,n为数组长度,第n / 2 个元素一定是占一半以上的那个数。

class Solution {
public:
    int majorityElement(vector<int>& nums) {
        int n = nums.size();
        sort(nums.begin(), nums.begin() + nums.size());
        return nums[n / 2];
    }
};

217. 存在重复元素

排序后遍历,要是有前后俩元素是相等的,就说明一个元素至少出现了两次。

class Solution {
public:
    bool containsDuplicate(vector<int>& nums) {
        sort(nums.begin(), nums.begin() + nums.size());
        if(nums.size() == 1) return false;
        for(int i = 0; i <  nums.size() - 1; i++){
            if(nums[i] == nums[i + 1]) return true;
        }
        return false;
    }
};

164. 最大间距

额,这题就是特判之后对数组进行排序,然后找到两元素差值最大的然后return即可。

class Solution {
public:
    int maximumGap(vector<int>& nums) {
        int size = nums.size();
        int space = 0, ans = 0;
        if(size < 2) return 0;//特判
        if(size == 2) return nums[1] - nums[0];//特判
        sort(nums.begin(), nums.begin() + nums.size());
        for(int i = 0; i < size - 1; i++){
            space = max(space, nums[i + 1] - nums[i]);//找到最大的差值
        }
        return space;
    }
};

905. 按奇偶排序数组

两次遍历,先判偶数加入数组,再判奇数加入数组。

class Solution {
public:
    vector<int> sortArrayByParity(vector<int>& nums) {
        vector<int> ans;
        for(int i = 0; i < nums.size(); i++){
            if(nums[i]%2 == 0) ans.push_back(nums[i]);
        }
        for(int i = 0; i < nums.size(); i++){
            if(nums[i]&1 == 1) ans.push_back(nums[i]);
        }
        return ans;
    }
};

539. 最小时间差

这题有个小坑,就是最后一个时间和第一个时间有可能是差的最小的,所以需要最后特判。

总的来说就是将字符串转化为分钟数,求最小差值就ok。

class Solution {
public:
    int findMinDifference(vector<string>& timePoints) {
        int size = timePoints.size();
        int times[size];
        for(int i = 0; i < size; i ++){
            int sum = timePoints[i][0] * 600 + timePoints[i][1] * 60 + timePoints[i][3] * 10 + timePoints[i][4];//全部转化为分钟数
            times[i] = sum;
        }
        sort(times, times + size);//排序
        int res = 1440;
        for(int i = 0; i < size - 1; i ++) res = min(res, times[i + 1] - times[i]);//找最小差值
        res = min(res, 1440 + times[0] - times[size - 1]);//特判
        return res;
    }
    
};

976. 三角形的最大周长

这题用的贪心,要是有两个值加一块大于最大的值,那就可以组成最大周长的三角形。

class Solution {
public: 
    static bool cmp(int a, int b){
        return a > b;
    }
    int largestPerimeter(vector<int>& nums) {
        sort(nums.begin(), nums.begin() + nums.size(), cmp);
        for(int i = 0; i < nums.size() - 2; i ++){
            if(nums[i] < nums[i + 1] + nums[i + 2]) return nums[i] + nums[i + 1] + nums[i + 2];
        }
        return 0;
    }
};

881. 救生艇

这题还是贪心,最好的方案就是让最胖的和最瘦的坐一条船上,或者让最胖的自己坐一条船。

class Solution {
public:
    int numRescueBoats(vector<int>& people, int limit) {
        int ans = 0;
        sort(people.begin(), people.end());
        int l = 0, h = people.size() - 1;
        while(l <= h){
            if(people[l] + people[h] > limit){//一艘只能坐一个胖的
                h --;//h左移
            }else{//能坐一个胖的和一个瘦的
                l ++;
                h --;
            }
            ans ++;//下一船
        }
        return ans;
    }
};


就是这些啦,如有更好的解法欢迎各位在评论区留言哦~

你可能感兴趣的:(九日集训,leetcode,贪心算法,算法)