华为OD机试E卷 - 最少交换次数(Java & Python& JS & C++ & C )

题目描述

给出数字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
  1. 找到小于 2 的元素:在给定数组 [1, 3, 1, 4, 0] 中,小于 2 的元素是 1, 1, 和 0。所以我们需要将这三个元素组合在一起。
  2. 组合方式:要将这三个元素组合在一起,可以有多种方式。由于题目没有要求元素必须按照原来的顺序排列,所以我们只关心这些元素最终相邻排列的情况。
  3. 最少交换次数
    • 原数组是 [1, 3, 1, 4, 0]
    • 1, 1, 0 组合在一起,最少的交换次数为 1:
      • 例如,可以通过一次交换操作,将位置 4 的 0 与位置 2 的 3 交换,得到数组 [1, 0, 1, 4, 3],使得 1, 1, 0 相邻。

所以,这句话的重点在于,通过最少的交换次数,将三个小于 2 的元素组合在一起(相邻),而这个最少次数在这个例子中是 1。

思路

  1. 标记小于 ( K ) 的元素:首先遍历数组,找出所有小于 ( K ) 的元素,标记它们的位置。

  2. 计算最少交换次数

    • 想象一个窗口,这个窗口长度等于标记元素的数量,窗口可以在数组中滑动。
    • 对于窗口中每个可能的位置,计算窗口内已经包含的目标元素数量(即窗口内小于 ( 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。

写法1

J

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

算法大师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值