携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第1天,点击查看活动详情
每日刷题 2022.07.27
- leetcode原题链接:leetcode.cn/problems/mi…
- 难度:简单
- 方法:数学
题目
- 有 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 <= 1001 <= 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);
};