日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

查找算法——二分法

發布時間:2025/3/12 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 查找算法——二分法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

引言

二分法,顧名思義,即一分為二的方法,通常用于判斷在某個有序數列中是否存在某個數,由于其優秀的算法思想,時間復雜度一般都是 O(logN) ,通常要 O(N) 的遍歷方式更加優秀。

一、經典二分法查找

最常見的二分查找是有序數列找某數,但并不是所有二分查找都必須有序。

public static boolean exist(int[] sortedArr, int num) {if (sortedArr == null || sortedArr.length == 0) return false;// 設置邊際int L = 0, mid = 0, R = sortedArr.length - 1;// L .. Rwhile (L < R) {// 計算midmid = L + ((R - L) >> 1);if (sortedArr[mid] == num) {return true;} else if (sortedArr[mid] > num) {// 棄右留左R = mid - 1;} else {// 棄左留右L = mid + 1;}}return sortedArr[L] == num; }

二、其他二分查找題目

題目:給定一個有序數組,找 >= 某數最左側的位置,例如,arr{1,2,3,3,3,4,4,6,9},即找到位置 2。

public static int mostLeftIndex(int[] arr, int num) {int L = 0, R = arr.length - 1;int mostLeftIndex = 0;while (L < R) {mostLeftIndex = L + ((R - L) >> 1);if (arr[mostLeftIndex] >= num) {// 棄右留左R = mostLeftIndex - 1;} else {// 棄左留右L = mostLeftIndex + 1;}}if (arr[L] == num)return L;elsereturn L + 1; }

題目2:局部最小問題,在無序數組中,任意相鄰兩個數不相等,只要比相鄰的數都小,就是局部最小,找到并返回這樣一個局部最小值的位置。

例如,若[0]<[1],則[0]就是局部最小,[len-2]>[len-1] 則[len-1]就是局部最小, [i-1]>[i]<[i+1],那么[i]就是局部最小。

public static int partialMin(int[] arr) {if (arr[0] < arr[1])return 0;if (arr[arr.length - 2] > arr[arr.length - 1])return arr.length - 1;int L = 1;int R = arr.length - 2;int mid = 0;while (L < R) {mid = L + ((R - L) >> 1);if (arr[mid] > arr[mid + 1]) {// 棄左留右L = mid + 1;} else if (arr[mid] > arr[mid - 1]){// 棄右留左R = mid - 1;} else {return mid;}}return L; }

局部最小問題解析,首先判斷 0 和最后一個位置上的數是否為最小,如果都不是,那么在兩者中間一定存在一個局部最小。二分,然后看中間位置是否比一側大,取大于一側的區間,就形成了最開始的“兩端都不是最小,那么中間一定存在一個最小” 這樣的結構。

?

總結

以上是生活随笔為你收集整理的查找算法——二分法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。