玩筹码

85 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第 34 天,点击查看活动详情

问题描述

有 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 <= position.length <= 100
  • 1 <= position[i] <= 10^9

思路分析

首先我们要先理解一下题目的意思,题目会给我们一个数组,数组中记录了每一个硬币的位置,我们需要将所有硬币移动到同一个位置上,而且移动硬币我们需要付出对应的代价,移动代价的具体规则如下:

  • position[i] + 2 或 position[i] - 2 ,此时 cost = 0
  • position[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);
};

说在后面

本人为算法业余爱好者,平时只是随着兴趣偶尔刷刷题,如果上面分享有错误的地方,欢迎指出,感激不尽。