LeetCode1217 玩筹码(贪心)
题目:
数轴上放置了一些筹码,每个筹码的位置存在数组 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
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/play-with-chips
思路:
贪心:奇数位置与奇数位置之间,都可以通过偶数步到达,也就是可以2步2步的移动过去,花费为0。偶数位置与偶数位置也是同样的道理,所以将所有不同偶数(奇数)位置的筹码移动到同一个位置上的最小花费为0,移动后的结果最终只剩下两堆,一堆位于奇数位置,一堆位于偶数位置。然后再将移动后处于两个不同位置上的筹码移动到同一个位置上,移动一个的最小代价为1,所以最终的答案就是处于奇数位置上和偶数位置上筹码个数的最小数。
代码:
import java.util.*; import java.math.*; class Solution { public int minCostToMoveChips(int[] chips) { int length = chips.length; int even = 0, odd = 0; for(int i=0; i<length; i++){ if(chips[i] % 2 == 0) even++; if(chips[i] % 2 == 1) odd++; } return Math.min(even, odd); } } public class Main { public static void main(String[] args){ Scanner scanner = new Scanner(System.in); Solution solution = new Solution(); int n = scanner.nextInt(); int[] chips = new int[n]; for(int i=0; i<n; i++){ chips[i] = scanner.nextInt(); } System.out.println(solution.minCostToMoveChips(chips)); } }