1217. Play with Chips*

​https://leetcode.com/problems/play-with-chips/​

题目描述

There are some chips, and the ​​i​​​-th chip is at position ​​chips[i]​​.

You can perform any of the two following types of moves any number of times (possibly zero) on any chip:

  • Move the​​i​​-th chip by 2 units to the left or to the right with a cost of0.
  • Move the​​i​​-th chip by 1 unit to the left or to the right with a cost of1.

There can be two or more chips at the same position initially.

Return the minimum cost needed to move all the chips to the same position (any position).

Example 1:

Input: chips = [1,2,3]
Output: 1
Explanation: Second chip will be moved to positon 3 with cost 1. First chip will be moved to position 3 with cost 0. Total cost is 1.

Example 2:

Input: chips = [2,2,2,3,3]
Output: 2
Explanation: Both fourth and fifth chip will be moved to position two with cost 1. Total minimum cost will be 2.

Constraints:

  • ​1 <= chips.length <= 100​
  • ​1 <= chips[i] <= 10^9​

C++ 实现 1

本题的 ​​chips​​​ 数组表示第 ​​i​​ 芯片的位置, 解题的关键是注意题目中的条件: 可以移动任意位置的芯片以及任意次数, 并且如果移动芯片 2 个单位, cost 为 0;

那么, 我们可以不停的以 2 为单位移动芯片, 直到它处在 0 或者 1 位置上, 反正这个过程不用任何 cost.
然后比较 0 和 1 位置上的芯片个数, 哪个位置的芯片数量少, 之后就移动哪个位置的芯片.

下面代码中, 用 ​​record​​ 来记录 0 和 1 位置上芯片的个数.

class Solution {
private:
int get_remainder(int N) {
if (N % 2 == 1) return 1;
return 0;
}
public:
int minCostToMoveChips(vector<int>& chips) {
unordered_map<int, int> record;
for (auto &n : chips)
record[get_remainder(n)] ++;
return std::min(record[0], record[1]);
}
};