● 1005.K次取反后最大化的数组和
/*IntStream.of(nums) 将数组 nums 转换为一个 IntStream 对象。 boxed() 将 IntStream 对象转换为一个 Stream<Integer> 对象。 sorted((o1, o2) -> Math.abs(o2) - Math.abs(o1)):使用 sorted() 方法对 Stream<Integer> 中的元素进行排序。这里使用了一个自定义的比较器,该比较器首先按元素的绝对值从大到小排序,然后再按元素本身的大小排序。 mapToInt(Integer::intValue) 将 Stream<Integer> 对象中的元素转换为 IntStream 对象。 toArray() 将 IntStream 对象中的元素转换为一个 int 数组。 因为我们能够通过流中的sort方法来对元素进行自定义排序,所以要转换成流 Stream在java工程中是极其常见的 */ 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--; } } //如果k还大于0,我们就要犯贱 //判断k是不是偶数,是偶数的话,就一直对最小的一个数进行取反,这样我们的最后的结果的值 if(k%2==1) nums[len-1] = -nums[len-1]; return Arrays.stream(nums).sum(); } }
● 134. 加油站
/* i从0开始累加rest[i],和记为curSum,一旦curSum小于零,说明[0, i]区间都不能作为起始位置,因为这个区间选择任何一个位置作为起点,到i这里都会断油,那么起始位置从i+1算起,再从0计算curSum。 */ class Solution { public int canCompleteCircuit(int[] gas, int[] cost) { int curSum = 0; int totalSum = 0;//totalSum是用来检测全程中加油量是否大于耗油量 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;//最后的index肯定是全局的希望 } }
● 135. 分发糖果
class Solution { public int candy(int[] ratings) { int len = ratings.length; int[] candy = new int[len]; candy[0] = 1; for(int i =1;i<len;i++){ candy[i] = (ratings[i]>ratings[i-1])?candy[i-1]+1:1; } for(int i = len-1;i>0;i--){ candy[i-1] = (ratings[i-1]>ratings[i])?Math.max(candy[i]+1,candy[i-1]):candy[i-1]; }//注意是否经过第一层for循环之后,比右边大的孩子是否本来拥有的糖果数就多余左边的 int sum = 0; for(int i = 0;i<len;i++){ sum += candy[i]; } return sum; } }