力扣面试经典150题,第7(lc121),8(lc122),9(lc55),10(lc45)题
文章目录
- 一、lc121 买卖股票的最佳时机
- 双指针
- 单指针
- 二、lc122 买卖股票的最佳时机2
- 三.lc55 跳跃游戏
- 四.lc45 跳跃游戏2
- 贪心与动规小总结
一、lc121 买卖股票的最佳时机
双指针
按题目要求,低价买,高价卖,买必须在卖前,使用快慢指针,快指针遍历数组,慢指针保存哪一天买,快指针每遍历一个元素就与慢指针表示的元素进行比较,快小就替换,快大就计算获利并与之前的获利比较取max
class Solution {public int maxProfit(int[] prices) {int ans=0;int t=0;for(int i = 1; i<prices.length;i++){if(prices[i]<prices[t]){t=i;}else{ans=Math.max(prices[i]-prices[t],ans);}}return ans;}
}
单指针
还是遍历数组,在第i天卖,只能在0 ~ i-1天买入,先计算获利(即p-minPrice),再计算minPrice
class Solution {public int maxProfit(int[] prices) {int ans = 0;int minPrice = prices[0];for (int p : prices) {ans = Math.max(ans, p - minPrice);minPrice = Math.min(minPrice, p);}return ans;}
}
二、lc122 买卖股票的最佳时机2
典型的动态规划问题,第i天的状态可以由第i-1天的状态递推出来
,具体的状态转移见下图截图来自灵神讲解视频
讲解视频地址
class Solution {public int maxProfit(int[] prices) {int n=prices.length;int[][] dp = new int[n][2];dp[0][0] = 0; //第一天结束时不持有股票收益dp[0][1] = -prices[0]; //第一天结束时持有股票收益for(int i=1;i<n;i++){//遍历并递推每一个状态dp[i][0] = Math.max(dp[i-1][0],dp[i-1][1]+prices[i]);dp[i][1] =Math.max(dp[i-1][1],dp[i-1][0]-prices[i]);}return dp[n-1][0]; //肯定为最后一天不持有股票收益更高}
}
三.lc55 跳跃游戏
使用贪心算法,遍历整个数组,算出每个点可到达的最远距离并取最大值,如果最大值大于等于最后一个下标,返回true,否则返回false。循环退出判断要加i<ma(遇到样例2的情况,无论如何都跳不过下标3)
class Solution {public boolean canJump(int[] nums) {int n = nums.length;int ma=0;for(int i=0;i<=ma && i<n;i++){ma=Math.max(ma,nums[i]+i);}return ma>=n-1;}
}
四.lc45 跳跃游戏2
还是贪心算法,题解来自灵神,搭桥法,在前方无路可走的情况下,搭一座桥,更新此时可到达的最远距离cur_right,具体做法为遍历数组,更新下一座桥能到达的最远距离next_right,如果到了已建造的桥的右端点cur_right,搭一座桥ans++,更新此时能到达的最远距离cur_right
class Solution {public int jump(int[] nums) {int ans = 0;int curRight = 0; // 已建造的桥的右端点int nextRight = 0; // 下一座桥的右端点的最大值for (int i = 0; i < nums.length - 1; i++) {// 遍历的过程中,记录下一座桥的最远点nextRight = Math.max(nextRight, i + nums[i]);if (i == curRight) { // 无路可走,必须建桥curRight = nextRight; // 建桥后,最远可以到达 next_rightans++;}}return ans;}
}作者:灵茶山艾府
链接:https://leetcode.cn/problems/jump-game-ii/solutions/2926993/tu-jie-yi-zhang-tu-miao-dong-tiao-yue-yo-h2d4/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
贪心与动规小总结
在做第3,4题时,首先想到的思路就是动态规划,但写不出来递推式,3,4题动规递推式样式为:dp[i]=???+nums[i],但找到i状态的前一个状态还需要额外的算法,不如直接使用贪心