題1:
指路:122. 買賣股票的最佳時機 II - 力扣(LeetCode)
思路與代碼:
基本思路:一天買入一天賣出,得到每部分正利潤作為局部最優解,例如prices[7, 1, 5, 3, 6, 4]中,利潤分別為[-6, 4, -2, 3, -2],選取每部分正利潤為從prices[1]買入prices[2]賣出,再從prices[3]買入prices[4]賣出?。本題無須返回具體買入賣出的方法,我們選取每個正利潤即可得到最大利潤并返回。代碼如下:
class Solution {
public:int maxProfit(vector<int>& prices) {int result = 0;for (int i = 1;i < prices.size(); i++) {result += max(prices[i] - prices[i - 1], 0);}return result;}
};
特別的,for循環中i的值從1開始是因為for循環內統計利潤,而第一天買入無利潤,至少第二天才有利潤可言。
題2:
指路:55. 跳躍游戲 - 力扣(LeetCode)
思路與代碼:
從nums[0]開始向后跳,可以跳的步數有0-nums[0]種,這樣討論起來就比較麻煩。換一種方式,我們考慮用覆蓋范圍代替跳躍步數,換言之該元素覆蓋范圍內的元素都可以用。其中每個階段更大的覆蓋范圍是局部最優解。最后得到全局最優解,如果終點在最大覆蓋范圍以內則返回true,否則返回false。代碼如下:
class Solution {
public:bool canJump(vector<int>& nums) {int cover = 0; // 覆蓋位置的下標if (nums.size() == 1) return true;for (int i = 0; i <= cover; i++) { // 在覆蓋范圍內增加下一步的覆蓋范圍cover = max(i + nums[i], cover);if (cover >= nums.size() - 1) return true;}return false;}
};
題3:
指路:45. 跳躍游戲 II - 力扣(LeetCode)
思路與代碼:
基本思路為:每跳一步都盡可能地增大覆蓋范圍,在這里我們記錄當前覆蓋范圍和下一步的覆蓋范圍,在覆蓋范圍內取到較大值,并記錄步數。直到當前節點的覆蓋范圍大于等于數組長度時跳出循環。代碼如下:
class Solution {
public:int jump(vector<int>& nums) {if (nums.size() == 1) return 0;int cur = 0; int next = 0; // 當前和下一步的覆蓋范圍int res = 0;for (int i = 0; i < nums.size(); i++) {next = max(i + nums[i], next);if (i == cur) {if (cur != nums.size() - 1) {res ++;cur = next;if (cur >= nums.size() - 1) break;}else break;}}return res;}
};