LeetCode122. 买卖股票的最佳时机 II
题目链接:122. 买卖股票的最佳时机 II - 力扣(LeetCode)
文章讲解:代码随想录
视频讲解:贪心算法也能解决股票问题!LeetCode:122.买卖股票最佳时机II_哔哩哔哩_bilibili
思路:一道非常简单的题目,我们把相邻两天的差价作为利润,发现这个利润有正有负,我们只需要收集正利润,所有的正利润的综合就是这题所求的最大利润。
代码:
class Solution {
public:
int maxProfit(vector<int>& prices) {
int profit=0;
int result=0;
for(int i=0;i<prices.size()-1;i++){
profit=prices[i+1]-prices[i];
if(profit>0){
result+=profit;
}
}
return result;
}
};
LeetCode55. 跳跃游戏
题目链接:55. 跳跃游戏 - 力扣(LeetCode)
文章讲解:代码随想录
视频讲解:贪心算法,怎么跳跃不重要,关键在覆盖范围 | LeetCode:55.跳跃游戏_哔哩哔哩_bilibili
思路:我们把每个数字的值看做一个cover的范围,也就是说这个数的之后几个数在这个cover的范围内,然后我们以i<=cover为限制,在循环内尝试扩大cover的范围,然后我们最后看cover的范围有没有覆盖最后一个数。
代码:
class Solution {
public:
bool canJump(vector<int>& nums) {
int cover=0;
for(int i=0;i<=cover;i++){
cover=max(cover,i+nums[i]);
if(cover>=nums.size()-1){
return true;
}
}
return false;
}
};
LeetCode45. 跳跃游戏 II
题目链接:45. 跳跃游戏 II - 力扣(LeetCode)
文章讲解:代码随想录
视频讲解:贪心算法,最少跳几步还得看覆盖范围 | LeetCode: 45.跳跃游戏II_哔哩哔哩_bilibili
思路:这道题可以想成从后向前,我们先计最后一个的位置为index,然后我们找离得最远的能跳到这个点的点,找到了就另index=i,同时跳跃次数+1,直到回到第一个点。
代码:
class Solution {
public:
int jump(vector<int>& nums) {
int index=nums.size()-1;
int result=0;
while(index>0){
for(int i=0;i<index;i++){
if(i+nums[i]>=index){
index=i;
result++;
}
}
}
return result;
}
};
LeetCode1005. K次取反后最大化的数组和
题目链接:1005. K 次取反后最大化的数组和 - 力扣(LeetCode)
文章讲解:代码随想录
视频讲解:贪心算法,这不就是常识?还能叫贪心?LeetCode:1005.K次取反后最大化的数组和_哔哩哔哩_bilibili
思路:先排序,这时候需要分类讨论,如果翻转次数比负数的个数少或者等于,那么就翻转前k个比较小的负数(因为翻转之后更大),如果翻转次数比负数次数多,那么我们就先翻转所有负数,然后再排序,如果剩余次数是奇数,那么就把最小的数再翻转一次,如果是偶数则不用操作。
代码:
class Solution {
public:
int largestSumAfterKNegations(vector<int>& nums, int k) {
sort(nums.begin(),nums.end());
int count=0;
int result=0;
for(int i=0;i<nums.size();i++){
if(nums[i]<0){
count++;
}
}
if(k<=count){
for(int i=0;i<k;i++){
nums[i]=-nums[i];
}
}
else{
for(int i=0;i<count;i++){
nums[i]=-nums[i];
}
sort(nums.begin(),nums.end());
if((k-count)%2==1){
nums[0]=-nums[0];
}
}
for(int i=0;i<nums.size();i++){
result+=nums[i];
}
return result;
}
};