复习了快速排序。 另外还有一个比较大的收获是:对于返回两个下标的题目,使用先排序,再用两个游标分别从数组的两端进行遍历的方法可以达到O(N)的时间复杂度。 本题的主要思路就沿着这个想法展开,代码如下: //编程之美,快速寻找满足条件的两个数字 #include <iostream> using namespace std; bool FindTwoNumber(int *iArray, int length, int aimNum, int &x, int &y); int main() { int aim = 11; int iArray[] = {1,2,45,7,4,6,9,8,56,10,25,56,11,34}; int x,y; if(FindTwoNumber(iArray,sizeof(iArray)/sizeof(int),aim,x,y)) cout<<"A["<<iArray[x]<<","<<iArray[y]<<"] can be added to "<<aim<<endl; return 0; } int Patition(int *iArray, int bg, int end) { //random to avoid the worst situation int x = abs(rand()%(end-bg)+bg); int t = iArray[end]; iArray[end] = iArray[x]; iArray[x] = t; x = iArray[end]; int i = bg - 1; for (int j = bg; j<end; ++j) { if (iArray[j]<=x) { ++i; t = iArray[j]; iArray[j] = iArray[i]; iArray[i] = t; } } t = iArray[i+1]; iArray[i+1] = iArray[end]; iArray[end] = t; return i+1; } void QuickSort(int *iArray, int bg, int end) { if (bg>=end) return; int mid = Patition(iArray, bg, end); QuickSort(iArray,0,mid-1); QuickSort(iArray,mid+1,end); } bool FindTwoNumber(int *iArray, int length, int aimNum, int &x, int &y) { QuickSort(iArray,0,length-1); for (int i = 0, j = length -1; i<j;) { if (aimNum == iArray[i] + iArray[j]) { x = i; y = j; return true; } else if (aimNum > iArray[i] + iArray[j]) ++i; else --j; } return false; }