第八章 贪心算法 part03
今日任务: 1005.K次取反后最大化的数组和 ; 134. 加油站;135. 分发糖果
卡哥建议:
重点:
参考链接:代码随想录:代码随想录 (programmercarl.com)
补充:
1005.K次取反后最大化的数组和
题目讲解(全):代码随想录
题目建议:本题简单一些,估计大家不用想着贪心 ,用自己直觉也会有思路。
刷题链接:力扣题目链接
class Solution {
public:
static bool comp(int a,int b){
return abs(a)>abs(b);
}
int largestSumAfterKNegations(vector<int>& nums, int k) {
int result = 0;
sort(nums.begin(),nums.end(),comp);
for(int i=0;i<nums.size();++i){
if(nums[i]<0 && k>0){
nums[i] *= -1;
k--;
}
}
if(k % 2 == 1){
nums[nums.size()-1] *= -1;
}
for(int a : nums){
result += a;
}
return result;
}
};
视频讲解:贪心算法,这不就是常识?还能叫贪心?LeetCode:1005.K次取反后最大化的数组和
看到题目的第一思路:
看完代码随想录之后的想法:
自己实现过程中遇到哪些困难:
每日精华:
类似题目:
134. 加油站
题目讲解(全):代码随想录
题目建议:本题有点难度,不太好想,推荐大家熟悉一下方法二
刷题链接:力扣题目链接
暴力解法
class Solution {
public:
int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
//暴力解法
for(int i=0;i<gas.size();++i){
int next=(i+1)%gas.size();//下一位置
int rest = gas[i]-cost[i];//剩余油量
//按道理是需要等于0;但是一旦等于零可以走玩,那么此题答案不唯一将会与原文相违背--造成错误
//从i出发,是否可以走完一圈
while(rest>0 && next!=i){//在剩余油量大于0情况下走到i位置为一圈
rest+= gas[next]-cost[next];//看下一步能否大于0
next = (next+1)%gas.size();//前进
}
if(rest >= 0 && next == i)return i;
}
return -1;
}
};
全局贪心
class Solution {
public:
int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
int curSum = 0;
int min = INT_MAX;
int a=-1;
for(int i=0;i<gas.size();++i){
int rest =gas[i]-cost[i];
curSum += rest;
if(curSum< min){
min = curSum;
a = i+1;
}
}
if(curSum<0)return -1;
if(min>=0)return 0;
// for(int i=cost.size()-1;i>=0;--i){
// int rest = gas[i] - cost[i];
// min += rest;
// if(min >= 0){
// return i;
// }
// }
return a;
}
};
正解贪心
class Solution {
public:
int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
int curSum = 0;
int totalSum = 0;
int start = 0;
for (int i = 0; i < gas.size(); i++) {
curSum += gas[i] - cost[i];
totalSum += gas[i] - cost[i];
if (curSum < 0) { // 当前累加rest[i]和 curSum一旦小于0
start = i + 1; // 起始位置更新为i+1
curSum = 0; // curSum从0开始
}
}
if (totalSum < 0) return -1; // 说明怎么走都不可能跑一圈了
return start;
}
};
视频讲解:贪心算法,得这么加油才能跑完全程!LeetCode :134.加油站
看到题目的第一思路:
看完代码随想录之后的想法:
自己实现过程中遇到哪些困难:
每日精华:
类似题目:
135. 分发糖果
题目讲解(全):代码随想录
题目建议:本题涉及到一个思想,就是想处理好一边再处理另一边,不要两边想着一起兼顾,后面还会有题目用到这个思路
刷题链接:力扣题目链接
class Solution {
public:
int candy(vector<int>& ratings) {
//设置糖果数组
vector<int> candyVec(ratings.size(),1);
//先顾左边
for(int i=1;i<ratings.size();++i){
if(ratings[i] > ratings[i-1]){
candyVec[i]=candyVec[i-1]+1;
}
}
//看右边
for(int i=candyVec.size()-2;i >= 0; --i){
if(ratings[i] > ratings[i+1]){
candyVec[i]=max(candyVec[i+1]+1,candyVec[i]);
}
}
//统计
int result =0;
for(int i=0;i<candyVec.size();++i){
result += candyVec[i];
}
return result;
}
};
视频讲解:贪心算法,两者兼顾很容易顾此失彼!LeetCode:135.分发糖果
看到题目的第一思路:
看完代码随想录之后的想法:
自己实现过程中遇到哪些困难:
每日精华:
类似题目:
今日收获,记录一下自己的学习时长:
优质文章:学习参考: