def min_swaps_to_group_less_than_k(Q, K):
# 将输入的数字字符串按空格分割并转换为整数列表
nums = list(map(int, Q.split()))
# 找到所有小于K的数字
target_nums = [num for num in nums if num < K]
total_target = len(target_nums)
if total_target == 0:
return 0 # 如果没有小于K的数字,不需要交换
# 滑动窗口,窗口大小为total_target
max_target_in_window = 0
current_target_in_window = 0
# 初始化窗口
for i in range(total_target):
if nums[i] < K:
current_target_in_window += 1
max_target_in_window = current_target_in_window
# 滑动窗口
for i in range(total_target, len(nums)):
if nums[i - total_target] < K:
current_target_in_window -= 1
if nums[i] < K:
current_target_in_window += 1
max_target_in_window = max(max_target_in_window, current_target_in_window)
# 最小交换次数为总目标数减去窗口内最大目标数
return total_target - max_target_in_window
# 自定义输入
Q = input("请输入数组Q(数字间用空格分开):")
K = int(input("请输入K数值:"))
# 计算并输出最少交换次数
result = min_swaps_to_group_less_than_k(Q, K)
print("最少交换次数:", result)
- 识别目标数字:首先,我们需要识别数组中所有小于K的数字。这些数字是我们需要组合在一起的目标。
- 滑动窗口:我们可以使用滑动窗口的方法来找到一个窗口,其中包含所有目标数字,并且窗口的大小等于目标数字的总数。我们的目标是找到这样一个窗口,使得窗口外的目标数字最少,这样我们就可以通过最少的交换次数将它们移动到窗口内。
- 计算交换次数:对于每个可能的窗口,我们计算需要将多少个目标数字移动到窗口内。这个数量就是我们需要的最小交换次数。
Tags:less 计算