目录
- 1005.K次取反后最大化的数组和
- 思路
- 代码
- 134. 加油站
- 思路
- 代码
- 135. 分发糖果
- 思路
- 代码
1005.K次取反后最大化的数组和
题目链接:1005.K次取反后最大化的数组和
文档讲解:代码随想录
视频讲解:贪心算法,这不就是常识?还能叫贪心?LeetCode:1005.K次取反后最大化的数组和
思路
思路一: 每次都排序,取反最小值。
思路二: 先按绝对值从大到小排序,然后从前向后遍历,取反所有负数;如果次数还未用完,将最小整数取反即可。
代码
思路一代码
class Solution {
public:int largestSumAfterKNegations(vector<int> &nums, int k) {for (int i = 0; i < k; i++) {sort(nums.begin(), nums.end());nums[0] = -nums[0];}int sum = 0;for (int i = 0; i < nums.size(); i++) {sum += nums[i];}return sum;}
};
思路二代码
class Solution {
public:class cmp {public:bool operator()(const int &a, const int &b) {return abs(a) > abs(b);}};int largestSumAfterKNegations(vector<int> &nums, int k) {sort(nums.begin(), nums.end(), cmp());for (int i = 0; i < nums.size() && k > 0; i++) {if (nums[i] < 0) {nums[i] = -nums[i];k--;}}while (k--) {nums[nums.size() - 1] = -nums[nums.size() - 1];}int sum = 0;for (int i = 0; i < nums.size(); i++) {sum += nums[i];}return sum;}
};
134. 加油站
题目链接:134. 加油站
文档讲解:代码随想录
视频讲解:贪心算法,得这么加油才能跑完全程!LeetCode :134.加油站
思路
如果总油量小于总耗油量,一定跑不了一圈;
如果每天剩油量累加和没有小于过0,则从0开始可以跑一圈;
如果每天剩油量累加和出现小于0的情况,则记录最小值,则从终点向回遍历补充剩油量直至大于等于0,此点为起点。从此起点开始到0的路段剩余油量补充了从0开始到出现剩余油量最小值的路段。
代码
class Solution {
public:int canCompleteCircuit(vector<int> &gas, vector<int> &cost) {int curSum = 0;int min = INT_MAX; // 从起点出发,油箱里的油量最小值for (int i = 0; i < gas.size(); i++) {int rest = gas[i] - cost[i];curSum += rest;if (curSum < min) {min = curSum;}}if (curSum < 0)return -1;if (min >= 0)return 0;for (int i = gas.size() - 1; i >= 0; i--) {int rest = gas[i] - cost[i];min += rest;if (min >= 0) {return i;}}return -1;}
};
135. 分发糖果
题目链接:135. 分发糖果
文档讲解:代码随想录
视频讲解:贪心算法,两者兼顾很容易顾此失彼!LeetCode:135.分发糖果
思路
每次只考虑一边,即两个孩子,先比较左边,然后再比较右边。
从前向后遍历,如果右边孩子得分大于左边孩子,则右边孩子的糖果数为左边孩子糖果数加一;
从后向前遍历,如果左边孩子得分大于右边孩子,则左边孩子的糖果数为自身糖果数与右边孩子糖果数加一两者的较大值。
代码
class Solution {
public:int candy(vector<int> &ratings) {vector<int> candy(ratings.size(), 1);for (int i = 1; i < ratings.size(); i++) {if (ratings[i] > ratings[i - 1])candy[i] = candy[i - 1] + 1;}for (int i = ratings.size() - 2; i >= 0; i--) {if (ratings[i] > ratings[i + 1]) {candy[i] = max(candy[i], candy[i + 1] + 1);}}int result = 0;for (auto n : candy) {result += n;}return result;}
};