[数学] 1217. 玩筹码

134 阅读1分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第1天,点击查看活动详情

每日刷题 2022.07.27

题目

  • 有 n 个筹码。第 i 个筹码的位置是 position[i] 。
  • 我们需要把所有筹码移到同一个位置。在一步中,我们可以将第 i 个筹码的位置从 position[i] 改变为:
    • position[i] + 2 或 position[i] - 2 ,此时 cost = 0
    • position[i] + 1 或 position[i] - 1 ,此时 cost = 1
  • 返回将所有筹码移动到同一位置上所需要的 最小代价 。

示例

  • 示例1 image.png
输入:position = [1,2,3]
输出:1
解释:第一步:将位置3的筹码移动到位置1,成本为0。
第二步:将位置2的筹码移动到位置1,成本= 1。
总成本是1
  • 示例2 image.png
输入: position = [2,2,2,3,3]
输出: 2
解释: 我们可以把位置3的两个筹码移到位置2。每一步的成本为1。总成本= 2
  • 示例3
输入: position = [1,1000000000]
输出: 1

提示

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

解题思路

  • 奇偶性的判断:
    • 加减奇数的步骤,需要花费1
    • 加减偶数的步骤,需要花费0
    • 也就是说偶数的步数,偶数每次+2或者-2,一定能通过花费0到达所有的偶数位置;同样的:奇数每次+2或者-2,一定能通过花费0到达所有的奇数位置;
  • 那么想要将偶数位置的筹码 和 奇数位置的筹码放在同一个位置上,就只需要考虑:是奇数位置+1到偶数位置,花费1;还是偶数位置到奇数位置,花费1
  • 最终问题简化为:所有的奇数位置+1到偶数位置的次数所有的偶数位置+1到奇数位置的次数,两者的最小值,就是最小代价。(注:因为所有的奇数位置移动到奇数位置花费为0,因此你可以想象成先将所有的奇数位置的筹码,放在相同的奇数位置上,花费为0;同理,将所有的偶数位置移动到同一个偶数位置花费为0,那么最后再思考🤔,所有奇数筹码所在的这一个奇数位置 到 所有的偶数筹码所在的这一个偶数位置,是移动奇数到偶数位置还是移动偶数到奇数位置即可!)

特别注意

  • 运算符的优先级,有可能会使结果出错,因此一定要打括号。
  • 例如:position[i] & 1 == 0,&运算符的优先级是低于==的,因此需要给(position[i] & 1)打上括号,或者直接写成position[i] & 1 => odd++, else even++

AC代码

/**
 * @param {number[]} position
 * @return {number}
 */
var minCostToMoveChips = function(position) {
  const n = position.length;
  let odd = 0, even = 0;
  for(let i = 0; i < n; i++) {
    if(position[i] & 1) odd++;
    else even++;
  }
  // console.log(odd, even)
  return Math.min(odd, even);
};