第八章 贪心算法 part03
大纲
● 1005.K次取反后最大化的数组和
● 134. 加油站
● 135. 分发糖果
leetcode 1005
K次取反后最大化的数组和
class Solution {
public int largestSumAfterKNegations(int[] nums, int k) {
nums = IntStream.of(nums).boxed()
.sorted( (a, b) ->Math.abs(b) - Math.abs(a))
.mapToInt(Integer::intValue).toArray();
int len = nums.length;
for (int i = 0; i < len; i++) {
if (nums[i] < 0 && k > 0) {
nums[i] = -nums[i];
k--;
}
}
if (k % 2 == 1) nums[len - 1] = -nums[len - 1];
int res = 0;
for (int i : nums) res += i;
return res;
}
}
leetcode 134
加油站
class Solution {
public int canCompleteCircuit(int[] gas, int[] cost) {
int rest = 0, sum = 0, start = 0;
for (int i = 0; i < gas.length; i++) {
rest += gas[i] - cost[i];
sum += gas[i] - cost[i];
if (rest < 0) {
start = i + 1;
rest = 0;
}
}
if (sum < 0) return -1;
return start;
}
}
leetcode 135
分发糖果
class Solution {
public int candy(int[] ratings) {
int n = ratings.length;
int[] candy = new int[n];
candy[0] = 1;
for (int i = 1; i < n; i++) candy[i] = ratings[i] > ratings[i - 1] ? candy[i - 1] + 1 : 1;
for (int i = n - 2; i >= 0; i--)
candy[i] = ratings[i] > ratings[i + 1] ? Math.max(candy[i + 1] + 1, candy[i]) : candy[i];
int res = 0;
for (int i : candy) res += i;
return res;
}
}