[LeetCode] 二分查詢 binary search 未完待續
阿新 • • 發佈:2021-01-12
二分法是演算法題裡面一個比較基礎但是很容易錯的概念。我總結了如下幾個模板。
模板一,適用於查詢有序陣列中某個元素是否存在。若不存在,往往題目要求返回 -1。
1 class Solution { 2 public int binarySearch1(int[] nums, int target) { 3 // left和right都在陣列下標範圍內 4 // [left, right] 5 int left = 0; 6 int right = nums.length - 1; 7 // 舉例,start - 0, end = 38 // 中間隔了起碼有start + 1和start + 2兩個下標 9 // 這樣跳出while迴圈的時候,end < start 10 // 才有了最後的兩個判斷 11 while (left + 1 < right) { 12 int mid = left + (right - left) / 2; 13 if (nums[mid] == target) { 14 return mid; 15 } else if (nums[mid] < target) {16 mid = left + 1; 17 } else { 18 mid = right - 1; 19 } 20 } 21 // 特判 22 if (nums[left] == target) { 23 return left; 24 } 25 if (nums[right] == target) { 26 return right; 27 }28 // 如果沒找到就只能返回-1 29 return -1; 30 } 31 }
模板二,模板一稍稍有一些變化,也是找有序陣列中是否存在一個目標值。
1 class Solution { 2 public int binarySearch2(int[] nums, int target) { 3 // left和right都在陣列下標範圍內 4 // [left, right] 5 int left = 0; 6 int right = nums.length - 1; 7 // while迴圈跳出的條件是right < right 8 // 所以如果沒找到target的話,也不需要特判了 9 while (left <= right) { 10 int mid = left + (right - left) / 2; 11 if (nums[mid] == target) { 12 return mid; 13 } else if (nums[mid] < target) { 14 mid = left + 1; 15 } else { 16 mid = right - 1; 17 } 18 } 19 // 如果沒找到就只能返回-1 20 return -1; 21 } 22 }
二分法比較經典的題目總結如下
704. Binary Search