当前位置: 首页 > backend >正文

力扣热题之贪心算法

1.买卖股票

最终还是选择了贪心

class Solution {
public:int maxProfit(vector<int>& prices) {if(prices.size()==1) return 0;vector<int> gap;for(int i=1;i<prices.size();i++) gap.push_back(prices[i]-prices[i-1]);vector<int> dp(gap.size(),0);dp[0]=gap[0];for(int i=1;i<dp.size();i++)dp[i]=max(dp[i-1]+gap[i],gap[i]);return *max_element(dp.begin(),dp.end())>0?*max_element(dp.begin(),dp.end()):0;}
};

2.跳跃游戏

也是比较简单,每一步都选跳的最远的,i+step[i]取最大,因为这样可选择的范围最大。

(1)稍等, 我发现deepseek给出的一个更简洁的贪心简直是神。。O(N)的算法,就是一遍过去,维护一个最远可达距离,你要是遍历索引的时候超过了,就说明不可达

class Solution {
public:bool canJump(vector<int>& nums) {int maxReach=0;for(int i=0;i<nums.size();i++){if(i>maxReach) return false;//指针根本不可能移动到这里来maxReach=max(maxReach,i+nums[i]);if(maxReach>=nums.size()-1) return true;}return true;}
};

(2)还有神,逆序遍历。逆序遍历,只有在当前的数大于步数的时候才能实现跳跃,实现以后将步数重置

let step = 1for (let i = nums.length - 2; i >= 0; i--) {if (nums[i] < step) {step++} else {step = 1}
}return step === 1

3.跳跃游戏2

(1)动规

class Solution {
public:int jump(vector<int>& nums) {int n=nums.size();vector<int> dp(n,INT_MAX);dp[0]=0;for(int i=0;i<nums.size();i++){int x=nums[i];for(int j=0;j<=x;j++){if(i+j<n) dp[i+j]=min(dp[i+j],dp[i]+1);}}return dp[n-1];}
};

(2)贪心

class Solution {
public:int jump(vector<int>& nums) {if(nums.size()==1) return 0;int count=0;int now=0;//右区间int next=0;//下一次可能到达的右区间for(int i=0;i<nums.size()-1;i++){next=max(next,i+nums[i]);if(i==now){count++;now=next;}if(now>=nums.size()-1) return count;}return count;}
};

必须过拟合,才能应用到其他的

4.字母区间划分

跟上一题有相似的地方,也有不相似的地方,我觉得就是,end不是跳出来的,不用i+,或者说用滑动窗口更好理解

class Solution {
public:vector<int> partitionLabels(string s) {vector<int> lastOccur(26, -1);// 记录每个字符最后出现的位置for (int i = 0; i < s.size(); i++) {lastOccur[s[i] - 'a'] = i;}vector<int> result;int start = 0;  // 当前分段的起始位置int end = 0;    // 当前分段的最远结束位置for (int i = 0; i < s.size(); i++) {// 关键修正:这里应该是 lastOccur[s[i]-'a'],不是 i + lastOccur[...]end = max(end, lastOccur[s[i] - 'a']);// 如果到达当前分段的边界if (i == end) {result.push_back(end - start + 1);  // 直接存储分段长度start = end + 1;  // 更新下一个分段的起始位置}}return result;}
};

好难。。。我不会贪心算法。。。

http://www.xdnf.cn/news/18376.html

相关文章:

  • Python 办公自动化实战:Excel 批量处理 + 自动发邮件
  • VsCode 上的Opencv(C++)环境配置(Linux)
  • 51单片机-中断系统
  • Ansys Motor-CAD:概述(EMag、THERM、LAB、MECH)
  • 171-基于Flask的笔记本电脑数据可视化分析系统
  • Linux数字列排序命令
  • Apache Ozone 介绍与部署使用(最新版2.0.0)
  • 大数据毕业设计推荐:基于Hadoop+Spark的手机信息分析系统完整方案
  • Matrix-Zero:昆仑万维发布的AI世界模型,支持单张图生成3D世界
  • 微信小程序,事件总线(Event Bus) 实现
  • 不同类型代理 IP 在爬虫场景下的表现对比
  • 05 ODS层(Operation Data Store)
  • 集成电路学习:什么是Camera Calibration相机标定
  • 【自用】JavaSE--网络通信
  • 电脑芯片其实更偏向MPU不是CPU,GPU CPU NPU MPU MCU的区别
  • 近端策略优化算法PPO的核心概念和PyTorch实现详解
  • ElasticSearch——常用命令
  • 数据结构-HashSet
  • Android auncher3实现简单的负一屏功能
  • 基于SpringBoot的宠物用品系统【2026最新】
  • Android面试指南(四)
  • AI研究引擎的简单技术实现步骤
  • [软件开发技术栈]从MVVM到MVC
  • 机器学习5
  • Linux入门DAY29
  • (19)python复杂度计算:在线AI(时间复杂)和本地工具(圈复杂度)
  • 什么是Qoder?如何下载?如何体验?Qoder和其他 AI IDE 什么区别?
  • 7.Shell脚本修炼手册---awk基础入门版
  • NewsNow搭建喂饭级教程
  • Java实战:深度解析SQL中的表与字段信息(支持子查询、连接查询)