You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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]的值,导致第三步的下标计算用的是修改后的值,完全偏离了原本要交换的目标位置:

  1. 第一步把arr[i]的原始值存在temp里没问题;
  2. 第二步执行arr[i] = arr[arr[i]-1]后,arr[i]已经变成了目标位置的元素值;
  3. 第三步的arr[arr[i]-1]里,arr[i]已经不是最初的那个值了,这就导致你把temp放到了错误的位置,原本应该归位的元素根本没回到正确的地方。

举个实际例子,假设数组是[3,1,2],当i=0时:

  • 错误逻辑的执行流程:
    • temp = arr[0] = 3
    • arr[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]被修改之前完成的:

  1. 第一步先把目标位置(arr[i]-1)的元素存到temp;
  2. 第二步把arr[i]放到目标位置,这里的arr[i]-1还是原始的目标下标(因为arr[i]还没被修改);
  3. 第三步再把temp放到arr[i],完成正确交换。

还是用刚才的[3,1,2]例子,i=0时:

  • 正确逻辑的执行流程:
    • temp = arr[3-1] = arr[2] = 2
    • arr[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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 17:57:31