122.買賣股票的最佳時機II
題目連結 文章講解 影片講解
思路:
每次記錄當天的股票價格,如果下一天比今天的價錢高那麼今天就買,這樣保證每一次買股票都是賺的
否則記錄下一天的股票,因為下一天的股票比今天的便宜,下一天買比今天買划算
class Solution {
public:
int maxProfit(vector<int>& prices) {
if(prices.size() <= 1) return 0;
// 記錄當天的股價
int cur = prices[0];
int profit = 0;
for(int i = 1; i < prices.size(); ++i) {
// 如果能賺則買入
if(prices[i] > cur) profit = profit + prices[i] - cur;
// 否則將當前股價更新為下一天的股價
cur = prices[i];
}
return profit;
}
};
55.跳躍遊戲
題目連結 文章講解 影片講解
方法一
如果下一跳比當前值大則更新為下一跳的值
每次迴圈跳數減一,最後能夠到達陣列組後一個元素返回true,否則返回false
class Solution {
public:
bool canJump(vector<int>& nums) {
int pre = nums[0];
if(pre == 0 && nums.size() != 1) return false;
for(int i = 1; i < nums.size(); ++i) {
if(--pre < nums[i]) pre = nums[i];
if(pre == 0 && i != nums.size() - 1) return false;
}
return true;
}
};
方法二
如果當前覆蓋範圍加上當前位置能夠覆蓋整個陣列則返回true,否則返回false
class Solution {
public:
bool canJump(vector<int>& nums) {
int cover = 0;
if(nums.size() == 1) return false;
for(int i = 0; i <= cover; ++i) {
cover = max(cover, nums[i] + i);
if(cover >= nums.size() - 1) return true;
}
return false;
}
};
45.跳躍遊戲II
題目連結 文章講解 影片講解
思路:cover記錄當前覆蓋範圍,maxCover記錄最大覆蓋範圍
每當i到達當前範圍時,將cover更新為maxCover,步數加一
如果當前範圍覆蓋到陣列最後一個元素,結束返回步數
class Solution {
public:
int jump(vector<int>& nums) {
if(nums.size() == 1) return 0;
int cover = 0;
int maxCover = 0;
int times = 0;
for(int i = 0; i < nums.size(); ++i) {
maxCover = max(maxCover, nums[i] + i);
if(i == cover) {
cover = maxCover;
times++;
}
if(cover >= nums.size() - 1) break;
}
return times;
}
};