問題描述: 對應函式 find_two
快速找出陣列中的兩個數字,讓這兩個數字之和等於給定的數字。
想法:
如果把任意兩個數字組合進行嘗試的話,運算量是n*n不適合。
先將陣列進行排序,然後從兩頭分別取數字進行組合,如果和大於目標數字則在大數字側找下乙個稍小一點的數字。
如果和小於目標數字則在小數字側找下乙個稍大一點的數字
擴充套件問題 1: 對應函式 find_three
快速找出陣列中的三個數字,讓這兩個數字之和等於給定的數字。
擴充套件問題 2: 對應函式 find_three_near
快速找出陣列中的三個數字,讓這兩個數字之和等於給定的數字或找到最接近的解。
想法:
想法與找兩個數字類似,先找到一大一小的兩個終點,然後用游標在這兩個終點間進行遍歷,尋找第三個數,使他們的和接近或等於目標數字。
#include #include using namespace std;
void swap(int &a, int &b)
void quick_sort(int* parr, int lpos, int rpos)
if ((parr[j] > mid_val) && (i < j))
if (i < j)
}mid_pos = j;
quick_sort(parr, lpos, mid_pos);
quick_sort(parr, mid_pos+1, rpos);
}bool find_two(int arr, int len, int num)
if (result)
cout << num << " = " << arr[i] << " + " << arr[j] << endl;
else
cout << "none" << endl;
return result;
}bool find_three(int arr, int len, int num)
}j--;
}if (bfound)
cout << endl;
}else
cout << "none" << endl;
return bfound;
}bool find_three_near(int arr, int len, int num)
else if (min > abs((sum + arr[curr] - num)))
}j--;
}if (!bfound)
cout << "not found near value=" << min <> len;
}
程式設計之美 尋找滿足條件的兩個數
方法一 直接兩層迴圈 o n n find sum.cpp 定義控制台應用程式的入口點。include stdafx.h include void find sum int a,int n int sum,int first,int second return false int tmain int...
快速尋找滿足條件的兩個數(程式設計之美)
快速找出乙個陣列中的兩個數,讓此兩個數之和等於乙個給定的數。如 5 6 1 4 7 9 8 中找出兩個數之和等於10的數 程式設計之美之美p177有詳細解答過程,思路是先排序 o nlog n 然後儲存兩個指標beg end,初始指向頭部和尾部,如過 beg end sum,則返回 如果 beg e...
程式設計之美 快速尋找滿足條件的兩個數
能否快速找出乙個陣列中的兩個數字,讓這兩個數字之和等於乙個給定的值,為了簡化起見,我們假設這個陣列中肯定存在至少一組符合要求的解。法一 最直接的方法就是,窮舉法,複雜度為o n 2 法二 利用sum減去a i 再查詢sum a i 是否在陣列裡,這時候就變成查詢了,可利用二分查詢 排序的複雜度為o ...