浅析二分查找
二分查找法
1.含義:二分查找算法,也叫折半查找算法。二分查找的思想非常簡單,有點類似分治的思想。二分查找針對的是一個有序的數據集合,每次都通過跟區間的中間元素對比,將待查找的區間縮小為之前的一半,直到找到要查找的元素,或者區間縮小為0
2.使用條件:題目強調數組中為有序數組,且無重復元素,因為一旦有重復元素,使用二分查找法返回的元素下標可能不是唯一的。
3.注意要點:邊界條件的控制,二分查找涉及的很多的邊界條件,邏輯比較簡單,但有些東西容易混亂。例如到底是while(left<right)還是while(left<=right),到底是right=middle呢,還是要right=middle-1?混亂的主要原因是因為對區間的定義沒有想清楚,區間的定義就是不變量。要在二分查找的過程中,保持不變量,就是在while尋找中每一次邊界的處理都要堅持根據區間的定義來操作,這就是循環不變量規則。
4.二分法的區間定義:二分法的區間的定義一般分為兩種,左閉右閉即[left,right],或者左閉右開即[left,right)。
5.二分法的第一種寫法:我們將區間設定為[left,right],區間的定義決定了二分法代碼應該如何寫,定義目標值target在[left,right]區間有如下兩點:
1.while(left<=right)要使用<=,因為left==right是有意義的,所以使用<= 2.if(nums[middle]>target) right要賦值為middle-1,因為當前這個nums[middle]一定不是target,那么接下來要查找的左區間結束下標位置就是middle-1代碼如下
class solution { public:int search(vector<int> & nums,int target){int left = 0;int right = nums.size()-1;while(left <= right){int middle = (left + right)/2;if(nums[middle] > target){right = middle - 1;}else if(nums[middle] < target){left = middle + 1;}else{return middle;}}return -1;} }6.二分法的第二種寫法:
定義 目標值target是在一個左閉右開的區間里,也就是[left,right),那么二分法的處理方式為
1.while(left < right),這里使用<,因為left==right在區間[left,right)是沒有意義的。 2.if(nums[middle] > target) right 更新為middle,因為當前nums[middle]不等于target,因為尋找區間是左閉右開區間,所以right更新為middle,即:下一個查詢區間不會去比較nums[middle]代碼如下:
class solution { public:int search(vector<int> &nums,int target){int left = 0;int right = nums.size();while(left < right){int middle = (left + right)/2;if(nums[middle] > target){right = middle;}else if(numms[middle]<target){left = middle + 1;}else{return middle;}}return -1;} }總結
- 上一篇: 骁龙835干得过a10吗
- 下一篇: Restful API 架构与设计参考原