這個場景是最簡單的,肯能也是大家最熟悉的,即搜尋乙個數,如果存在,返回其索引,否則返回 -1
int
binarysearch
(int
nums,
int target)
else
if(nums[mid]
> target)
else
if(nums[mid]
< target)
}return-1
;}
尋找左邊界二分查詢
int
left_bound
(int
nums,
int target)
else
if(nums[mid]
< target)
else
if(nums[mid]
> target)
}// 兩種情況:一種是target比陣列中的所有元素都小, 二種是target比陣列中所有的元素都大
// 一: target = 0, nums = [1, 2, 3, 3], 最後left = 0,right = 0, nums[left] != target,返回-1
// 最後left = 0表示target比陣列中的所有元素都小 也就是 陣列中比0小的數有0個
//二: target = 4, nums[1, 2, 3, 3],最後left = nums.length,
// 最後left = 4 表示target = 4這個數比陣列中的所有元素都大, 也就是 陣列中比4小的元素的個數有4個
if(nums[left]
!= target || left >= nums.length)
return left;
}
尋找右邊界
int
right_bound
(int
nums,
int target)
else
if(nums[mid]
> target)
else
if(nums[mid]
< target)}if
(left ==0)
return-1
;// target比陣列中所有元素都小
return nums[left -1]
== target ?
(left -1)
:-1;
// nums[left - 1] != target 表示target比陣列中所有的元素都大
}
我們還根據邏輯將「搜尋區間」全都統一成了兩端都閉,便於記憶,只要修改兩處即可變化出三種寫法:
int
binary_search
(int
nums,
int target)
else
if(nums[mid]
> target)
else
if(nums[mid]
== target)
}// 直接返回
return-1
;}intleft_bound
(int
nums,
int target)
else
if(nums[mid]
> target)
else
if(nums[mid]
== target)
}// 最後要檢查 left 越界的情況
if(left >= nums.length || nums[left]
!= target)
return-1
;return left;
}int
right_bound
(int
nums,
int target)
else
if(nums[mid]
> target)
else
if(nums[mid]
== target)
}// 最後要檢查 right 越界的情況
if(right <
0|| nums[right]
!= target)
return-1
;return right;
}
二分查詢詳解 C 利用二分查詢尋找滿足條件的區間
給定乙個按照公升序排列的整數陣列 nums,和乙個目標值 target。找出給定目標值在陣列中的開始位置和結束位置。你的演算法時間複雜度必須是 o log n 級別。如果陣列中不存在目標值,返回 1,1 示例 1 輸入 nums 5,7,7,8,8,10 target 8 輸出 3,4 示例 2 輸...
二分法尋找左右邊界
尋找左邊界 陣列有序,且有重複 左閉右開 迴圈條件 left right 中間位置計算 mid left right left 1 左邊界更新 left mid 1 右邊界更新 right mid 返回值 nums left target left 1public static void main ...
二分查詢 尋找兩個有序陣列的中位數
力扣 尋找兩個有序陣列的中位數,下面看一下題目 題目敘述 給定兩個大小為 m 和 n 的有序陣列 nums1 和 nums2。請你找出這兩個有序陣列的中位數,並且要求演算法的時間複雜度為 o log m n 你可以假設 nums1 和 nums2 不會同時為空。示例 1 nums1 1,3 nums...