首页 > 编程语言 >算法沉淀——贪心算法三(leetcode真题剖析)

算法沉淀——贪心算法三(leetcode真题剖析)

时间:2024-03-19 11:33:48浏览次数:25  
标签:真题 int nums ret nums1 算法 vector prices leetcode

在这里插入图片描述

算法沉淀——贪心算法三

01.买卖股票的最佳时机 II

题目链接:https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-ii/

给你一个整数数组 prices ,其中 prices[i] 表示某支股票第 i 天的价格。

在每一天,你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买,然后在 同一天 出售。

返回 你能获得的 最大 利润

示例 1:

输入:prices = [7,1,5,3,6,4]
输出:7
解释:在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5 - 1 = 4 。
     随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6 - 3 = 3 。
     总利润为 4 + 3 = 7 。

示例 2:

输入:prices = [1,2,3,4,5]
输出:4
解释:在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5 - 1 = 4 。
     总利润为 4 。

示例 3:

输入:prices = [7,6,4,3,1]
输出:0
解释:在这种情况下, 交易无法获得正利润,所以不参与交易可以获得最大利润,最大利润为 0 。 

提示:

  • 1 <= prices.length <= 3 * 104
  • 0 <= prices[i] <= 104

思路

通过画图我们不难看出上升区域利润如果都拿到手即为最大利润,这里有两种写法,一种是一次性加上一整段上升区域,另一种是计算每一小段上升区域

代码

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int ret=0,n=prices.size();
        for(int i=0;i<n;i++){
            int j=i;
            while(j+1<n&&prices[j+1]>prices[j]) j++;
            ret+=prices[j]-prices[i];
            i=j;
        }
        return ret;
    }
};



class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int ret=0,n=prices.size();
        for(int i=1;i<n;i++){
            if(prices[i]>prices[i-1]) 
                ret+=prices[i]-prices[i-1];
        }
        return ret;
    }
};

02.K 次取反后最大化的数组和

题目链接:https://leetcode.cn/problems/maximize-sum-of-array-after-k-negations/

给你一个整数数组 nums 和一个整数 k ,按以下方法修改该数组:

  • 选择某个下标 i 并将 nums[i] 替换为 -nums[i]

重复这个过程恰好 k 次。可以多次选择同一个下标 i

以这种方式修改数组后,返回数组 可能的最大和

示例 1:

输入:nums = [4,2,3], k = 1
输出:5
解释:选择下标 1 ,nums 变为 [4,-2,3] 。

示例 2:

输入:nums = [3,-1,0,2], k = 3
输出:6
解释:选择下标 (1, 2, 2) ,nums 变为 [3,1,0,2] 。

示例 3:

输入:nums = [2,-3,-1,5,-4], k = 2
输出:13
解释:选择下标 (1, 4) ,nums 变为 [2,3,-1,5,4] 。 

提示:

  • 1 <= nums.length <= 104
  • -100 <= nums[i] <= 100
  • 1 <= k <= 104

思路

这里我们需要分情况讨论,设整个数组中负数的个数为m个:

1、m>k:把前k小的负数全变成正数
2、m==k:把所有的负数全变成正数;
3、m<k:先把负数变成正数;然后根据k-m的奇偶情况分情况讨论

代码

class Solution {
public:
    int largestSumAfterKNegations(vector<int>& nums, int k) {
        int m=0,mini=INT_MAX,n=nums.size();
        for(auto x:nums){
            if(x<0) m++;
            mini=min(mini,abs(x));
        }

        int ret=0;
        if(m>k){
            sort(nums.begin(),nums.end());
            for(int i=0;i<k;i++) ret+=-nums[i];
            for(int i=k;i<n;i++) ret+=nums[i]; 
        }
        else{
            for(auto x:nums) ret+=abs(x);
            if((k-m)%2) ret-=mini*2;
        }
        return ret;
    }
};

03.按身高排序

题目链接:https://leetcode.cn/problems/sort-the-people/

给定一个字符串数组names和一个由不同正整数heights组成的数组。两个数组的长度都是n

对于每个索引inames[i]heights[i]表示该人的姓名和身高。

返回按人物身高降序names排序。

示例1:

输入: names = ["Mary","John","Emma"], heights = [180,165,170]
输出: ["Mary","Emma","John"]
解释: Mary 最高,其次是 Emma 和 John 。

示例2:

输入: names = ["Alice","Bob","Bob"], heights = [155,185,150]
输出: ["Bob","Alice","Bob"]
解释:第一个 Bob 最高,其次是 Alice和第二个鲍勃。

限制条件:

  • n == names.length == heights.length
  • 1 <= n <= 103
  • 1 <= names[i].length <= 20
  • 1 <= heights[i] <= 105
  • names[i]由小写和大写英文字母组成。
  • 的所有值heights都是不同的。

思路

这道题目并不是一道贪心题,但是可以为下一道贪心题提供思路,这里我们额外建立一个下标数组,相对于身高对下标数组进行排序,最后映射名字输出即可。

代码

class Solution {
public:
    vector<string> sortPeople(vector<string>& names, vector<int>& heights) {
        int n=names.size();
        vector<int> index(n);
        for(int i=0;i<n;i++) index[i]=i;

        sort(index.begin(),index.end(),[&](int i,int j){return heights[i]>heights[j];});

        vector<string> ret;
        for(int i:index) ret.push_back(names[i]);

        return ret;
    }
};

04.优势洗牌

题目链接:https://leetcode.cn/problems/advantage-shuffle/

给定两个长度相等的数组 nums1nums2nums1 相对于 nums2优势可以用满足 nums1[i] > nums2[i] 的索引 i 的数目来描述。

返回 nums1任意排列,使其相对于 nums2 的优势最大化。

示例 1:

输入:nums1 = [2,7,11,15], nums2 = [1,10,4,11]
输出:[2,11,7,15]

示例 2:

输入:nums1 = [12,24,8,32], nums2 = [13,25,32,11]
输出:[24,32,8,12]

提示:

  • 1 <= nums1.length <= 105
  • nums2.length == nums1.length
  • 0 <= nums1[i], nums2[i] <= 109

思路

当己方此时最差的比不过对面最差的时候,让我方最差的去处理掉对面最好的(反正要输,不如去拖掉对面⼀个最强的);
当己方此时最差的能比得上对面最差的时候,就让两者比对下去(最差的都能获胜,为什么要输呢)。
每次决策,都会使我方处于优势

代码

class Solution {
public:
    vector<int> advantageCount(vector<int>& nums1, vector<int>& nums2) {
        int n=nums1.size();
        sort(nums1.begin(),nums1.end());
        vector<int> index(n);
        for(int i=0;i<n;i++) index[i]=i;
        sort(index.begin(),index.end(),[&](int i,int j){return nums2[i]<nums2[j];});

        vector<int> ret(n);
        int left=0,right=n-1;
        for(auto x:nums1){
            if(x>nums2[index[left]]) ret[index[left++]]=x;
            else ret[index[right--]]=x;
        }

        return ret;
    }
};

标签:真题,int,nums,ret,nums1,算法,vector,prices,leetcode
From: https://blog.csdn.net/kingxzq/article/details/136836930

相关文章

  • 标准MD5算法(js实现)
    百度百科MD5functionmd5(string){functionmd5_RotateLeft(lValue,iShiftBits){return(lValue<<iShiftBits)|(lValue>>>(32-iShiftBits));}functionmd5_AddUnsigned(lX,lY){varlX4,lY4,lX8,lY8,lResult;......
  • 代码随想录算法训练营第十四天| 二叉树相关
    二叉树的递归遍历递归三要素:确定递归函数的参数和返回值,确定终止条件,确定单层递归的逻辑144.二叉树的前序遍历https://leetcode.cn/problems/binary-tree-preorder-traversal/description/publicList<Integer>preorderTraversal(TreeNoderoot){List<Integer>......
  • 基于minn算法的OFDM定时同步matlab仿真
    目录1.MMSE定时同步原理2.minn定时同步原理3.matlab核心程序4.仿真结果正交频分复用(OrthogonalFrequencyDivisionMultiplexing,OFDM)是一种多载波传输技术,通过将高速数据流分解到多个正交子载波上进行传输。在接收端,精确的定时同步对于恢复出高质量的数据至关重要,因为它直......
  • 十大排序算法--Java实现
    冒泡排序(BubbleSort)基本思想:冒泡排序是一种简单的排序算法。它重复地遍历要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。遍历数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。算法步骤:从第一个元素开始,比较相邻的元素。......
  • C#,人工智能,机器学习,聚类算法,训练数据集生成算法、软件与源代码
    摘要:本文简述了人工智能的重要分支——机器学习的核心算法之一——聚类算法,并用C#实现了一套完全交互式的、可由用户自由发挥的,适用于聚类算法的训练数据集生成软件——Clustering。用户使用鼠标左键(拖动)即可生成任意形状,任意维度,任意簇数及各种数据范围的训练数据集,同时也可以......
  • C#,深度好文,精致好码,文本对比(Text Compare)算法与源代码
    VladimirI.Levenshtein一、文本对比的列文斯坦距离(编辑距离)算法在日常应用中,文本比较是一个比较常见的问题。文本比较算法也是一个老生常谈的话题。文本比较的核心就是比较两个给定的文本(可以是字节流等)之间的差异。目前,主流的比较文本之间的差异主要有两大类。一类是基......
  • 基于多种优化算法的物联网无人机基站研究【布谷鸟搜索CS、大象群体优化EHO、灰狼优化G
     ......
  • 【神经网络算法】一文搞懂GAN(生成对抗网络)
    本文将从GAN的本质、GAN的原理、GAN架构改进三个方面,带您一文搞懂生成对抗网络GenerativeAdversarialNetworks | GAN。一、GAN的本质GAN架构:GAN(GenerativeAdversarialNetworks,生成对抗网络)架构由两个主要组件构成:生成器(Generator)和判别器(Discriminator)。这两个组件在......
  • 【神经网络算法】一文搞懂Tokenization(分词)
    本文将从分词的本质、中英文分词、分词的方法三个方面,带您一文搞懂Tokenization(分词)。一、分词的本质核心逻辑:将句子、段落、文章这种长文本,分解为以字词为单位的数据结构。文本切分:分词是将连续的文本切分为独立的、有意义的词汇单元的过程。这些词汇单元可以是单词、......
  • me5413算法的实现细节
    Introduction这项作业的目的是让你通过几种基本规划算法及其应用来积累经验。在实施和测试这些算法后,你应该能够了解到规划中的现实挑战以及每种算法的优缺点。Task1:GlobalPlanningForbothTask1&2ofyourplanninghomework,youwillbeusingamapoftheVivoCity......