1005. Maximize Sum Of Array After K Negations
- 思路
- 此题难度是按绝对值排列,先背下来吧
- 先按绝对值大小倒序排列
- 从大到小
- 如果是负数则取相反数
- k--
- 如果遍历完毕全为正了K还有富裕
- k是否为偶数
- 如果为偶数
- 不管
- 如果为奇数
- 最小值取负值
- 如果为偶数
- k是否为偶数
-
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){ nums[i] *= -1; k--; } } if(k %2 != 0){ nums[len-1] *= -1; } //数列求和也可以记一下; return Arrays.stream(nums).sum(); } }
134. Gas Station
- 思路
- 贪心
- 首先算出每个站的剩余balance
- balance = gas[i] - cost [i];
- 累加balance如果为负数
- return -1
- 遍历数组,累加balance
- 如果balance为负
- 为负说明这个点为start到不了下一个点,设置下一个index为start
- cuSum更新为0,因为已经是下一个点为start了,
- 如果balance为负
-
java class Solution { public int canCompleteCircuit(int[] gas, int[] cost) { int curSum = 0; int totalSum = 0; int start = 0; for (int i = 0 ; i < gas.length; i++){ int balance = gas[i] - cost[i]; curSum += balance; totalSum += balance; if(curSum < 0){ start = i + 1; curSum = 0; } } if(totalSum < 0){ return -1; } return start; } }
- 贪心
135. Candy
- 思路
- 贪心
- 先顺序遍历,确定右孩子比左孩子分高的情况
- 再逆序遍历,确定左孩子比右孩子分高的情况
-
if(ratings[i] > ratings[i + 1 ]){candyList[i] = Math.max(candyList[i], candyList[i+1]+1);
-
-
java class Solution { public int candy(int[] ratings) { int[] candyList = new int[ratings.length]; candyList[0] = 1; for(int i = 1; i < ratings.length; i++){ candyList[i] = (ratings[i] >ratings[i - 1] ) ? candyList[i-1] + 1: 1; } for(int i = ratings.length-2; i >= 0; i--){ if(ratings[i] > ratings[i + 1 ]){ candyList[i] = Math.max(candyList[i], candyList[i+1]+1); } } return Arrays.stream(candyList).sum(); } }