玩筹码 leetcode

leetcode 题库 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)

链接:https://leetcode-cn.com/problems/minimum-cost-to-move-chips-to-the-same-position

二、解题思路

我们任意挑选两个相邻的位置,两个位置必然会有一个偶数位置(记为 a),

一个奇数位置(记为b),由于移动偶数个位置的代价为 0,

所以把所有在偶数位置的筹码移动到 a 点的代价和为 0

(每一个筹码都可以通过移动偶数个单位移动到 a 点),

同样把所有在奇数位置的筹码移动到 b 点的代价和也为 0,

这时所有的筹码都集中到了 a b 两点,

那么将 筹码最少的点的所有筹码 移动到 筹码最多的点 的代价就是所求的最小代价

算法实现是直接求偶数位置的个数和奇数位置的个数,然后返回个数少的数目就行了

三、代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Solution {
public int minCostToMoveChips(int[] positions) {
int eventCount = 0;
int addCount = 0;
for (int position : positions) {
if (position % 2 == 0) {
eventCount++;
} else {
addCount++;
}
}
return Math.min(eventCount, addCount);
}
}
打赏
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!

扫一扫,分享到微信

微信分享二维码

请我喝杯咖啡吧~

支付宝
微信