class Solution {
public int largestSumAfterKNegations(int[] nums, int k) {
// 局部最优每次都将最小的取反,
// 这里写的比较冗余
int sum = 0;
for(int i=0;i<k;i++){
int min = Integer.MAX_VALUE;
for(int j=0;j<nums.length;j++){
if(min >= nums[j]){
min = nums[j];
}
}
for(int l=0;l<nums.length;l++){
if(min == nums[l]){
nums[l] = -min;
break;
}
}
}
for(int i=0;i<nums.length;i++){
sum+=nums[i];
}
return sum;
}
}
代码随想录的方法:先排序,然后遍历到k将负数变成正数
LeetCode134加油站
class Solution {
public int canCompleteCircuit(int[] gas, int[] cost) {
// 当cursum<0时,表示目前走的路已经断了,只能从当前i的下一个(i+1)开始
int curSum = 0;
int totalSum = 0;
int ans = 0;
for(int i=0;i<gas.length;i++){
curSum += gas[i] - cost[i]; // 记录当前的sum是不是小于0
totalSum += gas[i] - cost[i]; // 记录总的gas和cost大小,如果小于0直接返回-1.
if(curSum < 0){
ans = i+1; // 循环数组,对于最后一个数的时候 他的下一个就是i+1要特殊处理。但是这里不加也可以,因为如果第一个位置要作为其实未知的话,直接就在第一步就判断出来了,不会执行到最后一步。
curSum = 0;
}
}
if(totalSum <0){
return -1;
}
return ans;
}
}
LeetCode135:分发糖果
class Solution {
public int candy(int[] ratings) {
// 分为两步,
// 从左向右遍历:得到左边小于右边的
// 之后在从右向左遍历:得到左边大于右边的
int[] ans = new int[ratings.length];
int min = Integer.MAX_VALUE;
ans[0] = 1;
for(int i=1;i<ratings.length;i++){
if(ratings[i]>ratings[i-1]){
ans[i] = ans[i-1]+1;
}
else{
ans[i] = 1;
}
}
for(int i=ratings.length-1;i>0;i--){
if(ratings[i-1]>ratings[i]){
ans[i-1] = Math.max(ans[i]+1, ans[i-1]);
}
}
int result=0;
for(int i=0;i<ans.length;i++){
result += ans[i];
}
return result;
}
}