1005.K次取反后最大化的数组和
题目链接:1005. K 次取反后最大化的数组和 - 力扣(LeetCode)
思路:重要的是进行绝对值排序
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();
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];
return Arrays.stream(nums).sum();
}
}
134. 加油站
思路:累加直到能填补复数的下标
class Solution {
public int canCompleteCircuit(int[] gas, int[] cost) {
int cursum = 0;
int totalsum = 0;
int index = 0;
for(int i = 0; i < gas.length; i++){
cursum += gas[i] - cost[i];
totalsum += gas[i] - cost[i];
if(cursum < 0){
index = (i + 1) % gas.length;
cursum = 0;
}
}
if(totalsum < 0) return -1;
return index;
}
}
135. 分发糖果
思路:三个for循环,一个从左往右去,一个再从右往左来,最后一个统计总数
class Solution {
public int candy(int[] ratings) {
int len = ratings.length;
int[] numbers = new int[len];
int sum = 0;
numbers[0] = 1;
for(int i = 1; i < len; i++){
if(ratings[i] > ratings[i-1]){
numbers[i] = numbers[i-1] + 1;
}else{
numbers[i] = 1;
}
}
for(int i = len-2; i >= 0; i--){
if(ratings[i] > ratings[i+1] && numbers[i] <= numbers[i+1]){
numbers[i] = numbers[i+1] + 1;
}
}
for(int i = 0; i < len; i++){
sum += numbers[i];
}
return sum;
}
}
1032

被折叠的 条评论
为什么被折叠?



