思路:改進運用二分查詢
接下來我們思考如何更好地利用二分查詢演算法。假設我們是統計數字k在排序陣列**現的次數。在前面的演算法中時間主要消耗在如何確定重複出現的數字的第乙個k和最後乙個k的位置上,有沒有可能用二分查詢演算法直接找到第乙個k及最後乙個k呢?
我們先分析如何用二分查詢演算法在陣列中找到第乙個k。二分查詢演算法總是先拿陣列中間的數字和k作比較。如果中間的數字比k大,那麼k只有可能出現在陣列的前半段,下一輪我們只在陣列的前半段查詢就可以了。如果中間的數字比k小,那麼k只有可能出現在陣列的後半段,下一輪我們只在陣列的後半段查詢就可以了。如果中間的數字和k相等呢?我們先判斷這個數字是不是第乙個k。如果位於中間數字的前面乙個數字不是k,此時中間的數字剛好就是第乙個k。如果中間數字的前面乙個數字也是k,也就是說第乙個k肯定在陣列的前半段,下一輪我們仍然需要在陣列的前半段查詢。
package chapter6;
public class p263_numberofk else
}else if(arr[mid]>target)else
}return -1;
}public static int getlast(int arr,int target)else
}return -1;
}public static int findnumbersofk2(int arr,int target)
public static void main(string args);
int data1=;
int data2=;
system.out.println(findnumbersofk(data,target));
system.out.println(findnumbersofk(data1,target));
system.out.println(findnumbersofk(data2,target));
system.out.println(findnumbersofk2(data,target));
system.out.println(findnumbersofk2(data1,target));
system.out.println(findnumbersofk(data2,target));
}}
測試用例:
a.功能測試(陣列中包含要查詢的數字;;陣列中沒有要查詢的數字;要查詢的數字在陣列**現一次或者多次)。
b.邊界值測試(查詢陣列在的最大值、最小值;陣列中只有乙個數字)。
c.特殊輸入測試(表示陣列的指標為nullptr指標)。
參考:
劍指offer 面試題53 在排序陣列中查詢數字
問題1 統計乙個數字在排序陣列 現的次數。輸入 陣列 輸出 次數 思路 由於在排序陣列中,可以使用二分查詢。注意加1減1細節。class solution else if target datamiddle start indexmiddle 1 else end indexmiddle 1 ret...
劍指offer面試題7
面試題7 用兩個棧實現佇列 using namespace std template class cqueue 預備知識 佇列 佇列也是一種常見的資料結構 特點是先進先出 fifo 在stl中有stack和queue兩個容器 template class stack 成員函式 empty size ...
劍指offer面試題11
面試題1 數值的整數的次方 題目 實現函式double power double base,int exponent 求base的 exponent次方。不得使用庫函式,同時不需要考慮大數問題。思路 首先應該明確指數的可能取值 正整數,0,負整數 另外還需要考慮底數是0的情形。對於負整指數,我們可以...