455. 分發餅乾
題目連結:https://leetcode.cn/problems/assign-cookies/
題目難度:簡單
文章講解:https://programmercarl.com/0455.分發餅乾.html
影片講解:https://www.bilibili.com/video/BV1MM411b7cq
題目狀態:初次有貪心演算法的總體概念,有點懵
思路:
先將餅乾尺寸大的滿足胃口大的小孩,直到遍歷完。
程式碼:
class Solution {
public:
int findContentChildren(vector<int>& g, vector<int>& s) {
sort(g.begin(), g.end());
sort(s.begin(), s.end());
int index = s.size() - 1;
int res = 0;
for(int i = g.size() - 1; i >= 0; --i) {
if(index >= 0 && s[index] >= g[i]) {
res++;
index--;
}
}
return res;
}
};
376. 擺動序列
題目連結:https://leetcode.cn/problems/wiggle-subsequence/
題目難度:中等
文章講解:https://programmercarl.com/0376.擺動序列.html
影片講解:https://www.bilibili.com/video/BV17M411b7NS
題目狀態:貪心好難,只能看題解,自己做一點思路也沒有
思路:
記錄一下每個元素的前後坡度(有正負的),然後判斷前後坡度符號是否一致,如果不一致就加1,如果一致就跳過。
注意:當有平坡出現的時候,只需要記錄一次,並且前坡只有在發生改變的時候在需要變化。
程式碼:
class Solution {
public:
int wiggleMaxLength(vector<int>& nums) {
if(nums.size() == 1) return 1;
int res = 1;
int prediff = 0;
int curdiff = 0;
for(int i = 0; i < nums.size() - 1; ++i) {
curdiff = nums[i + 1] - nums[i];
if((prediff >= 0 && curdiff < 0) ||
(prediff <= 0 && curdiff > 0)) {
res++;
prediff = curdiff;
}
}
return res;
}
};
53. 最大子陣列和
題目連結:https://leetcode.cn/problems/maximum-subarray/
題目難度:中等
文章講解:https://programmercarl.com/0053.最大子序和.html
影片講解:https://www.bilibili.com/video/BV1aY4y1Z7ya
題目狀態:還是學習思路...
思路:
先遍歷前面的和,當前面的和為負數的時候,那個前面所有的內容相加就對後面的元素沒有作用,直接從後面元素開始,一直遍歷結束。期間會記錄所有遍歷的最大值。
程式碼:
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int count = 0;
int res = INT_MIN;
for(int i = 0; i < nums.size(); ++i) {
count += nums[i];
if(count > res) res = count;
if(count <= 0) count = 0;
}
return res;
}
};