1.二分法
最簡單版本:
第乙個,最基本的二分查詢演算法:
第二個,尋找左側邊界的二分查詢:因為我們初始化 right = nums.length - 1
所以決定了我們的「搜尋區間」是 [left, right]
所以決定了 while (left <= right)
同時也決定了 left = mid+1 和 right = mid-1
因為我們只需找到乙個 target 的索引即可
所以當 nums[mid] == target 時可以立即返回
第三個,尋找右側邊界的二分查詢:left_bound( nums, target) else if (nums[mid] > target) else if (nums[mid] == target)
}// 檢查出界情況
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;
}
def search(nums,target):
if target in nums:
left,right=0,len(nums) #[left ,right)
if lefttarget:
right=mid # [left,mid)
elif nums[mid]i) 求下界,用左閉右開搜尋區間[first, last).
// 在python中正是求下界限,這種寫法不會造成溢位
原理:
不管怎麼寫,只要遵循乙個原則,就是l是符合條件的的,r是不符合的(反過來也一樣)。這個不變數將貫穿整個二分的過程。
什麼意思呢?舉個栗子,你需要在[l,r]區間中找到符合條件的最大的x,按照上面的原則,你的初始條件就應該是l=l, r=r+1, 注意這裡的r是不符合條件的,因為它超出了邊界,所以它不可能是答案。這時候,你的mid如果合法,就說明答案大於等於mid,所以應該更新l,如果mid不合法,直接把r設成mid。至於如何判斷合法(是大於等於還是大於),該不該加一減一,按照這個原則都可以很容易想出來。
這樣在整個二分的過程中,你會發現,r在任何時候都不可能是答案,那麼這個迴圈的停止條件也很容易判斷了,就是l+1=r,這時候說明l已經是符合條件的最大值了,因為再加一就是非法值。
特點 :
1、左閉右開 (所以右邊應該 right+1 ,防止取空)
2、left 3、基於左閉右開(右邊界,mid = right 可以取到,因此中間值等於目標值時,應該右邊界)
左邊界 ,mid= left+1 ,由於不能重複取left得值
int left_bound(int nums, int target) else if (nums[mid] < target) else if (nums[mid] > target)
}if left==len(nums): #此時 left==right ,跳出迴圈 ,可能會出現mid=right的情況(越界)
return -1
return left if nums[left]==target else -1;
}
int right_bound(int nums, int target) else if (nums[mid] < target) else if (nums[mid] > target)
}return left - 1; // 注意 #因為我們對 left 的更新必須是 left = mid + 1,就是說 while 迴圈結束時,nums[left] 一定不等於 target 了,而 nums[left-1] 可能是 target,所以需要left/right -1
二分法 演算法
查詢演算法中的 二分法 是這樣定義的 給定n個從小到大排好序的整數序列list,以及某待查詢整數x,我們的目標是找到x在list中的下標。即若有list i x,則返回i 否則返回 1表示沒有找到。二分法是先找到序列的中點list m 與x進行比較,若相等則返回中點下標 否則,若list m x,則...
演算法 二分法
二分法可以歸為兩大類 二分查詢演算法 二分排序演算法 二分合併演算法 演算法中經常用到二分查詢演算法,比如最常規的應用就是在乙個有序陣列中找特定的數,但是如何寫出乙個完整準確的二分法呢,邊界條件如何判斷,到底是等於還是不等?可能會困惱大家,比如說查詢第乙個等於5的數,那又在如何查詢呢?查詢最後乙個等...
二分法 演算法
二分法查詢,這個演算法要求資料要是有序的。比如有這樣的問題 找出乙個陣列中,兩個數的和小於等於15,然後輸出他們,否則就單獨輸出較大的數。binarysearch.cpp include using namespace std void binarysearch int array,int leng...