1. 程式人生 > 其它 >LeetCode 682. Baseball Game

LeetCode 682. Baseball Game

二分查詢的思路分析
使用二分查詢前提是 必須是有序的陣列
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;
        }
    }