/*
数轴上放置了一些筹码,每个筹码的位置存在数组 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
在数轴上有一些砝码,输入他们的位置,找到移动的最小代价。
其中偶数位置的到偶数位置的没有代价,奇数到奇数位置的没有代价(比如位置1到位置3不需要代价,2到4也不需要)
那么在这个条件下就可以把所有奇数位置的砝码放到一个位置上(比如1,3,5三个位置上有一堆砝码,你可以全部堆在3位置上,反正不需要代价)
于是在没有代价的情况下,我们就可以把所有偶数位置的砝码和奇数位置的砝码摆到连续的位置上
其次,奇数到偶数和偶数到奇数的移动一个砝码就需要1代价
于是再比较两者中谁的数量比较少,少的一侧有多少砝码就是对应的总代价。
到这里,这个题就转换成了:遍历一次数组,找到其中有多少个奇数和偶数位置的砝码,取其中比较少的,就是答案
*/
public class MinCostToMoveChips1217 {
public int minCostToMoveChips(int[] chips) {
if (chips ==null ||chips.length < 2){
return 0;
}
int index0=0;
int index1=0;
for (int n:chips) {
if (n % 2==0) {
index0++;
}else {
index1++;
}
}
return index0 < index1 ? index0 : index1;
}
}