思路:
1、虽然写的是一个简单题,但是不认真做还是会掉坑里。首先要排序数组,将最小值小于零的先进行取反,如果没有小于零的数了则判断剩余k值是偶数个还是奇数个,如果是偶数个则直接返回数组之和,如果是奇数个则将最小的值取反后返回数组之和。
2、加油站有一个比较巧妙的方法就是,将每一个差值存放数组后从0开始累加,如果累加没有出现过负数,则返回0。如果累加的过程中最小值有负数,就倒着遍历,什么时候能把累加最小值的负数填平,就从什么时候开始遍历。
不过第二题也有比较大众化的做法,设置两个累加值,就是从0开始累加,什么时候累加值为负数,则将返回值置为下一个开始,累加值也置为0开始。第二个累加值累加到最后如果小于0则返回-1,否则返回记录的返回值。代码如下。
3、第三题分发糖果。需要用到两次贪心。首先从前向后遍历,如果当前评分大于前一个评分,糖果数加一,如果相等或者小于,糖果数置为1。再从后往前遍历,如果当前评分大于遍历的前一个评分,也就是nums[i]>nums[i+1](因为是从后往前遍历),糖果数加一,否则对比当前糖果和前一个糖果,谁大取谁。
1005.K次取反后最大化的数组和
class Solution {
public int largestSumAfterKNegations(int[] nums, int k) {
Arrays.sort(nums);
int i=0;
for(;i<nums.length && k>0 && nums[i]<0;i++){
nums[i] = -nums[i];
k--;
}
if (k % 2 == 1){
Arrays.sort(nums);
nums[0] = -nums[0];
}
return Arrays.stream(nums).sum();
}
}
134. 加油站
class Solution {
public int canCompleteCircuit(int[] gas, int[] cost) {
int sum = 0, res=0, sum1=0;
for(int i=0;i<gas.length;i++){
sum+=gas[i]-cost[i];
sum1+=gas[i]-cost[i];
if(sum<0){
res=i+1;
sum = 0;
}
}
if(sum1<0)
return -1;
return res;
}
}
135. 分发糖果
class Solution {
public int candy(int[] ratings) {
int[] nums = new int[ratings.length];
nums[0] = 1;
for(int i=1;i<ratings.length;i++){
if(ratings[i]>ratings[i-1]){
nums[i] = nums[i-1]+1;
}else{
nums[i] = 1;
}
}
for(int i=ratings.length-2;i>=0;i--){
if(ratings[i]>ratings[i+1]){
nums[i] = Math.max(nums[i],nums[i+1]+1);
}
}
return Arrays.stream(nums).sum();
}
}