这是小川的第421次更新,第454篇原创
看题和准备
今天介绍的是LeetCode算法题中Easy级别的第270题(顺位题号是1217)。There are some chips, and the i-th
chip is at position chips[i]
.
You can perform any of the two following types of moves any number of times (possibly zero) on any chip:
- Move the i-th chip by 2 units to the left or to the right with a cost of 0.
- Move the i-th chip by 1 unit to the left or to the right with a cost of 1.
There can be two or more chips at the same position initially.
Return the minimum cost needed to move all the chips to the same position (any position).
Example 1:
Input: chips = [1,2,3]
Output: 1
Explanation: Second chip will be moved to positon 3 with cost 1. First chip will be moved to position 3 with cost 0. Total cost is 1.
Example 2:
Input: chips = [2,2,2,3,3]
Output: 2
Explanation: Both fourth and fifth chip will be moved to position two with cost 1. Total minimum cost will be 2.
Constraints:
- 1 <= chips.length <= 100
- 1 <= chips[i] <= 10^9
中文翻译
有一些芯片,第i
个芯片位于位置chips[i]
。
你可以在任何芯片上多次执行以下两种类型的任何一种移动(也可能为零次):
- 将第
i
个芯片向左或向右移动2个单位,成本为0。 - 将第
i
个芯片向左或向右移动1个单位,成本为1。
最初时,在同一位置可以有两个或多个芯片。返回将所有芯片移至同一位置(任何位置)所需的最低成本。
例如:
输入:chips = [1,2,3]
输出:1
说明:第二个芯片将以成本1移至位置3。第一个芯片将以成本0移至位置3。总成本为1。
输入:chips = [2,2,2,3,3]
输出:2
说明:第四和第五芯片都将移动到成本为1的位置2。最低总成本为2。
限制条件:
- 1 <= chips.length <= 100
- 1 <= chips[i] <= 10^9
第一种解法
一开始看题目,看的我一脸懵逼,这是个神马题目介绍?
开始认为是移动元素到固定的一个索引位置上,计算移动的最小成本,给的例子倒也能解释,但是在试了其他几组数据后,比如数组{1,3,5}
,结果是0,与我设想的结果1对不上,思路是错的,肯定是理解错了题目的意思。没办法,只能继续理解题意和用随机数组验证思路了。在明白题目究竟想要我们做啥后,只想来一句,我服了you!
回归正题,我们一起来看看这个题目的真面目。如果将题目中positon
字眼,换成value
,你就会很快明白题目在讲什么了。
给了一个数组,其中元素都是大于等于1的正整数,可以对数组中的任意元素进行两种操作:将元素值加2或减2,成本为0;将元素值加1或减1,成本为1。这两种操作都可以进行多次,现在要将数组中的元素值全部变为一个值,请问最低的成本是多少?
结合题目中的第二个例子来看,[2,2,2,3,3]
,有3个2,2个3,有两种办法,可以将这5个数统一,第一是3个2都变3,成本是3;第二个办法是2个3都变为2,成本是2,所以最小成本是2,也就是将2个3变为2。再来一个,比如[1,3,5]
,将3减去2变为1,成本为0,将5减两次2,也变为1,成本为0,最后总成本是0。
所以,这个问题本质上是计算数组中奇数和偶数的个数。
- 如果数组元素全部为偶数,全变成2,成本为0。
- 如果数组元素全部为奇数,全变成1,成本为0。
- 如果奇数元素个数大于偶数元素个数,将偶数元素加1全变为奇数,成本是偶数元素的个数。
- 如果奇数元素个数小于偶数元素个数,将奇数元素加1全变为偶数,成本是奇数元素的个数。
public int minCostToMoveChips(int[] chips) {
int even = 0, odd = 0;
for (int chip : chips) {
if (chip%2 == 0) {
even++; //偶数元素个数
} else {
odd++; //奇数元素个数
}
}
return odd > even ? even : odd;
}
小结
算法专题目前已更新LeetCode算法题文章276+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。
以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、在看就是对我最大的回报和支持!