贪心题目:玩筹码

文章目录

题目

标题和出处

标题:玩筹码

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

相关推荐
伟大的车尔尼1 天前
贪心题目:数组大小减半
贪心
漂流瓶jz1 天前
UVA-1609 不公平竞赛 题解答案代码 算法竞赛入门经典第二版
数据结构·算法·链表·贪心·aoapc·算法竞赛入门经典·uva
伟大的车尔尼4 天前
贪心的概念
数据结构·算法·贪心
吞下星星的少年·-·5 天前
The 2025 ICPC Asia East Continent Online Contest (I) A题(模拟+贪心)
算法·贪心·模拟
OuO-218 天前
笔试强训 Day 44:最小差值、kotori 和素因子、dd 爱科学 1.0
二分查找·动态规划·贪心·模拟·记忆化搜索·递归·状态表示优化
aqiu11111120 天前
【算法刷题】蓝桥杯:怎么倒茶(贪心算法 + 结构体排序)
贪心·排序
Tisfy1 个月前
LeetCode 3016.输入单词需要的最少按键次数 II:排序(贪心)
linux·算法·leetcode·题解·贪心·排序·计数
Tisfy1 个月前
LeetCode 3014.输入单词需要的最少按键次数 I:遍历 / if-else计算(比纯数学公式写起来麻烦但好想)
数学·算法·leetcode·字符串·题解·贪心
qz5zwangzihan11 个月前
题解:Atcoder Beginner Contest abc467 F - Email Scheduling Optimization
c++·贪心·atcoder·平衡树·abc467·abc467_f·fhq-treap