● 1005.K次取反后最大化的数组和
卡尔的思路我明白了,但我感觉我的可能更好理解吧。。。。。。
首先我先把数组排序,从小到大
走一个循环,如果前几个有负数,那我就消耗k,将前几个取反
走完以后,再次排序数组,有可能第一个数是正数,但是它是最小的,所以只操作它一个就行,消耗光k,如果是负的呢,那么它的绝对值是最大的,也是只对他操作,如果最后能取反,赚了,没取反没损失。
class Solution {
public int largestSumAfterKNegations(int[] nums, int k) {
Arrays.sort(nums);
int sum = 0;
for(int i =0;i<nums.length&&k>0;i++){
if(nums[i]<0){
nums[i] *= -1;
k--;
}
}
Arrays.sort(nums);
k = k%2;
nums[0] = k==0?nums[0]:-nums[0];
for(int num:nums){
sum+=num;
}
return sum;
}
}
● 134. 加油站
class Solution {
public int canCompleteCircuit(int[] gas, int[] cost) {
int start =0;
int cursum=0;
int totalsum=0;
for(int i =0;i<gas.length;i++){
cursum+=(gas[i]-cost[i]);
totalsum+=(gas[i]-cost[i]);
if(cursum<0) {
start=i+1;
cursum=0;
}
}
if(totalsum<0){
return -1;
}
return start;
}
}
● 135. 分发糖果
再好好想想,尤其是边界,是从前往后遍历还是从后往前遍历。
class Solution {
public int candy(int[] ratings) {
int[] nums = new int[ratings.length];
Arrays.fill(nums,1);
for(int i =1 ;i<nums.length;i++){
if(ratings[i]>ratings[i-1]){
nums[i] = nums[i-1]+1;
}
}
for(int i = nums.length-2;i>=0;i--){
if(ratings[i]>ratings[i+1]){
nums[i] = Math.max(nums[i],nums[i+1]+1);
}
}
int sum = 0;
for(int num:nums){
sum+=num;
}
return sum;
}
}