贪心day2
1005. K 次取反后最大化的数组和
class Solution {
public int largestSumAfterKNegations(int[] nums, int k) {
Arrays.sort(nums);
int res = 0;
//反转负数 计算总和
int i = 0, min = 0;
for (; i < nums.length; i++) {
//贪心:如果是负数,k还有盈余,把k反过来
if (nums[i] < 0 && k > 0) {
nums[i] = -nums[i];
k--;
}
res += nums[i];
//存最小非负数
if (i != 0) {
min = Math.min(nums[i], min);
} else {
min = nums[i];
}
}
//处理负数处理完k还有奇数盈余的情况 减掉2倍最小正数 因为前面加上了该正数
return res - (k % 2 == 1 ? 2 * min : 0);
}
}
class Solution {
public int canCompleteCircuit(int[] gas, int[] cost) {
int len = gas.length, sum = 0, start = 0, curSum = 0;
//int[] rest = new int[len];
for (int i = 0; i < len; i++) {
//rest[i] = gas[i] - cost[i];
int rest = gas[i] - cost[i];
sum += rest;
curSum += rest;
//如果curSum小于0,那么得到curSum的这一段区间不能作为起点
if (curSum < 0) {
curSum = 0;
start = i + 1;
}
}
//oversubscribed return
if (sum < 0) return -1;
return start;
}
}