classSolution{publicintlargestSumAfterKNegations(int[] nums,intK){// 将数组按照绝对值大小从大到小排序,注意要按照绝对值的大小
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++){//从前向后遍历,遇到负数将其变为正数,同时K--if(nums[i]<0&&K>0){
nums[i]=-nums[i];K--;}}// 如果K还大于0,那么反复转变数值最小的元素,将K用完if(K%2==1) nums[len -1]=-nums[len -1];returnArrays.stream(nums).sum();}}
134 加油站
classSolution{publicintcanCompleteCircuit(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;
curSum =0;}}if(totalSum <0)return-1;return index;}}
135 分发糖果
classSolution{/**
分两个阶段
1、起点下标1 从左往右,只要 右边 比 左边 大,右边的糖果=左边 + 1
2、起点下标 ratings.length - 2 从右往左, 只要左边 比 右边 大,此时 左边的糖果应该 取本身的糖果数(符合比它左边大) 和 右边糖果数 + 1 二者的最大值,这样才符合 它比它左边的大,也比它右边大
*/publicintcandy(int[] ratings){int len = ratings.length;int[] candyVec =newint[len];
candyVec[0]=1;for(int i =1; i < len; i++){
candyVec[i]=(ratings[i]> ratings[i -1])? candyVec[i -1]+1:1;}for(int i = len -2; i >=0; i--){if(ratings[i]> ratings[i +1]){
candyVec[i]=Math.max(candyVec[i], candyVec[i +1]+1);}}int ans =0;for(int num : candyVec){
ans += num;}return ans;}}