二分查詢,尋找左側邊界,尋找右側邊界

2021-10-09 05:52:39 字數 2244 閱讀 4920

這個場景是最簡單的,肯能也是大家最熟悉的,即搜尋乙個數,如果存在,返回其索引,否則返回 -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...