Day25 | 贪心算法 122.买卖股票的最佳时机II 55. 跳跃游戏 45.跳跃游戏II 1005.K次取反后最大化的数组和

语言

Java

122.买卖股票的最佳时机II

买卖股票的最佳时机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

跳跃游戏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次取反后最大化的数组和

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)进行排序的示例,但它不是直接按照整数的自然顺序(升序或降序)排序,而是按照整数的绝对值的降序来排序。

将整数流转换为对象流

根据绝对值的降序排序

将排序后的对象流转换回整数流并转换为数组

总结

贪心第二天,继续努力!

它山之石,可以攻玉

  • 20
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值