【学习报告】《LeetCode零基础指南》(第七讲) 贪心

夜阑听雨i 2021-12-14 14:41:54

最后四天!!
冲冲冲!!

1.

两个数对 (a, b) 和 (c, d) 之间的 乘积差 定义为 (a * b) - (c * d) 。
例如,(5, 6) 和 (2, 7) 之间的乘积差是 (5 * 6) - (2 * 7) = 16 。
给你一个整数数组 nums ,选出四个 不同的 下标 w、x、y 和 z ,使数对 (nums[w], nums[x]) 和 (nums[y], nums[z]) 之间的 乘积差 取到 最大值 。
返回以这种方式取得的乘积差中的 最大值 。

直接排序的代码量比较小,嘿嘿

class Solution {
public:
    int maxProductDifference(vector<int>& nums) {
        sort (nums.begin(),nums.end());
        int m=nums.size();
        return (nums[m-1]*nums[m-2])-(nums[0]*nums[1]);
    }
};

2.

昨天的题

3.

给定长度为 2n 的整数数组 nums ,你的任务是将这些数分成 n 对, 例如 (a1, b1), (a2, b2), ..., (an, bn) ,使得从 1 到 n 的 min(ai, bi) 总和最大。
返回该 最大总和 。

把偶数项的数加起来就好了

class Solution {
public:
    int arrayPairSum(vector<int>& nums) {
        sort (nums.begin(),nums.end());
        int ans =0;
        for (int i=0;i<nums.size()/2;i++){
            ans+=nums[i*2];
        }
        return ans;
    }
};

4.

还是昨天的题目(=-=!

5.

给你一个整数数组 nums,将它重新排列成 nums[0] < nums[1] > nums[2] < nums[3]... 的顺序。
你可以假设所有输入数组都可以得到满足题目要求的结果。

这题需要注意大数要从后往前插入

class Solution {
public:
    void wiggleSort(vector<int>& nums) {
        int ans[nums.size()];
        int n=nums.size();
        sort (nums.begin(),nums.end());
        for (int i=0;i<(nums.size()+1)/2;i++){
            ans[2*i]=nums[(nums.size()-1)/2-i];
            if (2*i+1==nums.size()) break;
            ans[2*i+1]=nums[nums.size()-i-1];
        }
        for (int i=0;i<nums.size();i++){
            nums[i]=ans[i];
        }
    }
};

6.

给你一个整数数组 nums (下标从 0 开始)。每一次操作中,你可以选择数组中一个元素,并将它增加 1 。
比方说,如果 nums = [1,2,3] ,你可以选择增加 nums[1] 得到 nums = [1,3,3] 。
请你返回使 nums 严格递增 的 最少 操作次数。
我们称数组 nums 是 严格递增的 ,当它满足对于所有的 0 <= i < nums.length - 1 都有 nums[i] < nums[i+1] 。一个长度为 1 的数组是严格递增的一种特殊情况。

直接贪心数就好了

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

7.

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

和上题一样的方法

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

8.

给定一个包含非负整数的数组,你的任务是统计其中可以组成三角形三条边的三元组个数。

这题需要优化的是第三层循环,这里采用浮动指针

class Solution {
public:
    int triangleNumber(vector<int>& nums) {
        int n = nums.size();
        if (n<3) return 0;
        sort(nums.begin(), nums.end());
        int ans = 0;
        for (int i = 0; i < n; i++) {
            if (nums[i]==0) continue;            
            for (int j = i + 1,t = j + 1; j < n; j++) {
                while (t < n && nums[t] < nums[i] + nums[j]) {
                    ++t;
                }
                if (j==t) continue;
                ans += t - j - 1;
            }
        }
        return ans;
    }
};

...全文
184 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

64,199

社区成员

发帖
与我相关
我的任务
社区描述
学习「 算法 」的捷径就是 「 题海战略 」,社区由「 夜深人静写算法 」作者创建,三年ACM经验,校集训队队长,亚洲区域赛金牌,世界总决赛选手。社区提供系统的训练,答疑解惑,面试经验,大厂内推等机会
社区管理员
  • 英雄哪里出来
  • 芝麻粒儿
  • Amy卜bo皮
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

QQ群:480072171

英雄算法交流 8 群

 

试试用AI创作助手写篇文章吧