1005. Maximize Sum Of Array After K Negations
题目链接:1005. Maximize Sum Of Array After K Negations
思路链接:代码随想录贪心算法-K次取反后最大化的数组和
思路
见代码
Code
class Solution {
public int largestSumAfterKNegations(int[] nums, int k) {
// 按照绝对值大小从大到小排序
nums = IntStream.of(nums)
.boxed()
.sorted((o1, o2) -> Math.abs(o2) - Math.abs(o1))
.mapToInt(Integer::intValue).toArray();
// Arrays.sort(nums, (a, b) -> {
// return Math.abs(b) - Math.abs(a);
// });
// 尽可能把负数都变为正数
for (int i = 0; i < nums.length; i++) {
if (nums[i] < 0 && k > 0) {
nums[i] *= -1;
k--;
}
}
// k还为正数,就在最小值上操作
if (k > 0) {
if (k % 2 == 1) {
nums[nums.length - 1] *= -1;
}
}
// 计算sum
int result = 0;
for (int i : nums) {
result += i;
}
return result;
}
}
134. Gas Station
题目链接:134. Gas Station
思路链接:代码随想录贪心算法-加油站
思路
思路
Code
class Solution {
public int canCompleteCircuit(int[] gas, int[] cost) {
int curSum = 0;
int totalSum = 0;
int start = 0;
for (int i = 0; i < gas.length; 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;
}
}
class Solution {
public int canCompleteCircuit(int[] gas, int[] cost) {
int curSum = 0;
int min = Integer.MAX_VALUE;
for (int i = 0; i < gas.length; i++) {
int rest = gas[i] - cost[i];
curSum += rest;
if (curSum < min) {
min = curSum;
}
}
// 如果gas的总和小于cost总和,那么无论从哪里出发,一定是跑不了一圈的
if (curSum < 0) return -1;
// i从0开始计算累加到最后一站,如果累加没有出现负数,说明从0出发,油就没有断过,那么0就是起点。
if (min >= 0) return 0;
// 如果累加的最小值是负数,汽车就要从非0节点出发,从后向前,看哪个节点能这个负数填平,能把这个负数填平的节点就是出发节点。
for (int i = gas.length - 1; i >= 0; i--) {
int rest = gas[i] - cost[i];
min += rest;
if (min >= 0) {
return i;
}
}
return -1;
}
}
135. Candy
题目链接:135. Candy
思路链接:代码随想录贪心算法-分发糖果
思路
思路
Code
class Solution {
public int candy(int[] ratings) {
int[] result = new int[ratings.length];
result[0] = 1;
for (int i = 1; i < result.length; i++) {
if (ratings[i] > ratings[i - 1]) {
result[i] = result[i - 1] + 1;
} else {
result[i] = 1;
}
}
for (int i = result.length - 2; i >= 0; i--) {
if (ratings[i] > ratings[i + 1]) {
result[i] = Math.max(result[i + 1] + 1, result[i]);
}
}
int res = 0;
for (int i : result) {
// System.out.print(i + " ");
res += i;
}
return res;
}
}