Minimum Swaps To Make Sequences Increasing 使序列递增的最小交换次数

本文介绍了一个算法问题,即计算使两个整数数组均变为严格递增所需的最小交换次数。通过动态规划方法,维护两个记录最小交换次数的数组,并详细解析了不同情况下的更新逻辑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我们有两个长度相等且不为空的整型数组 A 和 B 。

我们可以交换 A[i] 和 B[i] 的元素。注意这两个元素在各自的序列中应该处于相同的位置。

在交换过一些元素之后,数组 A 和 B 都应该是严格递增的(数组严格递增的条件仅为A[0] < A[1] < A[2] < ... < A[A.length - 1])。

给定数组 A 和 B ,请返回使得两个数组均保持严格递增状态的最小交换次数。假设给定的输入总是有效的。

示例:
输入: A = [1,3,5,4], B = [1,2,3,7]
输出: 1
解释: 
交换 A[3] 和 B[3] 后,两个数组如下:
A = [1, 3, 5, 7] , B = [1, 2, 3, 4]
两个数组均为严格递增的。

注意:

  • A, B 两个数组的长度总是相等的,且长度的范围为 [1, 1000]
  • A[i], B[i] 均为 [0, 2000]区间内的整数。

思路:这道题采用动态规划,维护两个数组swapOperation表示对于第i个元素A和B,最小的交换次数是我们交换A[i]和B[i],fixOperation表示对于第i个元素A和B,最小的交换次数是我们不交换A[i]和B[i]。

来看下面这个例子:

index               0    1    2    3    4
A                   1    3    5    4    9
B                   1    2    3    7    10   
swapRecord          1    1    2    1    2
fixRecord           0    0    0    2    1

我们来看是如何更新swapOperation和fixOperation的,首先初始化swapOperation=1,fixOperation=0

对于i=1,是否交换都可以(后面会解释为什么),所以我们取前面两个操作最小的值,min=min(swapOperation,fixOperation)=0,所以swapOpearition=min+1=1,fixOperation=min=0

对于i=2,由于A[1]>=B[2],所以A[2]和B[2]的操作应该和A[1]和B[1]一样,因为A[1]>=B[2],所以B[2]不能和A[1]在一个数组中,即如果A[1],B[1]交换了,那么A[2]和B[2]也必须交换,这样才能保证A[1]和B[2]不在一个数组里。所以在这种情况下:swapOperation=swapOpration+1,fixOperation=fixOperation

对于i=3,由于A[2]>=A[3]所以A[2]和A[3]不能在一个组里,根据上面的解释A[3]和A[2]应该是相反的操作,所以swapOperation=fixOperation+1,fixOperation=swapOperation

对于i=4,由于都不满足上面的条件,所以交不交换都可以,但是定义的swapOperation是对于第i个元素必须交换,fixOperation是一定不交换,所以swapOperaion可以在上一次i-1次即swapOperation和fixOperation中选择一个较小的值然后加1(加一代表这次一定交换),而fixOperation直接选取较小的值即可。

经过上面的分析,最后返回swapOperation和fixOperation中较小的那个值即可。

参考代码:

class Solution {
public:
    int minSwap(vector<int>& A, vector<int>& B) {
	int swapOperation = 1;
	int fixOperation = 0;
	int n = A.size();
	for (int i = 1; i < n; i++) {
		if (A[i - 1] >= B[i] || B[i - 1] >= A[i]) {
			swapOperation++;
			fixOperation = fixOperation;
		}
		else if (A[i - 1] >= A[i] || B[i - 1] >= B[i]) {
			int tmp = swapOperation;
			swapOperation = fixOperation + 1;
			fixOperation = tmp;
		}
		else {
			int tmp = min(swapOperation, fixOperation);
			swapOperation = tmp + 1;
			fixOperation = tmp;
		}
	}
	return min(swapOperation,fixOperation);        
    }
};









### 华为OD模式 E卷 算法 最小交换次数 数据结构 #### 问题解析 华为OD模式下的E卷涉及的最小交换次数问题是典型的算法优化问题,通常与数组操作、排序以及特定条件下元素位置调整有关。该问题的核心在于如何通过最少的操作次数实现目标状态。具体到引用中的描述[^2],其核心逻辑是从给定范围内找到满足条件的最佳子区间。 此类问题一般可以通过滑动窗口技术解决,这是一种高效的线性时间复杂度方法,适用于处理连续子序列的相关约束问题。以下是针对这一问题的具体解决方案: --- #### 解决方案设计 为了求解最小交换次数问题,可以采用如下策略: 1. **定义变量** 定义 `count` 表示需要保留的目标数量;`k` 是判断标准阈值;`minIdx` 和 `maxIdx` 则分别表示范围内的起始和结束索引。 2. **预处理输入数据** 遍历整个数组并统计大于 `k` 的元素总数作为初始交换成本。这一步骤有助于后续比较不同子区间的优劣。 3. **应用滑动窗口算法** 使用双指针维护一个固定大小为 `count` 的窗口,动态更新其中不符合条件的元素数目(即小于等于 `k` 的部分)。每次移动右边界扩展新区域的同时收缩左边界保持窗口尺寸不变。 4. **记录最优结果** 记录过程中遇到的最大符合条件的数量对应的最小不合法项数差额,从而得出全局意义上的最佳答案。 --- #### 示例代码实现 以下是基于Python语言的一种可能实现方式: ```python def min_swaps_to_cluster(arr, k, count): n = len(arr) # Step 1: Count the total number of elements greater than 'k' valid_count_total = sum(1 for num in arr if num > k) # If there are fewer valid numbers than required by 'count', it's impossible. if valid_count_total < count: return -1 # Step 2: Initialize sliding window variables current_valid_in_window = 0 max_valid_in_any_window = 0 # Sliding Window Technique for right in range(n): if arr[right] > k: current_valid_in_window += 1 # Ensure that our window size does not exceed 'count'. if right >= count: if arr[right - count] > k: current_valid_in_window -= 1 # Update maximum valid items found within any window so far. if right >= count - 1: max_valid_in_any_window = max(max_valid_in_any_window, current_valid_in_window) # The minimum swaps needed is simply how many more we need to reach 'count' from best case scenario. return count - max_valid_in_any_window # Example Usage if __name__ == "__main__": array_example = [2, 8, 5, 6, 9, 3] threshold_k = 4 target_count = 3 result = min_swaps_to_cluster(array_example, threshold_k, target_count) print(f"Minimum Swaps Required: {result}") ``` 上述程序实现了利用滑动窗口寻找指定长度内最大有效数值的方法,并据此推导出所需的最小交换次数[^2]。 --- #### 复杂度分析 - 时间复杂度:O(N),因为只需遍历一次数组完成所有必要计算。 - 空间复杂度:O(1),除了几个计数器外无需额外存储空间。 这种高效的方式非常适合大规模数据集上的快速评估需求。 --- #### 总结 综上所述,对于华为OD模式下关于E卷中提到的最小交换次数问题,借助滑动窗口技巧能够优雅而简洁地解决问题。这种方法不仅具备理论上的优越性能表现,而且易于理解和实际部署实施。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值