题目描述:
数轴上放置了一些筹码,每个筹码的位置存在数组 chips 当中。
你可以对 任何筹码 执行下面两种操作之一(不限操作次数,0 次也可以):
- 方式一:将第 i 个筹码向左或者右移动 2 个单位,代价为 0。
- 方式二:将第 i 个筹码向左或者右移动 1 个单位,代价为 1。
最开始的时候,同一位置上也可能放着两个或者更多的筹码。返回将所有筹码移动到同一位置(任意位置)上所需要的最小代价。
提示:
1 <= chips.length <= 100
1 <= chips[i] <= 10^9
示例 1:
输入:chips = [1,2,3]
输出:1
解释:第二个筹码移动到位置三的代价是 1,第一个筹码移动到位置三的代价是 0,总代价为 1。
示例 2:
输入:chips = [2,2,2,3,3]
输出:2
解释:第四和第五个筹码移动到位置二的代价都是 1,所以最小总代价为 2。
贪心算法:解题思路
为了保证总开销值最小,对于每一次的移动选择,我们如果能选择开销为0的移动方式(方式一),就绝对不选择开销为1的移动方式(方式二)。因此我们尽量通过方式一先将尽量多的筹码移动到一起,在剩下的筹码无法再通过方式一来移动到同一位置的时候,尽量使用最少次数的方式二来移动。
规律:我们能够将所有奇数位置的筹码移动到同一个位置(记作位置A),同时能够将所有偶数位置的移动到同一位置(记作位置B),并且位置A和位置B可以是数轴上任意两个相邻的位置(也就是|A-B|=1,之所以要相邻,是因为相邻的位置移动的次数最少。为了方便,我们这里统一将奇数位置的筹码移动到position[1],将偶数位置的筹码移动到Postion[2]).
所有奇数位置的筹码都可以通过N次方式一移动到位置postion[1],所有偶数位置的筹码都可以通过M次方式一移动到位置position[2].这里一共花费开销为0,然后使用K次方式二将postion[1]和postion[2]两者中筹码数量较少的那一堆移动到另一堆即可,K即为min(position[1], position[2])。而postion[1]和postion[2]中的筹码数量实际上就是position数组中奇数位置的筹码数量和偶数位置的筹码数量。
代码如下:
class Solution {
public int minCostToMoveChips(int[] position) {
int n = position.length;
int a = 0, b = 0;
for (int m : position) {
if (m % 2 == 0) {
a++;
} else {
b++;
}
}
return a > b ? b : a;
}
}
执行结果: