目录
1005.K次取反后最大化的数组和
Java代码
class Solution {
public int largestSumAfterKNegations(int[] nums, int k) {
//nums排序
nums = IntStream.of(nums).boxed().sorted((o1,o2)->Math.abs(o2)- Math.abs(o1)).mapToInt(Integer::intValue).toArray();
int len = nums.length;
//循环遍历nums <0的数 先替换为正数
for (int i = 0; i < len; i++) {
if (nums[i] < 0 && k > 0) {
nums[i] = - nums[i];
k--;
}
}
//k还有,则继续替换最后一位最小的数字
if (k % 2 == 1) {
nums[len - 1] = -nums[len -1];
}
//数组求和
int sum = 0;
for (int i : nums) {
sum += i;
}
return sum;
// return Arrays.stream(nums).sum();
}
}
134.加油站
Java代码
class Solution {
public int canCompleteCircuit(int[] gas, int[] cost) {
int curSum = 0; //当前sum和
int totalSum = 0; //总sum和
int start = 0; //其实位置
for (int i =0; i < gas.length; i++) {
curSum += gas[i] - cost[i]; //汽油的剩余量大于等于0 说明可以跑一圈
totalSum += gas[i] - cost[i];
if (curSum < 0) {
curSum = 0;
start = i + 1;
}
}
if (totalSum < 0) {
return -1;
}
return start;
}
}
135.分发糖果
Java代码
class Solution {
//分两个阶段
// 如果右边比左边大,右边的糖果=左边+1
// 如果左边比右边大,左边的糖果= max(取本身的糖果,右边的糖果+1)
public int candy(int[] ratings) {
int len = ratings.length;
int[] candy = new int[len];
candy[0] = 1;
//从左往右
for (int i = 1; i < len; i++) {
candy[i] = ratings[i] - ratings[i-1] > 0 ? candy[i - 1] + 1 : 1;
}
//从右往左
for (int i = len -2 ; i >=0; i--) {
if (ratings[i] > ratings[i + 1]) {
candy[i] = Math.max(candy[i], candy[i+1] + 1);
}
}
//取和
int sum = 0;
for (int s : candy) {
sum += s;
}
return sum;
}
}