C语言中交换顺序为何影响minimum-swaps-2算法的执行效率?
为什么交换顺序不同会导致Minimum Swaps 2问题的超时?
这是个典型的变量赋值顺序引发的逻辑错误,看似只是交换步骤的顺序变了,实际上直接导致了无限循环,最终触发超时。咱们来拆解两种交换逻辑的核心差异:
首先看你最初的超时代码里的交换逻辑:
int temp = arr[i]; arr[i] = arr[arr[i] - 1]; arr[arr[i] - 1] = temp;
再对比修复后的正确逻辑:
int temp = arr[arr[i] - 1]; arr[arr[i] - 1] = arr[i]; arr[i] = temp;
关键差异:下标计算时的arr[i]值是否被篡改
第一种错误逻辑的问题出在第二步修改了arr[i]的值,导致第三步的下标计算用的是修改后的值,完全偏离了原本要交换的目标位置:
- 第一步把
arr[i]的原始值存在temp里没问题; - 第二步执行
arr[i] = arr[arr[i]-1]后,arr[i]已经变成了目标位置的元素值; - 第三步的
arr[arr[i]-1]里,arr[i]已经不是最初的那个值了,这就导致你把temp放到了错误的位置,原本应该归位的元素根本没回到正确的地方。
举个实际例子,假设数组是[3,1,2],当i=0时:
- 错误逻辑的执行流程:
temp = arr[0] = 3arr[0] = arr[3-1] = arr[2] = 2→ 数组变成[2,1,2]arr[arr[0]-1] = arr[2-1] = arr[1] = 3→ 数组变成[2,3,2]
这时候arr[0]是2,不等于i+1=1,循环会一直卡在i=0的位置,无限重复这个错误的交换,永远无法推进循环,最终超时。
而第二种正确逻辑里,所有用到arr[i]作为下标的操作,都是在arr[i]被修改之前完成的:
- 第一步先把目标位置(
arr[i]-1)的元素存到temp; - 第二步把
arr[i]放到目标位置,这里的arr[i]-1还是原始的目标下标(因为arr[i]还没被修改); - 第三步再把
temp放到arr[i],完成正确交换。
还是用刚才的[3,1,2]例子,i=0时:
- 正确逻辑的执行流程:
temp = arr[3-1] = arr[2] = 2arr[2] = arr[0] = 3→ 数组变成[3,1,3]arr[0] = temp = 2→ 数组变成[2,1,3]
这时候arr[0]是2≠1,继续循环交换,直到把元素归位,循环可以正常推进,不会卡住。
总结
第一种交换顺序因为提前修改了arr[i],导致后续的下标计算错误,元素无法被放到正确的位置,循环陷入无限执行状态,最终超时;第二种交换顺序保留了arr[i]的原始值用于目标位置的计算,交换逻辑完全正确,循环可以正常结束。
内容的提问来源于stack exchange,提问作者Ashok Sharma
相关产品推荐
相关产品推荐

