贪心算法(Greedy Algorithm)是一种在解决问题时,按照某种标准在每一步都选择当前最优解(局部最优解)的算法。它期望通过一系列局部最优解的选择,最终能够得到全局最优解。
贪心算法的核心思想是每一步都采取最优选择,即所谓的“贪心选择”。算法会根据某种贪心策略,逐步做出局部最优的选择,并希望通过这些局部最优的选择能够得到最终的全局最优解。
贪心算法适用于那些通过选择局部最优解,最终能够得到全局最优解的问题。一般来说,贪心算法并不总是能找到全局最优解,但在某些特定问题中,它可以得到最优解。常见的贪心算法应用场景包括:
优点:
缺点:
初始思路:以每一个数组元素为买入点,找出利润的最大值,时间复杂度是O(n)
优化思路:在遍历的过程中,我们始终选择当前最小的买入价格,并计算卖出的最大可能利润。
初始代码
- public int maxProfit(int[] prices) {
- int n = prices.length;
- int max = 0;
- for (int i = 0; i < n; i++) {
- for(int j=i+1;j
- if(prices[j]>prices[i]){
- max = Math.max(max,prices[j]-prices[i]);
- }
- }
- }
- return max;
- }
优化后的代码
- public int maxProfit(int[] prices) {
- int n = prices.length;
- int max = 0;
- int min = prices[0];
- for (int i = 0; i < n; i++) {
- if(prices[i] < min)
- min = prices[i];
- max = Math.max(max, prices[i] - min);
- }
- return max;
- }
跳跃游戏
题目
思路
- 初始化一个变量 maxReach,表示当前能够到达的最远位置。
- 遍历数组的每一个元素,对于每个元素 nums[i],检查是否可以从当前位置到达更远的位置,即 maxReach 是否大于或等于当前下标 i。
- 在遍历的过程中,不断更新能够到达的最远位置 maxReach 为 i + nums[i]。
- 如果在遍历过程中,某个位置的 maxReach 大于或等于最后一个下标,则返回 true;否则,如果遍历结束仍未达到最后一个下标,则返回 false。
代码
- public boolean canJump(int[] nums) {
- int n = nums.length;
- int max = 0;
- for(int i = 0; i < n; i++) {
- if(i>max){
- return false;
- }
- max = Math.max(max, nums[i] + i);
- if(max>=n-1){
- return true;
- }
- }
- return false;
- }
跳跃游戏Ⅱ
题目
思路
1.定义状态:
- 维护两个变量 curEnd 和 curFarthest:
- curEnd 表示当前跳跃范围的最远边界。
- curFarthest 表示通过当前步能够到达的最远位置。
2.遍历数组:
- 遍历 nums,在每次遍历时,我们会更新 curMax,表示通过当前跳跃可以到达的最远位置。
- 当遍历到 curEnd 时,表示当前跳跃已经完成,必须进行下一次跳跃,并更新 max 为 curMax,跳跃次数加1。
- 最后,如果遍历到了数组的最后一个位置,返回跳跃次数即可。
贪心策略:
- 在每一次跳跃中,我们尽可能向前跳得最远,这样才能保证在最少的跳跃次数内到达数组末尾。
代码
- public int jump(int[] nums) {
- int n = nums.length;
- int max = 0;
- int curMax = 0;
- int sum =0;
- for(int i = 0; i < n; i++) {
- if(i==n-1){
- break;
- }
- curMax = Math.max(curMax, nums[i] + i);
- if(i==max){
- max = curMax;
- sum++;
- }
- }
- return sum;
- }
划分字母区间
题目
思路
- 用一个last数组,记录每个字母出现的最远位置
- 遍历数组,使用start和end记录当前划分字符串的开头和结尾
- 每次不断的更新当前字符串的最远位置
- 当i和end相等,即代表当前字符串划分结束
代码
- public List
partitionLabels(String s) { - List
res = new ArrayList(); - int[] last = new int[26];
-
-
相关阅读:
科目二倒车入库
mybatuis update批量更新
Linux之Vim编辑命令
javascript面向对象完全指北
智慧校园管理系统,精细化+网格化
CI+JUnit5并发单测机制创新实践
flink中配置Rockdb的重要配置项
tomcat出现中文乱码原因和解决办法(简单快捷易懂)
Zookeeper:分布式过程协同技术
Linux常用命令及项目部署
-
原文地址:https://blog.csdn.net/MogulNemenis/article/details/142171306
-
最新文章
-
沪漂五周年了:我越来越迷茫了
Agentic Skill Routing 实战:别再把所有 Skill 塞进 AI Agent 上下文
MySQL-Seconds_behind_master的精度误差
[MAF预定义ChatClient中间件-03]CachingChatClient——利用缓存省钱省时间
AI的至暗历史:从万众期待到被政府撤资,AI的两次死亡徘徊
Agent OS :五种驯服不确定性的范式
PortSwigger SQL注入LAB11
数据库即时编译JIT
[Begin]AI Learn Data Day 0
深度学习进阶(二十七)现代 LLM 的核心架构设计其二:SwiGLU