C++ 查詢陣列中重複的值——二分法
阿新 • • 發佈:2019-01-03
一,題目描述
題目描述:
在一個長度為n的數組裡的所有數字都在0到n-1的範圍內。 陣列中某些數字是重複的,但不知道有幾個數字是重複的。也不知道每個數字重複幾次。請找出陣列中任意一個重複的數字。 例如,如果輸入長度為7的陣列{2,3,1,0,2,5,3},那麼對應的輸出是重複的數字2或者3。
二,思路
2.1法一:
新建一個空陣列,根據值將數字放入對應下標中,在儲存的過程中容易找到重複的數字,該方法的不足之處在於會加入O(n)的空間複雜度
2.2法二:
採用二分法來來查詢陣列中二分割槽間數字的個數
三,二分法的要點
1,變數為區間,不斷縮小的區間是最終找到重複數字的關鍵點
2,迴圈整個陣列,找到某一區間的計數值
四,程式
int getDuplication(const int* numbers, int length) { int begin = 1; int end = length ; while(end >= begin) { int medium = ((end - begin)>>1)+begin; cout << "區間變化為:"<<begin <<"和"<< medium << endl; int num = 0; if(begin == end) { if(num >1) return begin; else break; } num = getcount(numbers,length,begin,medium); if(num > (medium - begin + 1)) { end = medium ; } else begin = medium + 1; } } int getcount(const int* numbers,int length,int begin,int end) { int count =0; for(int i = 0; i<length;i++) { if (numbers[i] <= end && numbers[i]>= begin) count++; } return count; cout << "計數值為:" <<endl; }
五,測試用例
int _tmain(int argc, _TCHAR* argv[])
{
int num[] = {2,1,3,4,4,5,6};
int *numa = num;
int counta = getDuplication(numa,6);
cout << "重複數字為:"<<counta << endl;
return 0;
}
輸出結果為:
區間變化為:1和3
區間變化為:4和5
區間變化為:4和4
區間變化為:4和4
重複數字為:4