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

資訊專(zhuān)欄INFORMATION COLUMN

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

YFan / 3603人閱讀

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

1.遞歸實(shí)現(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.非遞歸實(shí)現(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)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/120965.html

相關(guān)文章

  • 序員必會(huì)十大算法分治算法(漢諾塔問(wèn)題)

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

    codecraft 評(píng)論0 收藏0
  • 序員必會(huì)十大算法Prim算法

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

    番茄西紅柿 評(píng)論0 收藏2637
  • 序員必會(huì)十大算法弗洛伊德算法

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

    JellyBool 評(píng)論0 收藏0
  • 序員必會(huì)十大算法貪心算法

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

    macg0406 評(píng)論0 收藏0
  • 序員必會(huì)十大算法騎士周游問(wèn)題

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

    Baoyuan 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<