Day 32 贪心算法 Part03
今日任务
- 1005.K次取反后最大化的数组和
-
- 加油站
-
- 分发糖果
代码实现
1005.K次取反后最大化的数组和
这题有点思路,和题解也差不多,但是没完全通,感觉很复杂,无法下手
public int largestSumAfterKNegations(int[] nums, int k) {nums = IntStream.of(nums).boxed().sorted((a, b) -> Math.abs(b) - Math.abs(a)).mapToInt(Integer::intValue).toArray();for (int i = 0; i < nums.length; i++) {if (nums[i] < 0 && k > 0) {nums[i] = -nums[i];k--;}}if (k % 2 == 1) {nums[nums.length - 1] = - nums[nums.length - 1];}return Arrays.stream(nums).sum();}
- 加油站
这题也是有点思路,有两个问题需要想明白,第一,当totalSum>0的时候,此题一定有解;第二,当currentSum<0的时候,current之前的起始点一定是行不通的;我也想到最大子数组的这种方法,就是第一点没想明白,无法下手
public int canCompleteCircuit(int[] gas, int[] cost) {int start = 0;int currentSum = 0;int totalSum = 0;for (int i = 0; i < gas.length; i++) {currentSum+=(gas[i] - cost[i]);totalSum+=(gas[i] - cost[i]);if (currentSum < 0) {start = i + 1;currentSum = 0;}}if (totalSum < 0) return -1;return start;}
- 分发糖果
完全想不出来的题
public int candy(int[] ratings) {int[] candy = new int[ratings.length];candy[0] = 1;for (int i = 1; i < ratings.length; i++) {if (ratings[i] > ratings[i - 1]) {candy[i] = candy[i - 1] + 1;} else {candy[i] = 1;}}for (int i = ratings.length - 2; i >= 0; i--) {if (ratings[i] > ratings[i + 1]) {candy[i] = Math.max(candy[i + 1] + 1, candy[i]);}}return Arrays.stream(candy).sum();}
今日总结
- 脑子有点混沌,贪心就是各玩各的,很多就是理解问题
- 还差得远
- 今天果然不出所料是一个大跌,并且跌势没有减缓的情况下明天还是一个跌