开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第 34 天,点击查看活动详情
问题描述
有 n 个筹码。第 i 个筹码的位置是 position[i] 。
我们需要把所有筹码移到同一个位置。在一步中,我们可以将第 i 个筹码的位置从 position[i] 改变为:
position[i] + 2或position[i] - 2,此时cost = 0position[i] + 1或position[i] - 1,此时cost = 1
返回将所有筹码移动到同一位置上所需要的 最小代价 。
示例 1:
输入: position = [1,2,3]
输出: 1
解释: 第一步:将位置3的筹码移动到位置1,成本为0。
第二步:将位置2的筹码移动到位置1,成本= 1。
总成本是1。
示例 2:
输入: position = [2,2,2,3,3]
输出: 2
解释: 我们可以把位置3的两个筹码移到位置2。每一步的成本为1。总成本= 2。
示例 3:
输入: position = [1,1000000000]
输出: 1
提示:
1 <= position.length <= 1001 <= position[i] <= 10^9
思路分析
首先我们要先理解一下题目的意思,题目会给我们一个数组,数组中记录了每一个硬币的位置,我们需要将所有硬币移动到同一个位置上,而且移动硬币我们需要付出对应的代价,移动代价的具体规则如下:
position[i] + 2或position[i] - 2,此时cost = 0position[i] + 1或position[i] - 1,此时cost = 1
我们需要计算移动所需付出的最小代价。
我们先来分析一下代价的计算规则:
position[i] + 2或position[i] - 2,此时cost = 0
也就是说如果我们一次性移动两个距离的话,我们不需要付出任何代价,假设我们原本硬币所在的位置为偶数下标,那么其移动到任意偶数下标之后都不需要付出任何代价;如果原本硬币所在的位置为奇数下标,那么其移动到任意奇数下标之后都不需要付出任何代价。
position[i] + 1或position[i] - 1,此时cost = 1
每次移动到相邻位置的时候都需要付出1的代价,移动后我们可以改变硬币位置的奇偶性,再结合规则1,也就是说将奇数位置移动到任意偶数位置,我们需要付出的代价为1;将偶数位置移动到任意奇数位置,我们需要付出的代价也为1。
所以我们只需要分别统计偶数下标位置和奇数下标位置的硬币数量,较少数量的即是我们所需付出的最小代价。
AC 代码
完整代码如下:
/**
* @param {number[]} position
* @return {number}
*/
var minCostToMoveChips = function(position) {
let even = 0,odd = 0;
for(const pos of position){
pos % 2 == 0 ? even++ : odd++;
}
return Math.min(even,odd);
};
说在后面
本人为算法业余爱好者,平时只是随着兴趣偶尔刷刷题,如果上面分享有错误的地方,欢迎指出,感激不尽。