国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

【程序員必會十大算法】之二分查找算法

YFan / 3595人閱讀

摘要:遞歸實現不考慮相同數二分查找,不考慮有相同數的情況遞歸找到了考慮有相同數二分查找考慮有相同元素的情況遞歸要查找的值

1.遞歸實現

①不考慮相同數
/** * 二分查找,不考慮有相同數的情況(遞歸) * @param arr * @param left * @param right * @param findVal * @return */public static int binarySearch(int[] arr,int left,int right,int findVal){    if (left > right || arr[0] > findVal || arr[arr.length - 1] < findVal){        return -1;    }else {        int mid = (left + right) / 2;        if (arr[mid] > findVal){            return binarySearch(arr,left,mid - 1,findVal);        }else if (arr[mid] < findVal){            return binarySearch(arr,mid + 1,right,findVal);        }else {            //找到了            return mid;        }    }}
②考慮有相同數
/** * 二分查找 考慮有相同元素的情況(遞歸) * @param arr * @param left * @param right * @param findVal 要查找的值 * @return */public static ArrayList<Integer> binarySearch1(int[] arr,int left,int right,int findVal){    if (left > right || arr[0] > findVal || arr[arr.length - 1] < findVal){        return null;    }else {        int mid = (left + right) / 2;        if (arr[mid] > findVal){            return binarySearch1(arr,left,mid - 1,findVal);        }else if (arr[mid] < findVal){            return binarySearch1(arr,mid + 1,right,findVal);        }else {            ArrayList<Integer> arrayList = new ArrayList<>();            //先往左走            int midLeft = mid - 1;            while (midLeft >= 0 && arr[midLeft] == findVal){                arrayList.add(midLeft);                midLeft--;            }            Collections.reverse(arrayList);            arrayList.add(mid);            int midRight = mid + 1;            while (midRight < arr.length && arr[midRight] == findVal){                arrayList.add(midRight);                midRight++;            }            return arrayList;        }    }}

2.非遞歸實現

①不考慮有相同數
/** * 二分查找,不考慮有相同數的情況(非遞歸) * @param arr * @param findVal * @return */public static int binarySearch3(int[] arr,int findVal){    int left = 0;    int right = arr.length - 1;    while (left <= right){        int mid = (left + right) / 2;        if (arr[mid] > findVal){            right = mid - 1;        }else if (arr[mid] < findVal){            left = mid + 1;        }else {            return mid;        }    }    return -1;}
②考慮有相同數
/** * 二分查找,考慮有相同數的情況(非遞歸) * @param arr * @param findVal * @return */public static ArrayList<Integer> binarySearch4(int[] arr,int findVal){    int left = 0;    int right = arr.length - 1;    while (left <= right){        int mid = (left + right) / 2;        if (arr[mid] > findVal){            right = mid - 1;        }else if (arr[mid] < findVal){            left = mid + 1;        }else {            ArrayList<Integer> arrayList = new ArrayList<>();            int midLeft = mid - 1;            while (midLeft > 0 && arr[midLeft] == findVal){                arrayList.add(midLeft);                midLeft--;            }            Collections.reverse(arrayList);            arrayList.add(mid);            int midRight = mid + 1;            while (midRight < arr.length && arr[midRight] == findVal){                arrayList.add(midRight);                midRight++;            }            return arrayList;        }    }    return new ArrayList<>();}

完整版

public class Main {    public static void main(String[] args) {        int[] arr = {1,1,2,2,33};            }    /**     * 二分查找,考慮有相同數的情況(非遞歸)     * @param arr     * @param findVal     * @return     */    public static ArrayList<Integer> binarySearch4(int[] arr,int findVal){        int left = 0;        int right = arr.length - 1;        while (left <= right){            int mid = (left + right) / 2;            if (arr[mid] > findVal){                right = mid - 1;            }else if (arr[mid] < findVal){                left = mid + 1;            }else {                ArrayList<Integer> arrayList = new ArrayList<>();                int midLeft = mid - 1;                while (midLeft > 0 && arr[midLeft] == findVal){                    arrayList.add(midLeft);                    midLeft--;                }                Collections.reverse(arrayList);                arrayList.add(mid);                int midRight = mid + 1;                while (midRight < arr.length && arr[midRight] == findVal){                    arrayList.add(midRight);                    midRight++;                }                return arrayList;            }        }        return new ArrayList<>();    }    /**     * 二分查找,不考慮有相同數的情況(非遞歸)     * @param arr     * @param findVal     * @return     */    public static int binarySearch3(int[] arr,int findVal){        int left = 0;        int right = arr.length - 1;        while (left <= right){            int mid = (left + right) / 2;            if (arr[mid] > findVal){                right = mid - 1;            }else if (arr[mid] < findVal){                left = mid + 1;            }else {                return mid;            }        }        return -1;    }    /**     * 二分查找 考慮有相同元素的情況(遞歸)     * @param arr     * @param left     * @param right     * @param findVal 要查找的值     * @return     */    public static ArrayList<Integer> binarySearch1(int[] arr,int left,int right,int findVal){        if (left > right || arr[0] > findVal || arr[arr.length - 1] < findVal){            return null;        }else {            int mid = (left + right) / 2;            if (arr[mid] > findVal){                return binarySearch1(arr,left,mid - 1,findVal);            }else if (arr[mid] < findVal){                return binarySearch1(arr,mid + 1,right,findVal);            }else {                ArrayList<Integer> arrayList = new ArrayList<>();                //先往左走                int midLeft = mid - 1;                while (midLeft >= 0 && arr[midLeft] == findVal){                    arrayList.add(midLeft);                    midLeft--;                }                Collections.reverse(arrayList);                arrayList.add(mid);                int midRight = mid + 1;                while (midRight < arr.length && arr[midRight] == findVal){                    arrayList.add(midRight);                    midRight++;                }                return arrayList;            }        }    }    /**     * 二分查找,不考慮有相同數的情況(遞歸)     * @param arr     * @param left     * @param right     * @param findVal     * @return     */    public static int binarySearch(int[] arr,int left,int right,int findVal){        if (left > right || arr[0] > findVal || arr[arr.length - 1] < findVal){            return -1;        }else {            int mid = (left + right) / 2;            if (arr[mid] > findVal){                return binarySearch(arr,left,mid - 1,findVal);            }else if (arr[mid] < findVal){                return binarySearch(arr,mid + 1,right,findVal);            }else {                //找到了                return mid;            }        }    }}

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/120965.html

相關文章

  • 序員必會十大算法分治算法(漢諾塔問題)

    摘要:應用分治法是一種很重要的算法。字面上的解釋是分而治之,就是把一個復雜的問題分成兩個或更多的相同或相似的子問題,再把子問題分成更小的子問題直到最后子問題可以簡單的直接求解,原問題的解即子問題的解的合并。 ...

    codecraft 評論0 收藏0
  • 序員必會十大算法Prim算法

    摘要:問題勝利鄉有個村莊現在需要修路把個村莊連通各個村莊的距離用邊線表示權比如距離公里問如何修路保證各個村莊都能連通并且總的修建公路總里程最短代碼重點理解中的三層循環 問...

    番茄西紅柿 評論0 收藏2637
  • 序員必會十大算法弗洛伊德算法

    摘要:學習資料迪杰斯特拉計算的是單源最短路徑,而弗洛伊德計算的是多源最短路徑代碼不能設置為,否則兩個相加會溢出導致出現負權創建頂點和邊 學習資料 迪杰斯特拉計算的是單源最...

    JellyBool 評論0 收藏0
  • 序員必會十大算法貪心算法

    摘要:例題假設存在如下表的需要付費的廣播臺,以及廣播臺信號可以覆蓋的地區。 例題 假設存在如下表的需要付費的廣播臺,以及廣播臺信號可以覆蓋的地區。如何選擇最少的廣播臺,讓...

    macg0406 評論0 收藏0
  • 序員必會十大算法騎士周游問題

    摘要:騎士周游問題又叫馬踏棋盤問題未優化前沒有策略定義棋盤的行數和列數定義棋盤上的某個點是否被訪問過記錄是否周游結束從第一行第一列開始走,第一次走算第一步,即展示下是棋盤, ...

    Baoyuan 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<