LeetCode 1005K次取反后最大化的数组和
题目链接:1005.K次取反后最大化的数组和
- 将数组按照绝对值从大到小排序(代码、思路简洁的关键一步!!)
- 从前向后遍历数组,k>0时操作将负数变为正数
- 遍历完数组后k依然大于0
- k为偶数:无需处理
- k为奇数:只需将最小数变为相反数即可
- 求和
class Solution {
public:
bool static cmp(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(); ++i) {
if (k == 0) break;
if (k > 0 && nums[i] < 0) {
nums[i] *= -1;
k--;
}
}
if (k % 2 == 1) nums[nums.size() - 1] *= -1;
int ans = 0;
for (int num : nums) {
ans += num;
}
return ans;
}
};
LeetCode 134加油站
题目链接:134.加油站
- 直接考虑全局最优。很巧妙,对我来讲不好想
class Solution {
public:
int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
int minSum = INT_MAX, curSum = 0;
for (int i = 0; i < gas.size(); ++i) {//将0作为起点遍历
int rest = gas[i] - cost[i];
curSum += rest;
if (curSum < minSum) minSum = curSum;
}
if (curSum < 0) return -1;//gas总和小于cost总和
if (minSum >= 0) return 0;//说明从0开始走,每一步的累加和都>=0,可以绕路行驶一周
//else 一定能绕路一周,但0只是中间路过的一站,只要前面累加的油量够0及之后的"负债=minSum"油量就行
int ans = 0;
for (int i = gas.size() - 1; i >= 0; --i) {
int rest = gas[i] - cost[i];
minSum += rest;
if (minSum >= 0) {
ans = i;
break;
}
}
return ans;
}
};
- 贪心。也很绝的想法
class Solution {
public:
int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
int curSum = 0, totalSum = 0;
int start = 0;
for (int i = 0; i < gas.size(); ++i) {
int rest = gas[i] - cost[i];
curSum += rest;
totalSum += rest;
if (curSum < 0) {//累加和小于0,说明[0,i]区间内的加油站都不可能成为起点
curSum = 0;
start = i + 1;//局部最优:起始位置至少是i+1
}
}
if (totalSum < 0) return -1;
return start;
}
};
LeetCode 135分发糖果
题目链接:135.分发糖果
- 两次贪心
class Solution {
public:
int candy(vector<int>& ratings) {
int ans = ratings.size();
vector<int> dp(ratings.size(), 0);
for (int i = 1; i < ratings.size(); ++i) {
if (ratings[i] > ratings[i - 1]) dp[i] = dp[i - 1] + 1;
ans += dp[i];//可以最后求和的结果
}
for (int i = ratings.size() - 2; i >= 0; --i) {
if (ratings[i] > ratings[i + 1] && dp[i] <= dp[i + 1]) {
ans -= dp[i];//就不用这样先减再加了
dp[i] = dp[i + 1] + 1;
ans += dp[i];
}
}
return ans;
}
};