成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

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

YFan / 3605人閱讀

摘要:遞歸實現(xiàn)不考慮相同數(shù)二分查找,不考慮有相同數(shù)的情況遞歸找到了考慮有相同數(shù)二分查找考慮有相同元素的情況遞歸要查找的值

1.遞歸實現(xiàn)

①不考慮相同數(shù)
/** * 二分查找,不考慮有相同數(shù)的情況(遞歸) * @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;        }    }}
②考慮有相同數(shù)
/** * 二分查找 考慮有相同元素的情況(遞歸) * @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.非遞歸實現(xiàn)

①不考慮有相同數(shù)
/** * 二分查找,不考慮有相同數(shù)的情況(非遞歸) * @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;}
②考慮有相同數(shù)
/** * 二分查找,考慮有相同數(shù)的情況(非遞歸) * @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};            }    /**     * 二分查找,考慮有相同數(shù)的情況(非遞歸)     * @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<>();    }    /**     * 二分查找,不考慮有相同數(shù)的情況(非遞歸)     * @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;            }        }    }    /**     * 二分查找,不考慮有相同數(shù)的情況(遞歸)     * @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;            }        }    }}

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/120965.html

相關(guān)文章

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

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

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

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

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

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

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

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

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

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

    Baoyuan 評論0 收藏0

發(fā)表評論

0條評論

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