贪心算法总结(2)

news2024/11/26 19:36:53

一、买卖股票的最佳时机

. - 力扣(LeetCode)

class Solution {
public:
    int maxProfit(vector<int>& prices) 
    {
       int mini=INT_MAX;
       int ret=0;
       for(int&price:prices)
       {
        //遍历的时候,我们随时去更新最小的值,然后让每一位数都来-最小值 更新利润,这里不能直接用最大值
        //因为最大值可能在最小值的左边
        ret=max(ret,price-mini);
        mini=min(price,mini);
       }
       return ret;
    }
};

二、买卖股票的最佳时机II 

. - 力扣(LeetCode)

解法1:双指针(重点掌握)

class Solution {
public:
    int maxProfit(vector<int>& p) {
       //只要是正收益 就交易 //双指针+贪心
        int ret=0,n=p.size();
        for(int i=0,j=0;i<n;)
        {
            while(j+1<n&&p[j+1]>p[j]) ++j;
            ret+=p[j]-p[i];
            ++j,i=j;
        }
        return ret;
    }
};

解法2:拆分交易

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

 解法3:动态规划

class Solution {
public:
    int maxProfit(vector<int>& prices)
    {
       //有两种状态,第i天结束处于买入状态(手上有股票,可卖)     第i天结束后处于交易状态(手上没有股票,可以买
      int n=prices.size();
      //创建两个dp表
      vector<int> f(n);//第i天结束后处于买入状态
      //情况1,前一天处于买入状态,啥也没干,还是处于买入状态f[i]=f[i-1]
      //情况2,前一天卖过,然后今天刚买     f[i]=g[i-1]-prices[i]
       auto g=f;//第i天结束后处于交易状态
       //情况1,前一天还是可交易状态,啥也没干 g[i]=g[i-1]
       //情况2.前一天处于买入状态,今天刚卖出一只股票,外加手续费 g[i]=f[i-1]+prices[i]-fee
       //初始化,
       f[0]=-prices[0];
       for(int i=1;i<n;++i)
       {
        f[i]=max(f[i-1],g[i-1]-prices[i]);
        g[i]=max(g[i-1],f[i-1]+prices[i]);
       }
       return g[n-1];
    }
};

三、K次取反后的最大化数组和

. - 力扣(LeetCode)

class Solution {
public:
    int largestSumAfterKNegations(vector<int>& nums, int k) {
         //分类讨论 m表示负数的个数 
         //当m<=k 把前k大的负数都变成正数即可
         //m>k 时 先把所有的负数变成正数,然后看看k是奇数还是偶数
         //如果是偶数,直接返回总和,如果是奇数,还需要挑选最小的那个数进行取反
         int m=0,n=nums.size();
         for(auto e:nums) if(e<0) ++m;
         //开始进行分类讨论
         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
         {
            int mini=INT_MAX;
            for(auto e:nums)
            {
                ret+=abs(e);
                mini=min(mini,abs(e));
            }
            if((k-m)%2) ret-=2*mini;
         }
         return ret;
    }
};

四、按身高排序(下标数组排序)

. - 力扣(LeetCode)

解法2:哈希存下标映射

class Solution {
public:
    vector<string> sortPeople(vector<string>& names, vector<int>& h) {
        //解法1 创建一个新的二元数组,将身高和名字绑定,然后按照身高排序,再提取回来
        int n=names.size();
        map<int,string,greater<int>> hash;
        for(int i=0;i<n;++i)  hash[h[i]]=names[i];
        //然后提取出来
        vector<string> ret;
        ret.reserve(n);
        for(auto kv:hash) ret.emplace_back(kv.second);
        return ret; 
    }
};

解法3:对下标排序(重要技巧)

class Solution {
public:
    vector<string> sortPeople(vector<string>& names, vector<int>& h) {
         //解法2 创建一个下标数组 对下标数组进行排序 然后找到原数组的信息
         int n=names.size();
         vector<int> index(n);
         for(int i=0;i<n;++i) index[i]=i;
         sort(index.begin(),index.end(),[&h](int i,int j){
                       return h[i]>h[j];
         });
         vector<string> ret(n);
         for(int i=0;i<n;++i)
            ret[i]=names[index[i]];
         return ret;
    }
};

五、优势洗牌(田忌赛马策略)

. - 力扣(LeetCode)

class Solution {
public:
    //如果比得过,就比,如果比不过 就干掉最强的那个
    vector<int> advantageCount(vector<int>& nums1, vector<int>& nums2) {
        //对nums1进行升序排序 对nums2进行下标的排序
        int n=nums1.size();
        sort(nums1.begin(),nums1.end());
        vector<int> index(n);
        iota(index.begin(), index.end(),0); //用val的连续++初始化
        sort(index.begin(),index.end(),[&nums2](const int&i,const int&j){
                  return nums2[i]<nums2[j];
        });
        //然后进行赛马 //用nums2存储最后的结果
        int left=0,right=n-1;
        for(auto&x:nums1)
            if(x>nums2[index[left]]) nums2[index[left++]]=x;   //如果我比你大 我就超越你
            else nums2[index[right--]]=x;
        return nums2;
        //交换论证法 更经常用的原因是  最优解可能是有多个的,所以我们可以把最优解调整成贪心解
    }
};

六、分发饼干

. - 力扣(LeetCode)

class Solution {
public:
    int findContentChildren(vector<int>& g, vector<int>& s) {
       //先排序 满足的直接喂 不满足的就看看下一个孩子
       sort(g.begin(),g.end());
       sort(s.begin(),s.end());
       //双指针 
       int ret=0,n1=g.size(),n2=s.size();
       for(int i=0,j=0;i<n1&&j<n2;++i,++j)
       {
         //找饼干
         while(j<n2&&s[j]<g[i]) ++j;
         if(j<n2) ++ret;
       }
       return ret;
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1952447.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AI音乐大模型背后的技术突破、版权诉讼和资本蛋糕

音乐&#xff0c;对你来说&#xff0c;是什么&#xff1f; 音乐对于我们中的许多人来说&#xff0c;是生活中不可或缺的一部分。它不仅仅是娱乐&#xff0c;更是一种情感的表达和交流方式。音乐是一种语言&#xff0c;可以用来表达感受&#xff0c;描绘作曲家想要传达的某种情…

fatal: refusing to merge unrelated histories

出现本地仓库和远程仓库的代码合并不兼容问题&#xff0c;解决方法&#xff1a; 添加--allow-unrelated-histories&#xff0c;让git允许提交不关联的历史代码。 成功提交&#xff1a;

云计算概念以及与云服务的区别

1.云的概念 1.1 什么是云&#xff1f; “云”在计算机科学和信息技术领域通常指“云计算”&#xff0c;即通过互联网提供计算资源&#xff08;如服务器、存储、数据库、网络、软件、分析等&#xff09;的模式。用户可以按需访问和使用这些资源&#xff0c;而无需管理和维护实际…

抓包工具——wireshark的使用

​ 什么是wireshark wireshark是一个数据包捕捉程序。和linux下的tcpdump&#xff0c;以及sniffer&#xff0c;Fidder等软件功能类似。按理说&#xff0c;我们的计算机中的网卡设备只会将发给本机的数据包传输到上层进行解析&#xff0c;而其他的数据包会进行丢弃&#xff0c;…

Bert文本分类和命名实体的模型架构剖析

文章目录 介绍Bert模型架构损失计算方式BertForSequenceClassificationBertForTokenClassification Bert 输出结果剖析例子 参考资料 介绍 文本分类&#xff1a;给一句文本分类&#xff1b; 实体识别&#xff1a;从一句文本中&#xff0c;识别出其中的实体&#xff1b; 做命名…

万界星空科技灯具行业MES系统:点亮生产管理的未来

在快速迭代的灯具行业中&#xff0c;高效、精准的生产管理是企业保持竞争力的关键。万界星空科技推出的灯具行业MES&#xff08;制造执行系统&#xff09;系统&#xff0c;以其强大的功能和完善的管理体系&#xff0c;正成为众多灯具生产企业的首选解决方案。本文将重点介绍万界…

构建高并发Web服务:Gunicorn与Flask在Docker中的完美融合

1. 引言 在数字化时代&#xff0c;Web服务的性能和可靠性对于任何在线业务的成功至关重要。随着用户基数的增长和业务需求的扩展&#xff0c;高并发处理能力成为了衡量一个Web服务质量的关键指标。高并发Web服务不仅能够确保用户体验的流畅性&#xff0c;还能在流量激增时保持…

抖音矩阵管理系统开发:全面解析与推荐

在数字时代&#xff0c;短视频平台如抖音已经成为人们生活中不可或缺的一部分。随着内容创作者数量的激增&#xff0c;如何高效地管理多个抖音账号&#xff0c;实现内容矩阵化运营&#xff0c;成为了众多创作者关注的焦点。今天&#xff0c;我们就来全面解析抖音矩阵管理系统的…

Android 生成Excel并导出全流程

前言 最近接到需求&#xff0c;要在安卓上离线完成根据数据生成Excel文件&#xff0c;但搜到了都不是能立马使用 例如 // implementation org.apache.poi:poi:3.17 // implementation com.alibaba:easyexcel:4.0.1 这两最大的问题是专用于java的&#xff0c;如果And…

【SpringBoot】7 数据库(MySQLMyBatis)

MySQL 前提&#xff1a;本地有安装 MySQL 。 连接 使用工具 Navicat Premium &#xff0c;或者 IDEA 自带的 DB 工具&#xff0c;或者其他能连接 MySQL 数据库的工具都可以。 1&#xff09;创建 MySQL Data Source 2&#xff09;根据本地配置连接上 MySQL&#xff0c;点击…

移动UI:排行榜单页面如何设计,从这五点入手,附示例。

移动UI的排行榜单页面设计需要考虑以下几个方面&#xff1a; 1. 页面布局&#xff1a; 排行榜单页面的布局应该清晰明了&#xff0c;可以采用列表的形式展示排行榜内容&#xff0c;同时考虑到移动设备的屏幕大小&#xff0c;应该设计合理的滚动和分页机制&#xff0c;确保用户…

Android 软键盘挡住输入框

Android原生输入法软键盘挡住输入框,网上各种解法,但不起效。 输入框都是被挡住了,第二张图的小点,实际就是输入法的光标。 解法: packages\inputmethods\LatinIME\java\res\values-land config.xml <!-- <fraction name="config_min_keyboard_height"&g…

2024年国际高校数学建模大赛(IMMCHE)问题A:金字塔石的运输成品文章分享(仅供学习)

2024 International Mathematics Molding Contest for Higher Education Problem A: Transportation of Pyramid Stones&#xff08;2024年国际高校数学建模大赛&#xff08;IMMCHE&#xff09;问题A&#xff1a;金字塔石的运输&#xff09; 古埃及金字塔石材运输优化模型研究…

【单片机毕业设计选题24084】-基于嵌入式的16位AD采集系统设计

系统功能: 系统上电后显示“欢迎使用数模转换系统请稍后”后两秒后进入正常显示。 第一行显示ADS1115第一通道采集到的电压值 第二行显示ADS1115第二通道采集到的电压值 第一行显示ADS1115第三通道采集到的电压值 第二行显示ADS1115第四通道采集到的电压值 手动调节四个电…

【产品应用】一体化伺服电机在AGV小车中的应用

随着自动化技术的快速发展&#xff0c;自动引导车&#xff08;AGV&#xff0c;Automated Guided Vehicle&#xff09;在物流、仓储和生产等领域的应用日益广泛。 作为智能物流体系中的重要设备&#xff0c;AGV小车通过先进的控制技术、传感器技术和导航系统&#xff0c;实现了…

潜水通信定位系统的功能概述_鼎跃安全

水域救援是一项极具挑战性的救援行动&#xff0c;其特点鲜明&#xff0c;集突发性、时间敏感性、技术精密性、难度系数高及潜在危险性之大成。这类救援任务往往要求在极短的时间内迅速响应&#xff0c;面对复杂多变的水域环境&#xff0c;救援人员必须具备高超的专业技能和冷静…

23万一张的天价卡牌,如何撑起一个港股IPO?

23万&#xff0c;可以买到什么&#xff1f; 是拿下一辆涨价后的宝马i3&#xff1f;还是在三线城市全款盘下一套房&#xff1f;又或是来一次环球旅行&#xff1f;这些都已经过时了&#xff0c;对于现在的年轻人来说&#xff0c;他们或许会选择拿这些钱去二手市场&#xff0c;收…

pycharm关闭项目时,页面卡住了,怎么办?

问题 在关闭pycharm时&#xff0c;有时会遇到卡在退出进度条的界面&#xff0c;很讨厌&#xff0c;那我们要怎么办才能退出呢&#xff1f; 说明&#xff1a;本篇文章不是从根源上解决这个问题&#xff0c;无法避免这种情况。 解决方法 方法一&#xff1a; 在卡住时&#xf…

Golang | Leetcode Golang题解之第287题寻找重复数

题目&#xff1a; 题解&#xff1a; func findDuplicate(nums []int) int {slow, fast : 0, 0for slow, fast nums[slow], nums[nums[fast]]; slow ! fast; slow, fast nums[slow], nums[nums[fast]] { }slow 0for slow ! fast {slow nums[slow]fast nums[fast]}return s…

STM32-寄存器时钟配置指南

目录 启动 SystemInit SetSysClock 总结 启动 从startup_stm32f0xx.s内的开头的Description可以看到 ;* Description : STM32F051 devices vector table for EWARM toolchain. ;* This module performs: ;* - Set the in…