持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第4天,点击查看活动详情
有 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 <= chips.length <= 1001 <= chips[i] <= 10^9
解题思路
本题如果读完题,根据示例的思路去找筹码最多的位置,然后计算其他筹码移动到该位置的代价的话就错了。
根据题意可知,如果移动两步,花费为 0,如果移动一步,花费为 1,也就是如果距离为偶数,则不需要花费代价,如果距离为奇数,则需要 1 个花费。
我们再想一个问题,所有奇数下标到奇数下标之间的距离都是偶数,所有偶数下标到偶数下标的距离也是偶数,只有奇数下标到偶数下标,或者偶数下标到奇数下标,需要 1 个花费。
所以本题只需要判断筹码奇数下标的数量和偶数下标的数量,哪种数量少就移动哪一种即可。
代码实现
var minCostToMoveChips = function(position) {
const len = position.length
let oddNum = 0
for(let i = 0;i<len;i++){
if(position[i]%2){
oddNum++
}
}
return Math.min(oddNum,len-oddNum)
}
至此我们就完成了 leetcode-1217-玩筹码
如有任何问题或建议,欢迎留言讨论!