九日集训第六天(贪心)

前言

记录几个面试常见题型

一、知识点

贪心思想

二、题目

1、1913. 两个数对之间的最大乘积差

1.1 分析
有序,找边界

1.2代码

class Solution {
public:
    int maxProductDifference(vector<int>& nums) {

        sort(nums.begin(),nums.end());
        int n = nums.size();
        int a = nums[0] , b = nums[1] , c = nums[n - 1] , d=nums[n -2];
        return abs((a * b) - (c * d));

    }
};

2、三角形的最大周长
2.1题目分析
本题单调性, a + b > c, c作为最大边越大越好
2.2代码

class Solution {
public:
    int largestPerimeter(vector<int>& nums) {

        sort(nums.begin(),nums.end());
         
        int n = nums.size();
        for(int i = n - 1 ; i > 1 ; i --)
            if(nums[i - 1] + nums[i - 2] > nums[i])
                return nums[i - 1] + nums[i - 2] + nums[i];

        return 0;

    }
};

3、数组划分一
3.1题目分析
简单贪心
3.2代码

class Solution {
public:
    int arrayPairSum(vector<int>& nums) {

        sort(nums.begin(),nums.end());
        int n = nums.size() , sum = 0;
        for(int i = n - 2 ; i >=0 ; i-=2 )
        {
            sum += nums[i];
        }

        return sum;

    }
};

4、881救生艇
4.1题目分析

4.2代码

class Solution {
public:
    int numRescueBoats(vector<int>& people, int limit) {
        int  n = people.size() , num =0;
        int i = 0, j = n -1;       
        sort(people.begin(),people.end(),greater<int>());
        while(i <= j)
        {
            if(i == j){
                num ++;
                break;
                }
            else if(people[i] + people[j] > limit)
            {
                i++ ;
                num ++;
            }
            else i ++,j -- ,num ++;
        }
        return num;

    }
};
class Solution {
public:
    int numRescueBoats(vector<int>& people, int limit) {
        sort(people.begin(), people.end());
        int res = 0;
        for (int i = 0, j = people.size() - 1; i <= j; j -- ) {
            if (people[j] + people[i] <= limit) i ++ ;
            res ++ ;
        }
        return res;
    }
};

5、324摆动排序II
5.1题目分析

5.2代码

class Solution {
public:
    

    void wiggleSort(vector<int>& nums) {
        sort(nums.begin(),nums.end());
        vector<int> tmp(nums.size(),0);
        int k = nums.size();
        for(int i = 1;i < nums.size();i += 2){
            tmp[i]  = nums[--k];        //这样插入  * 6 * 5 * 4
        }
        for(int i = 0;i < nums.size();i += 2){
            tmp[i] = nums[--k];         //这样插入  1 * 1 * 2 *
        }

        nums.swap(tmp);
        //memcpy(nums,tmp,sizeof(int)*nums.size());
        //memcpy(nums, ret, sizeof(int) * numsSize);
    }
};
class Solution {
public:
    void wiggleSort(vector<int>& nums) {
        int n = nums.size();
        auto midptr = nums.begin() + n / 2;
        nth_element(nums.begin(), midptr, nums.end());
        int mid = *midptr;

        #define A(i) nums[(i * 2 + 1) % (n | 1)]

        for (int i = 0, j = 0, k = n - 1; i <= k;) {
            if (A(i) > mid) swap(A(i ++ ), A(j ++ ));
            else if (A(i) < mid) swap(A(i), A(k -- ));
            else i ++ ;
        }
    }
};

三、做题记录在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值