贪心题目:玩筹码

文章目录

题目

标题和出处

标题:玩筹码

出处: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)。

相关推荐
Tisfy1 天前
LeetCode 2333.最小差值平方和:排序 + 数学计算(不用二分)
数学·算法·leetcode·题解·贪心·排序
伟大的车尔尼1 天前
贪心题目:单调递增的数字
贪心
Tisfy1 天前
LeetCode 3727.最大交替平方和:排序 (双指针可选)
算法·leetcode·题解·贪心·数组·排序
jyyyx的算法博客5 天前
机器人开箱子【贪心 + 模拟】
贪心·模拟
伟大的车尔尼8 天前
贪心题目:使绳子变成彩色的最短时间
贪心
Tisfy10 天前
LeetCode 0678.有效的括号字符串:O(n)+O(1)一次遍历
算法·leetcode·字符串·题解·贪心·括号匹配
伟大的车尔尼11 天前
贪心题目:坏了的计算器
贪心
lvwangshu13 天前
T1 称重(weight)题解
题解·贪心·总结·技巧·性质题·思维好题
伟大的车尔尼13 天前
贪心题目:十-二进制数的最少数目
贪心
伟大的车尔尼15 天前
贪心题目:不含 AAA 或 BBB 的字符串
贪心