455.分發餅乾
題目連結 文章講解 影片講解
class Solution {
public:
int findContentChildren(vector<int>& g, vector<int>& s) {
sort(g.begin(), g.end());
sort(s.begin(), s.end());
int index = 0;
// 從最小的餅乾開始遍歷
for(int i = 0; i < s.size(); ++i) {
// 儘量選取胃口小的小朋友,如果滿足那麼進行到下一個小朋友(++index)
if(index < g.size() && g[index] <= s[i]) {
++index;
}
// 如果不滿,選取下一塊更大的餅乾
}
return index;
}
};
376.擺動序列
題目連結 文章講解 影片講解
思路:
如果nums.size() == 1; 則返回1
找到第一組差值不為0的元素,如果全部差值均為0,返回1
否則初始化length和maxLength為2(因為已經有一組差值不為0的元素,所以初始化為2)
如果當前差值和前一個差值相乘為負數則length++更新maxLength
否則跳過,繼續迴圈;
class Solution {
public:
int wiggleMaxLength(vector<int>& nums) {
if(nums.size() == 1) return 1;
// 記錄前一個差值
int pre;
// 記錄第一個插值不為0的起始位置
int startIndex = 1;
// 從第一個插值不為零的地方開始
for(; startIndex < nums.size(); ++startIndex) {
if(pre = nums[startIndex] - nums[startIndex - 1]) break;
}
// 如果插值全部為零,則返回1
if(startIndex == nums.size()) return 1;
int length = 2;
int maxLength = 2;
for(int i = startIndex; i < nums.size(); ++i) {
int temp = nums[i] - nums[i - 1];
// 前一個差值和後一個差值相乘為負數則說明是擺動序列
if(temp * pre < 0) {
length++;
if(length > maxLength) maxLength = length;
pre = temp;
}
// 如果不是擺動的則直接跳過
}
return maxLength;
}
};
53.最大子陣列和
題目連結 文章講解 影片講解
思路:如果連續和為負數的話,直接從下一個數開始,因為此時 連續和 + 當前值 < 當前值;所以將連續和置為當前值,繼續累加
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int maxSum = INT_MIN;
// 記錄連續和
int sum = 0;
for(int i = 0; i < nums.size(); ++i) {
// 如果連續和小於0則,重新開始記錄
if(sum < 0) sum = 0;
sum += nums[i];
maxSum = max(sum, maxSum);
}
return maxSum;
}
};