leetcode704二分法:(左闭右闭+左闭右开)
前言
又重溫了一遍<肖生客的救贖> 其中安迪的一句話一直回蕩我的腦中:“人生可以歸結為一種簡單的選擇:不是忙著活,就是忙著死。” 多深刻,多簡單,又多令人深省, 哪有那么多選擇 哪有那么多時間去花費在無意義的事情上,要么忙著活,要么趕著去死
一:題目
二:思路
1.前提
注意這里的數組一定要是有序的,并不是任何數組均可用二分法查找target,他必須有序才可
2:左閉右閉(指的是區間)
(1):while(left<=right)中的 <=
這里的等于號 是當 left == right 的時候,這個區間[left,right]內我們還是可以找到target的
nums[1,4,7,9,11,13] 在這個數組中我們找target = 13
(2):區間的變化
我們每次在縮小的范圍的時候采取的是[left,right],
當target < nums[mid]時候 right = mid - 1, 那么下次的搜索范圍為[left,right]
當target > nums[mid]時候 left = mid +1,那么下次的搜索范圍為[left,right]
3:左閉右開
(1):while(left < right)中的 <
在左閉右開的范圍內,我們采用的是小于號,因為當left == right 的時候,在區間[left,right)是無范圍的,nums[1,4,7,9,11,13] 在這個數組中我們找target = 1(在左閉右開的中 right = 5是不對的 應該為 6 (數組的大小))
在這個范圍中,我們并在最后的區間[0,1)找到的taget,,也就是最終我們查找的最小范圍必須是兩個數,那么就不可能有left == right,因為此時是無范圍的
(2):區間的變化
我們每次縮小范圍的時候采用的是[left,right)
當target < nums[mid] 的時候 right = mid 那么下次的搜索空間[left,right)
當target > nums[mid] 的時候 left = mid +1 那么下次的搜索空間為[left,right)
三:上碼
1:左閉右閉
class Solution { public:int search(vector<int>& nums, int target) {int left = 0;int right = nums.size() - 1;while(left <= right){int mid = (left + right)/2;if(nums[mid] < target){left = mid + 1;}if(nums[mid] > target){right = mid - 1;}if(nums[mid] == target){return mid;}}return -1;} };2:左閉右開
class Solution { public:int search(vector<int>& nums, int target) {int left = 0;int right = nums.size();//這里我們需要注意我們最小的區間范圍需要有兩個元素,那么當數組元素的個數為1時 [0,1),也是包含兩個元素的while(left < right){int mid = (left + right)/2;if(nums[mid] < target){left = mid + 1;}if(nums[mid] > target){right = mid;}if(nums[mid] == target){return mid;}}return -1;} };四:總結
這是菜雞杰的二刷,二分法看似簡單,分析起來也容易理解,但是但是往往這種題值得推敲的細節 就比較重要,希望兄弟們注意,它的邊界和區間變化 如有疑問 請留言 加油陌生人!!
總結
以上是生活随笔為你收集整理的leetcode704二分法:(左闭右闭+左闭右开)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 7-3 模板题 (10 分)(思路+详解
- 下一篇: 367. 有效的完全平方数(二分法)