統計乙個數字在排序陣列中出現的次數。例如,輸入排序陣列和數字3由於3在這個陣列中出現了4次,因此輸出4。
題目解法很多,關鍵是要找到讓人滿意的方法,直接統計當然可以,可是顯然不是我們要的答案。比較好的思路如下:
使用二分查詢的拓展,當查詢的元素有重複的時,找到元素的第乙個和最後乙個。這樣將可以計算出該元素有多少個重複的了。二分法在陣列中查詢乙個合乎要求的數字時間複雜度是o(logn),因此總的時間複雜度也只有o(logn)。
int getfirstk(int *data, int length, int k, int start, int end)
else
} else
if (middledata>k)
else
start=middleindex+1;
//遞迴
return getfirstk(data,length,k,start,end);
} //同樣的思路,遞迴找到最後的乙個k
int getendk(int *data, int length, int k, int start, int end)
else
start=middleindex+1;
} else
if (middledata>k)
else
return getendk(data,length,k,start,end);
} //計算出k在陣列中出現的次數
int getnumofk(int *data, int length, int k)
} return
number;
}
上面的採用了遞迴,下面採用迴圈效果更好,但解題思路一樣。
#include
#include
//全域性變數
int arr = ; //測試陣列
int size = sizeof(arr) / sizeof(*arr); //陣列元素個數
int getupper(int arr, int key)
// 返回最後出現位置
return low;
}int getlower(int arr, int key)
//返回第一次出現位置
return low;
} int main()
劍指offer面試題目 醜數
把只包含因子2 3和5的數稱作醜數 ugly number 例如6 8都是醜數,但14不是,因為它包含因子7。習慣上我們把1當做是第乙個醜數。求按從小到大的順序的第n個醜數。輸入 輸入包括乙個整數n 1 n 1500 輸出 可能有多組測試資料,對於每組資料,輸出第n個醜數。方法一 最簡單的思路是,從...
劍指offer 面試題三 題目二
在乙個長度為n 1的陣列裡的所有數字都在1到n的範圍內,所以陣列中至少有乙個數字是重複的。請找出陣列中任意乙個重複的數字,但不能修改輸入的陣列。例如,如果輸入長度為8的陣列,那麼對應的輸出是重複的數字2或者3。我們新建乙個陣列,將陣列中的每乙個數字m,放到新陣列下標為m的位置,如果有重複,說明有重複...
劍指offer面試題7
面試題7 用兩個棧實現佇列 using namespace std template class cqueue 預備知識 佇列 佇列也是一種常見的資料結構 特點是先進先出 fifo 在stl中有stack和queue兩個容器 template class stack 成員函式 empty size ...