1217 玩筹码(分析)

1. 问题描述:

数轴上放置了一些筹码,每个筹码的位置存在数组 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。

提示:

1 <= chips.length <= 100
1 <= chips[i] <= 10^9

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/play-with-chips

2. 思路分析:

① 其实这道题目理解清楚了代码很简单,我们一开始不必想得很复杂,需要怎么样来移动才能够使得代价最小,从题目中可以知道关键是相隔两个位置的筹码我们是可以通过移动两个位置使其在同一个位置即可,所以进一步分析可以得到奇数位置的筹码通过移动之后可以最终在同一个位置,偶数位置的筹码也是可以通过若干次的一定可以到达同一个位置,移动两个位置的代价为0所以是最小的,奇数与偶数位置相差的移动一个位置代价为1,所以我们只需要要求解出偶数位置与奇数位置的个数,并且将较少的一堆移到另外一个较多数量的一堆上面即可,也就是求解出两堆中的最小值即可

② 关键是需要抓住重点,分析出关键的部分即可

3. 代码如下:

from typing import List


class Solution:
    def minCostToMoveChips(self, chips: List[int]) -> int:
        # 先排序
        sorted(chips)
        # 声明两个位置:分别记录偶数位置与奇数位置的筹码数量
        odd, even = 0, 0
        for i in range(len(chips)):
            # 偶数
            if chips[i] % 2 == 0:
                even += 1
            else: odd += 1
        # 统计这奇数与偶数的个数最终可以通过位置转换使得筹码全部位于同一个奇数与偶数的位置, 然后我们可以判断哪一边的数量比较多
        # 决定将少的数量的移动到多的数量的一边即可 最终肯定是需要数量较少的步数因为奇数与偶数移动一步需要消耗代价为1
        # 理解清楚题目其实还是比较简单的
        if odd == 0 or even == 0: return 0
        if odd > even:
            return even
        else: return odd

猜你喜欢

转载自blog.csdn.net/qq_39445165/article/details/107350063
今日推荐