摘要:遞歸實(shí)現(xiàn)不考慮相同數(shù)二分查找,不考慮有相同數(shù)的情況遞歸找到了考慮有相同數(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; } }}
/** * 二分查找 考慮有相同元素的情況(遞歸) * @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 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ù)的情況(非遞歸) * @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
摘要:應(yīng)用分治法是一種很重要的算法。字面上的解釋是分而治之,就是把一個(gè)復(fù)雜的問(wèn)題分成兩個(gè)或更多的相同或相似的子問(wèn)題,再把子問(wèn)題分成更小的子問(wèn)題直到最后子問(wèn)題可以簡(jiǎn)單的直接求解,原問(wèn)題的解即子問(wèn)題的解的合并。 ...
摘要:?jiǎn)栴}勝利鄉(xiāng)有個(gè)村莊現(xiàn)在需要修路把個(gè)村莊連通各個(gè)村莊的距離用邊線(xiàn)表示權(quán)比如距離公里問(wèn)如何修路保證各個(gè)村莊都能連通并且總的修建公路總里程最短代碼重點(diǎn)理解中的三層循環(huán) 問(wèn)...
摘要:學(xué)習(xí)資料迪杰斯特拉計(jì)算的是單源最短路徑,而弗洛伊德計(jì)算的是多源最短路徑代碼不能設(shè)置為,否則兩個(gè)相加會(huì)溢出導(dǎo)致出現(xiàn)負(fù)權(quán)創(chuàng)建頂點(diǎn)和邊 學(xué)習(xí)資料 迪杰斯特拉計(jì)算的是單源最...
摘要:例題假設(shè)存在如下表的需要付費(fèi)的廣播臺(tái),以及廣播臺(tái)信號(hào)可以覆蓋的地區(qū)。 例題 假設(shè)存在如下表的需要付費(fèi)的廣播臺(tái),以及廣播臺(tái)信號(hào)可以覆蓋的地區(qū)。如何選擇最少的廣播臺(tái),讓...
摘要:騎士周游問(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), ...
閱讀 2321·2021-09-28 09:45
閱讀 3604·2021-09-24 09:48
閱讀 2268·2021-09-22 15:49
閱讀 3105·2021-09-08 16:10
閱讀 1596·2019-08-30 15:54
閱讀 2330·2019-08-30 15:53
閱讀 3026·2019-08-29 18:42
閱讀 2876·2019-08-29 16:19