1. 程式人生 > 實用技巧 >[LeetCode] 二分查詢 binary search 未完待續

[LeetCode] 二分查詢 binary search 未完待續

二分法是演算法題裡面一個比較基礎但是很容易錯的概念。我總結了如下幾個模板。

模板一,適用於查詢有序陣列中某個元素是否存在。若不存在,往往題目要求返回 -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 = 3
8 // 中間隔了起碼有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

LeetCode 題目總結