1217. 玩筹码
1217. 玩筹码
描述:
数轴上放置了一些筹码,每个筹码的位置存在数组 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
1 解法1: 4 ms 8.4 MB 2 class Solution { 3 public: 4 int minCostToMoveChips(vector<int>& chips) { 5 /*思路: 6 注意:数轴上,数字相同的代表,在这个位置可以放多个数据 7 最后都是移动到两个相近的距离上,x,x+1这样类似的 8 1:向左或者向右移动两个单位,代价为0 9 2:下标从x开始,x,x+2,x+2+2,步长为2,都移动到x,代价为0 10 3:下标从x+1开始,x+1,x+1+2,x+1+2+2,都移动x,步长为2,代价为1 11 1 <= chips[i] <= 10^9 12 假设:把所有偶数都放到一个地方,所有奇数都放到一个地方,记录个数 13 最后移动到的结果,判断奇数值和偶数值的个数,谁最小即可 14 就是算奇数和偶数的个数 15 16 */ 17 int sumx=0,sumy=0; 18 for(auto data:chips){ 19 if(data%2==0) sumx++; 20 else sumy++; 21 22 } 23 return min(sumx,sumy); 24 } 25 };
1 解法2: 8 ms 8.9 MB 2 class Solution { 3 public: 4 int minCostToMoveChips(vector<int>& chips) { 5 /*思路: 6 注意:数轴上,数字相同的代表,在这个位置可以放多个数据 7 最后都是移动到两个相近的距离上,x,x+1这样类似的 8 1:向左或者向右移动两个单位,代价为0 9 2:下标从x开始,x,x+2,x+2+2,步长为2,都移动到x,代价为0 10 3:下标从x+1开始,x+1,x+1+2,x+1+2+2,都移动x,步长为2,代价为1 11 1 <= chips[i] <= 10^9 12 假设:把所有偶数都放到一个地方,所有奇数都放到一个地方,记录个数 13 最后移动到的结果,判断奇数值和偶数值的个数,谁最小即可 14 就是算奇数和偶数的个数 15 16 */ 17 int sumx=0,sumy=0; 18 map<int,int> mp;//定义map键值对,key=数轴下标,val=在这个数轴上的个数 19 for(auto data:chips) mp[data]++;//初始化个数 20 map<int,int>::iterator iter=mp.begin(); 21 while(iter!=mp.end()){ 22 if(iter->first%2==0) sumx+=iter->second; 23 else sumy+=iter->second; 24 iter++; 25 } 26 return min(sumx,sumy); 27 } 28 };