leetcode-1217-玩筹码

580 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第4天,点击查看活动详情

题目地址

有 n 个筹码。第 i 个芯片的位置是 position[i] 。

我们需要把所有筹码移到同一个位置。在一步中,我们可以将第 i 个芯片的位置从 position[i] 改变为:

  • position[i] + 2 或 position[i] - 2 ,此时 cost = 0
  • position[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 <= 100
  • 1 <= 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-玩筹码

如有任何问题或建议,欢迎留言讨论!