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

力扣热题之贪心算法

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.dtcms.com/a/344154.html

相关文章:

  • halcon算子—gen_rectangle2和gen_rectangle1区别
  • Java泛型深度解析:从基础语法到高级应用
  • Java 19 新特性及具体应用
  • K8S高可用集群
  • 藏在 K8s 幕后的记忆中枢(etcd)
  • API模型与接口弃用指南:历史、替代方案及开发者应对策略
  • 疏老师-python训练营-Day53 对抗生成网络
  • Linux数字列排序命令
  • 【计算机视觉与深度学习实战】08基于DCT、DFT和DWT的图像变换处理系统设计与实现(有完整代码python3.13可直接粘贴使用)
  • 四十二、【核心功能强化】用例管理与调试:批量删除与在线请求测试
  • 使用EasyExcel自定义导出表格
  • 安全、高效、可靠的物理隔离网络安全专用设备———信刻光盘安全隔离与文件单向导入系统!
  • VLLM部署gpt-oss-20b踩坑记录
  • 集成电路学习:什么是SVM支持向量机
  • 快速了解神经网络
  • DigitalOcean Gradient AI平台现已支持OpenAI gpt-oss
  • 2025年大模型选型核心指南:Beyond GPT-4,如何理性评估Qwen、DeepSeek等强者?
  • TDengine IDMP 应用场景:微电网监控
  • nginx-如何卸载和升级编译安装的版本
  • 深入理解 hash -r:解决 Linux 命令缓存难题的关键密钥
  • 线性回归计算
  • 华为云物联网产品架构解析:资源空间、群组、产品、标签、网关、设备与子设备的关系梳理与设置指南
  • AI重构智慧展馆
  • 【数据分享】中国371个城市的坡度矢量数据和excel数据
  • [react] class Component and function Component
  • Android音频学习(十四)——加载音频设备
  • Mysql InnoDB 底层架构设计、功能、原理、源码系列合集【四、事务引擎核心 - MVCC与锁机制】
  • prompt提示词2
  • 【思考】什么是服务器?什么是服务?什么是部署?
  • MongoDB 完整指南