语言
Java
122.买卖股票的最佳时机II
题目
给你一个整数数组 prices
,其中 prices[i]
表示某支股票第 i
天的价格。
在每一天,你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买,然后在 同一天 出售。
返回 你能获得的 最大 利润
思路
先找局部最优,最后找全局,只要是正数就相加。
代码
class Solution {
public int maxProfit(int[] prices) {
int maxNum = 0;
for (int i = 1; i < prices.length; i++) {
if (prices[i] - prices[i - 1] > 0) {
maxNum += prices[i] - prices[i - 1];
}
}
return maxNum;
}
}
易错点
遍历要从1开始,要不然会出现数组越界异常。
55. 跳跃游戏
题目
给你一个非负整数数组 nums
,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。
判断你是否能够到达最后一个下标,如果可以,返回 true
;否则,返回 false
。
思路
用一个值代表覆盖的范围,如果覆盖的范围大于数组长度就返回真。
代码
class Solution {
public boolean canJump(int[] nums) {
if (nums.length == 1) return true;
int cover = 0;
for (int i = 0; i <= cover; i++) {
cover = Math.max(cover, nums[i] + i);
if (cover >= nums.length - 1) {
return true;
}
}
return false;
}
}
易错点
当数组长度为1时,直接返回真。
取覆盖值和遍历值得最大值。
45.跳跃游戏II
题目
给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。
每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说,如果你在 nums[i] 处,你可以跳转到任意 nums[i + j] 处:
思路
跟跳跃游戏得想法类似,不过这次需要记录最少得跳跃次数,我们还是采取最大范围得方法。
先定义一个最大范围,结果,和下次得范围,对比能走到位置下次范围的大小。
每次跳跃进行++,具体细节看代码。
代码
class Solution {
public int jump(int[] nums) {
if (nums == null || nums.length == 0 || nums.length == 1) {
return 0;
}
int max = 0;
int count = 0;
int cur = 0;
for (int i = 0; i < nums.length; i++) {
max = Math.max(max, i + nums[i]);
if (max >= nums.length -1) {
count++;
break;
}
if (i == cur) {
count++;
cur = max;
}
}
return count;
}
}
易错点
需要判断数组大小为1的情况,还有及时更新最大范围。
1005.K次取反后最大化的数组和
题目
给你一个整数数组 nums
和一个整数 k
,按以下方法修改该数组:
选择某个下标 i
并将 nums[i]
替换为 -nums[i]
。
重复这个过程恰好 k
次。可以多次选择同一个下标 i
。
以这种方式修改数组后,返回数组 可能的最大和 。
思路
先把数组按绝对值进行排序,循环遍历,找到数组中为负的数,如果K > 0,变为正数,最后判读K是否是奇数,是的话翻转数组中最后一个数。
代码
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();
for (int i = 0; i < nums.length; i++) {
if (nums[i] < 0 && k > 0) {
nums[i] *= -1;
k--;
}
}
if (k % 2 == 1) {
nums[nums.length - 1] *= -1;
}
return Arrays.stream(nums).sum();
}
}
易错点
第一段排序不太熟悉。
这段代码是使用Java 8的Stream API来对一个整数数组(nums
)进行排序的示例,但它不是直接按照整数的自然顺序(升序或降序)排序,而是按照整数的绝对值的降序来排序。
将整数流转换为对象流
根据绝对值的降序排序
将排序后的对象流转换回整数流并转换为数组
总结
贪心第二天,继续努力!
它山之石,可以攻玉