排序仅含0、1、2的数组时出现超时运行错误求助
解决仅含0、1、2数组排序的超时问题
你的代码出现超时(Time Limit Exceeded)的核心原因是在while循环内部重新定义了局部变量high,覆盖了函数开头声明的high变量。每次循环时,high都会被重置为n-1,导致处理元素2时,high--的操作完全无效,程序陷入无限循环,最终超时。
错误代码的关键问题行
循环内的这行代码直接导致了死循环:
int high = n-1;
这行代码会创建一个新的局部high,和外层的high不是同一个变量,外层的high根本没被修改,循环条件mid < high永远满足,程序无法退出循环。
修正后的代码
class Solution { public: void sort012(int a[], int n) { int low = 0; int high = n-1; int mid = 0; while(mid <= high) { if(a[mid] == 0) { swap(a[mid++], a[low++]); } else if(a[mid] == 2) { swap(a[mid], a[high--]); // 交换过来的元素可能是0或1,需留在当前位置重新检查,所以mid不递增 } else // 处理元素1的情况 { mid++; } } } };
修正要点说明
- 移除循环内重复定义的
int high = n-1;,确保外层的high能正常递减,控制循环边界。 - 将循环条件从
mid < high改为mid <= high,避免遗漏mid和high指向同一元素的情况。 - 处理元素2时不递增
mid:交换到mid位置的元素可能是0或1,需要重新检查,不能直接跳过。 - 移除多余的
mid <= high判断,循环条件已经保证了该范围,简化代码逻辑。
内容的提问来源于stack exchange,提问作者Mugdha Monga
相关产品推荐
相关产品推荐

