LeetCode 682. Baseball Game
阿新 • • 發佈:2022-03-26
二分查詢的思路分析
使用二分查詢前提是 必須是有序的陣列
1.首先確定該陣列的中間的下標mid = (left+right)/ 2
2.然後讓需要查詢的數findval和arr[mid]比較
3. 1 findval>arr[mid],說明你要查詢的數在mid的右邊,因此需要遞迴的向右查詢2.2 findval<arr[mid],說明你要查詢的淡在mid的左邊,因此需要遞迴的向左查詢2.3 findvalmm arr[mid]說明找到,就返回
什麼時候我們需要結束遞迴
1)找到就結束遞迴
2)遞迴完整個陣列,仍然沒有找到需要查詢的值,也需要結束遞迴。當左索引 > 右索引就需要退出
程式碼實現
/** * 二分查詢 * 注意:二分查詢的前提 必須是該陣列是有序的 * @param arr 陣列 * @param left 左邊索引 * @param right 右邊索引 * @param findVal 查詢的值 * @return */ public static ArrayList<Integer> binarySearchYH(int []arr, int left, int right, int findVal){ //當 left > right時,說明遞迴整個陣列,但是沒有找到 if(left > right){ return new ArrayList<>(); } int mid = (left + right) / 2; int midVal = arr[mid]; if (findVal > midVal){ //向右遞迴 return binarySearchYH(arr,mid + 1,right,findVal); } else if(findVal < midVal){ //向左遞迴 return binarySearchYH(arr,left,mid - 1,findVal); } else { //思路分析 //在找到mid 素引值,不要馬上返回 //向mid索引值的左邊掃描,將所有滿足findVal的元素的下標,加入到集合ArrayList //向mid索引值的右邊掃描,將所有滿足findVal的元素的下標,加入到集合ArrayList //將Arraylist返回 ArrayList<Integer> list = new ArrayList<>(); //向左掃描所有滿足條件的加入集合 int temp = mid - 1; while (true){ //當向左掃描時,下標小於0時或者值與查詢值不符時退出 if (temp < 0 || arr[temp] != findVal){ break; } list.add(temp); temp -= 1;//向左查詢 左移 } list.add(mid); //向右掃描所有滿足條件的加入集合 temp = mid + 1; while (true){ //當向右掃描時,下標大於陣列長度-1時時或者值與查詢值不符時退出 if (temp > arr.length - 1 || arr[temp] != findVal){ break; } list.add(temp); temp += 1;//向右查詢右移 } return list; } }