python二分查詢模板
經常會遇到需要進行二分查詢的情境,python中的bisect很好用,當無法使用這個庫的時候,可以自己手動實現。
下面的程式碼片段實現了“查詢target第一次出現的位置”,以及“第一個大於target的值的位置”兩個功能,如果要找target最後一次出現的位置,可以在“第一個大於target的值的位置”的基礎上減一。
如果第一次查詢11,left和right都等於7(即陣列的長度,因為11不存在於陣列arr中),需要手動判斷。
下面的程式碼適用於劍指offer《在排序陣列中查詢數字》
import bisect
arr = [5, 7, 7, 8, 8, 9, 10]
# i,j輔助使用
i, j = 0, len(arr)
# left、right是需要搜尋的
# left表示第一個等於target的值的位置
# right表示第一個大於target的值的位置
left = 0
right = len(arr) 大連婦科醫院哪個好
# 目標值,假設需要找到陣列中第一個等於8的值,以及第一個大於8的值
target = 8
# i永遠等於mid加1
# j永遠等於mid
# 當搜尋left時,第一個條件為arr[mid]<1target:i=mid+1<1 p="">
# 當搜尋left時,第一個條件為target<1arr[mid]:j=mid<1 p="">
while i < j: mid = (i + j) // 2 if arr[mid] < target: i = mid + 1 left = i else: j = mid
i = 0
j = len(arr)
while i < j: mid = (i + j) // 2 if target < arr[mid]: j = mid right = j else: i = mid + 1
# 可以看到結果相同,第一次出現8的位置是3
print(bisect.bisect_left(arr,8))
print(left)
# 可以看到,第一次大於8的位置是5
print(bisect.bisect_left(arr,9))
print(right)
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70005147/viewspace-2789882/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 二分查詢-不套用模板
- leetcode解題模板 —— 二分查詢LeetCode
- 二分查詢基礎專題——二分模板
- 查詢——二分查詢
- 二分查詢 - 手寫模板與自帶函式函式
- 二分查詢(一)——純粹的二分查詢
- 二分查詢
- 查詢演算法__二分查詢演算法
- 十分好用的二分查詢模板 手撕二分還怕嗎?
- 二分查詢法
- PHP二分查詢PHP
- leetcode——二分查詢LeetCode
- leetcode -- 二分查詢LeetCode
- 查詢演算法之二分查詢演算法
- 二分查詢 | 二分查詢的一種推薦寫法
- 704.二分查詢
- labuladong_二分查詢
- 詳解二分查詢
- 二分查詢(c++)C++
- 每日leetcode——二分查詢LeetCode
- Leetcode 704 二分查詢LeetCode
- Python遞迴函式,二分查詢演算法Python遞迴函式演算法
- 二分查詢【折半查詢】演算法 PHP 版演算法PHP
- 【演算法】二分查詢演算法
- 演算法->二分查詢演算法
- 力扣之二分查詢力扣
- 二分查詢的定義
- 二分搜尋(折半查詢)
- PHP 實現二分查詢PHP
- 圖解--二分查詢樹圖解
- 二分查詢成長錄
- 牛客網 查詢(二分查詢、北郵機試)
- 陣列的查詢(搜尋):線性查詢和二分法查詢陣列
- C++,Java,Python,Javascript實現二分查詢演算法C++PythonJavaScript演算法
- 二分查詢 理論 例題
- LeetCode演算法—二分查詢LeetCode演算法
- 基礎二分查詢總結
- 二分查詢的簡單理解