代码随想录算法训练营第二十八天-122买卖股票的最佳时机II、55 跳跃游戏、45跳跃游戏II、1005K次取反后最大化的数组和
初步题解
122 买卖股票的最佳时机 II
题目链接:(https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-ii)
画图很简单
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
|
public int maxProfit(int[] prices) { int sum = 0; for (int i = 1; i < prices.length; i++) { if (prices[i] >= prices[i - 1]) { sum +=prices[i] - prices[i - 1]; } } return sum; }
|
55 跳跃游戏
题目链接:(https://leetcode.cn/problems/jump-game/)
没有思路。看了部分题解,说是求覆盖最大的范围。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| public static boolean canJump(int[] nums) { int maxIndex = 0; for (int i = 0; i < nums.length; i++) { if (i > maxIndex) { return false; }
maxIndex = Math.max(nums[i] + i, maxIndex); if (maxIndex >= nums.length - 1){ return true; } } return false; }
|
45 跳跃游戏 II
题目链接:(https://leetcode.cn/problems/jump-game-ii/)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
|
public static int jump(int[] nums) { int maxIndex = 0; int maxJ = 0; int count = 0; if (nums.length == 1) { return count; } for (int i = 0; i < nums.length;) { if (i + nums[i] >= nums.length - 1) { count++; return count; } for (int j = i + 1; j <= i + nums[i] && j < nums.length; j++) { if (j + nums[j] >= maxIndex) { maxIndex = j + nums[j]; maxJ = j; } } count++; i = maxJ; } return count; }
|
1005K 次取反后最大化的数组和
题目链接:(https://leetcode.cn/problems/maximize-sum-of-array-after-k-negations)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
|
public static int largestSumAfterKNegations(int[] nums, int k) { Arrays.sort(nums); int minAbs = Integer.MAX_VALUE; int index = 0; int sum = 0; for (int i = 0; i < nums.length; i++) { if (Math.abs(nums[i]) < minAbs) { minAbs = Math.min(minAbs, Math.abs(nums[i])); index = i; } if (k > 0 && nums[i] < 0) { nums[i] = -nums[i]; k--; } sum += nums[i]; } if (k % 2 == 1) { sum -= 2 * nums[index]; } return sum; }
|
看解析
122 买卖股票的最佳时机 II
解析:(https://programmercarl.com/0122.买卖股票的最佳时机II.html)
55 跳跃游戏
解析:(https://programmercarl.com/0055.跳跃游戏.html)
45 跳跃游戏 II
解析:(https://programmercarl.com/0045.跳跃游戏II.html)
题解的思路在于增加覆盖范围。每更新一次覆盖范围,就结果 +1(这里比较绕,但是这样就不用双层循环了)。
简化版本:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| public int jump(int[] nums) { int result = 0; int end = 0; int temp = 0; for (int i = 0; i <= end && end < nums.length - 1; ++i) { temp = Math.max(temp, i + nums[i]); if (i == end) { end = temp; result++; } } return result; }
|
1005K 次取反后最大化的数组和
解析:(https://programmercarl.com/1005.K次取反后最大化的数组和.html)