文章目录
题目
标题和出处
标题:玩筹码
出处:1217. 玩筹码
难度
3 级
题目描述
要求
有 n \texttt{n} n 个筹码,第 i \texttt{i} i 个筹码的位置是 positioni \texttt{positioni} positioni。
需要把所有筹码移到同一个位置。在一步中,可以将第 i \texttt{i} i 个筹码的位置从 positioni \texttt{positioni} positioni 移动到以下位置,并需要相应的代价:
- positioni + 2 \texttt{positioni} + \texttt{2} positioni+2 或 positioni − 2 \texttt{positioni} - \texttt{2} positioni−2,代价为 0 \texttt{0} 0。
- positioni + 1 \texttt{positioni} + \texttt{1} positioni+1 或 positioni − 1 \texttt{positioni} - \texttt{1} positioni−1,代价为 1 \texttt{1} 1。
返回将所有筹码移动到同一位置上所需要的最小代价。
示例
示例 1:

输入: position = 1,2,3 \texttt{position = 1,2,3} position = 1,2,3
输出: 1 \texttt{1} 1
解释:第一步:将位置 3 \texttt{3} 3 的筹码移动到位置 1 \texttt{1} 1,成本是 0 \texttt{0} 0。
第二步:将位置 2 \texttt{2} 2 的筹码移动到位置 1 \texttt{1} 1,成本是 1 \texttt{1} 1。
总成本是 1 \texttt{1} 1。
示例 2:

输入: position = 2,2,2,3,3 \texttt{position = 2,2,2,3,3} position = 2,2,2,3,3
输出: 2 \texttt{2} 2
解释:可以把位置 3 \texttt{3} 3 的两个筹码移到位置 2 \texttt{2} 2。每一步的成本是 1 \texttt{1} 1。总成本是 2 \texttt{2} 2。
示例 3:
输入: position = 1,1000000000 \texttt{position = 1,1000000000} position = 1,1000000000
输出: 1 \texttt{1} 1
数据范围
- 1 ≤ position.length ≤ 100 \texttt{1} \le \texttt{position.length} \le \texttt{100} 1≤position.length≤100
- 1 ≤ positioni ≤ 10 9 \texttt{1} \le \texttt{positioni} \le \texttt{10}^\texttt{9} 1≤positioni≤109
解法
思路和算法
根据移动筹码的规则,将一个筹码移动到相差 2 2 2 的位置需要的代价是 0 0 0,将一个筹码移动到相差 1 1 1 的位置需要的代价是 1 1 1。
由于移动到相差 2 2 2 的位置之后筹码所在的位置的奇偶性不变,移动到相差 1 1 1 的位置之后筹码所在的位置的奇偶性改变,因此可以在使用代价 0 0 0 的情况下分别将所有位于奇数位置的筹码移动到同一个奇数位置和将所有位于偶数位置的筹码移动到同一个偶数位置,且该奇数位置和该偶数位置相邻。
将所有筹码移动到相邻的奇数位置和偶数位置之后,将所有筹码移动到同一位置上可能有两种情况:一是将奇数位置的筹码全部移动到偶数位置,偶数位置的筹码不移动;二是将偶数位置的筹码全部移动到奇数位置,奇数位置的筹码不移动。第一种情况的总代价等于奇数位置的筹码个数,第二种情况的总代价等于偶数位置的筹码个数,两种情况的总代价中的最小值即为将所有筹码移动到同一位置上所需要的最小代价。
特别地,如果初始时所有筹码都位于奇数位置或所有筹码都位于偶数位置,则可以在使用代价 0 0 0 的情况下将所有筹码移动到同一个位置,最小代价为 0 0 0。
根据上述分析,计算将所有筹码移动到同一位置上所需要的最小代价的做法是:遍历数组 position \textit{position} position,分别统计位于奇数位置和位于偶数位置的筹码数,其中的较小值即为最小代价。
代码
java
class Solution {
public int minCostToMoveChips(int[] position) {
int[] counts = new int[2];
for (int chip : position) {
counts[chip % 2]++;
}
return Math.min(counts[0], counts[1]);
}
}
复杂度分析
-
时间复杂度: O ( n ) O(n) O(n),其中 n n n 是数组 position \textit{position} position 的长度。需要遍历数组 position \textit{position} position 一次,对于每个元素更新计数的时间是 O ( 1 ) O(1) O(1)。
-
空间复杂度: O ( 1 ) O(1) O(1)。