LeetCode-二分查詢的變種總結
阿新 • • 發佈:2018-11-27
二分查詢
二分查詢作為一種基礎演算法,在面試和筆試中也是經常遇到,然而這一演算法在不同的情形中也有不同的表現形式,下面是一些二分查詢演算法的變種總結。(以下程式碼均已實現)
時間複雜度:
二分查詢也稱為折半查詢,每次都能將查詢區間減半,這種折半特性的演算法時間複雜度為 O(logN)。
mid的計算:
有兩種計算中值 m 的方式:
- m = (l + h) / 2
- m = l + (h - l) / 2
l + h 可能出現加法溢位,最好使用第二種方式。
正常實現:
class Solution{ public int binarySearch1(int[] nums, int key) { //正常實現 int left = 0, right = nums.length - 1; while (left <= right) { int m = left + (right - left) / 2; if (nums[m] == key) { return m; } else if (nums[m] > key) { right = m - 1; } else { left = m + 1; } } return -1; } }
查詢第一個與key相等的元素
class Solution{ public int binarySearch2(int[] nums, int key) { //查詢第一個與key相等的元素 int left = 0, right = nums.length - 1; while (left < right) { int m = left + (right - left) / 2; if (nums[m] < key) { left = m + 1; } else { right = m; } } return left; } }
查詢最後一個與key相等的元素
class Solution{ public int binarySearch3(int[] nums, int key) { //查詢最後一個與key相等的元素 int left = 0, right = nums.length - 1; while (left < right) { int m = left + (right - left) / 2; if (m == left) { break; } if (nums[m] <= key) { left = m; } else { right = m - 1; } } return right; } }
查詢第一個大於key的元素
class Solution{
public int binarySearch4(int[] nums, int key) { //查詢第一個大於key的元素
int left = 0, right = nums.length - 1;
while (left < right) {
int m = left + (right - left) / 2;
if (m == left) {
break;
}
if (nums[m] <= key) {
left = m;
} else {
right = m;
}
}
return right;
}
}
查詢最後一個小於key的元素
class Solution{
public int binarySearch5(int[] nums, int key) { //查詢最後一個小於key的元素
int left = 0, right = nums.length - 1;
while (left < right) {
int m = left + (right - left) / 2;
if (m == left) {
break;
}
if (nums[m] < key) {
left = m;
} else {
right = m - 1;
}
}
return right;
}
}