题目描述
给出数字K,请输出所有结果小于K的整数组合到一起的最少交换次数。
组合一起是指满足条件的数字相邻,不要求相邻后在数组中的位置。
数据范围:
-
100 <= K <= 100
-
100 <= 数组中数值 <= 100
输入描述
第一行输入数组:1 3 1 4 0
第二行输入K数值:2
输出描述
第一行输出最少交换次数:1
示例1
输入
1 3 1 4 0
2
输出
1
说明
小于2的表达式是1 1 0, 共三种可能将所有符合要求数字组合一起,最少交换1次。
解题思路
例子
1 3 1 4 0
2
- 找到小于 2 的元素:在给定数组
[1, 3, 1, 4, 0]
中,小于 2 的元素是1
,1
, 和0
。所以我们需要将这三个元素组合在一起。 - 组合方式:要将这三个元素组合在一起,可以有多种方式。由于题目没有要求元素必须按照原来的顺序排列,所以我们只关心这些元素最终相邻排列的情况。
- 最少交换次数:
- 原数组是
[1, 3, 1, 4, 0]
。 - 将
1, 1, 0
组合在一起,最少的交换次数为 1:- 例如,可以通过一次交换操作,将位置 4 的
0
与位置 2 的3
交换,得到数组[1, 0, 1, 4, 3]
,使得1, 1, 0
相邻。
- 例如,可以通过一次交换操作,将位置 4 的
- 原数组是
所以,这句话的重点在于,通过最少的交换次数,将三个小于 2 的元素组合在一起(相邻),而这个最少次数在这个例子中是 1。
思路:
-
标记小于 ( K ) 的元素:首先遍历数组,找出所有小于 ( K ) 的元素,标记它们的位置。
-
计算最少交换次数:
- 想象一个窗口,这个窗口长度等于标记元素的数量,窗口可以在数组中滑动。
- 对于窗口中每个可能的位置,计算窗口内已经包含的目标元素数量(即窗口内小于 ( K ) 的元素数量)。
- 窗口中包含最多目标元素的位置意味着需要的交换次数最少。交换次数等于窗口大小减去窗口内目标元素的数量。
给定数组为
[1, 3, 1, 4, 0]
,( K ) 值为 2。小于 2 的元素是1
,1
,0
。- 这些元素的索引是
[0, 2, 4]
。 - 可以把这些元素想象为需要放在一个长度为 3 的窗口中。
- 滑动这个窗口,尝试找到包含最多目标元素的窗口。例如,如果窗口覆盖
1, 3, 1
,那么窗口已经包含两个目标元素,还需要一个交换将0
换入窗口。 - 找到一个位置,比如
[1, 1, 0]
,只需要交换一次就可以将所有小于 2 的元素组合在一起。
所以,最少交换次数是 1。