每周 Leetcode: 1217、55、62、121、279

2021 05 27

本周的五道 Leetcode 分别是:

  • 1217 玩筹码
  • 55 跳跃游戏
  • 62 不同路径
  • 121 买卖股票的最佳时机
  • 279 完全平方数

1217 玩筹码

题目描述

数轴上放置了一些筹码,每个筹码的 位置 存在数组 chips 当中。

你可以对 任何筹码 执行下面两种操作之一(不限操作次数,0 次也可以):

  • 将第 i 个筹码向左或者右移动 2 个单位,代价为 0。
  • 将第 i 个筹码向左或者右移动 1 个单位,代价为 1。

最开始的时候,同一位置上也可能放着两个或者更多的筹码。

返回将所有筹码移动到同一位置(任意位置)上所需要的最小代价。

  • 示例 1:
输入:chips = [1,2,3]
输出:1
解释:第二个筹码移动到位置三的代价是 1,第一个筹码移动到位置三的代价是 0,总代价为 1。
复制代码
  • 示例 2:
输入:chips = [2,2,2,3,3]
输出:2
解释:第四和第五个筹码移动到位置二的代价都是 1,所以最小总代价为 2。
复制代码

来源:力扣(LeetCode)
链接:leetcode-cn.com/problems/mi…
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解法一 贪心思想

贪心的基本思想是尽量选择局部最优解,也就是每次尽量按照代价 0 移动筹码,如果没有代价为 0 的移动,再考虑代价为 1

由题意,我们可以知道 chips 存储的是筹码的位置,

  • 奇数位置到奇数位置 或者 偶数位置到偶数位置 的代价为 0
  • 奇数位置到偶数位置 或者 偶数位置到奇数位置 的代价为 1

所以先将所有的奇数位筹码移动到其中的某一个位置,再将所有偶数位筹码移动到其中的某一个位置,此时代价为 0

由于最后的两个位置一定是奇数位和偶数位,所以移动的代价都是 1,选择筹码数更小的哪个位置进行移动,移动的代价就是 筹码数 x 1

以上移动奇数位和偶数位的过程也可以表示为 计算奇数(偶数)个数

// 贪心思想
class Solution {
    public int minCostToMoveChips(int[] position) {
        int even = 0;   // 偶数位置个数
        int odd = 0;    // 奇数位置个数
        for(int i = 0; i < position.length; ++i){
            if(position[i] % 2 == 0){
                even++;
            }else {
                odd++;
            }
        }
        return Math.min(even,odd);
    }
}
复制代码

55 跳跃游戏

题目描述

给定一个非负整数数组 nums ,你最初位于数组的 第一个下标

数组中的每个元素代表你在该位置可以跳跃的最大长度。

判断你是否能够到达最后一个下标。

 – 示例 1:

输入:nums = [2,3,1,1,4]
输出:true
解释:可以先跳 1 步,从下标 0 到达下标 1, 然后再从下标 1 跳 3 步到达最后一个下标。
复制代码
  • 示例 2:
输入:nums = [3,2,1,0,4]
输出:false
解释:无论怎样,总会到达下标为 3 的位置。但该下标的最大跳跃长度是 0 , 所以永远不可能到达最后一个下标。
复制代码

来源:力扣(LeetCode)
链接:leetcode-cn.com/problems/ju…
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解法一 动态规划

如果当前位于位置 i,能够到达最后一个下标的条件为 i 到最后的距离 小于等于 nums[i],即 nums[i] + i <= nums.length,这就可以作为判断是否返回 true 的条件。

dp[i] 表示到达位置 i 后,下一跳能够到达的最远的位置,则有

dp[i]=max(dp[i1],nums[i]+i)dp[i] = max(dp[i-1],nums[i] + i)

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享