leetcode_34 在排序陣列中查詢元素的第一個和最後一個位置
要求
給定一個按照升序排列的整數陣列 nums,和一個目標值 target。找出給定目標值在陣列中的開始位置和結束位置。
如果陣列中不存在目標值 target,返回 [-1, -1]。
進階:
你可以設計並實現時間複雜度為 O(log n) 的演算法解決此問題嗎?
示例 1:
輸入:nums = [5,7,7,8,8,10], target = 8
輸出:[3,4]
示例 2:
輸入:nums = [5,7,7,8,8,10], target = 6
輸出:[-1,-1]
示例 3:
輸入:nums = [], target = 0
輸出:[-1,-1]
提示:
- 0 <= nums.length <= 105
- -109 <= nums[i] <= 109
- nums 是一個非遞減陣列
- -109 <= target <= 109
核心程式碼
```python class Solution: def searchRange(self, nums: List[int], target: int) -> List[int]: lo,hi = 0,len(nums) - 1 while lo <= hi: mid = (lo + hi) // 2 if nums[mid] == target: break elif nums[mid] > target: hi = mid - 1 else: lo = mid + 1 if lo > hi: return [-1,-1]
midtarget = mid
lo,hi = 0,mid
leftpos = 0
while lo <= hi:
if (hi >= 1 and nums[hi - 1] != target) or hi == 0:
leftpos = hi
break
mid = (lo + hi) // 2
if nums[mid] == target:
hi = mid
elif nums[mid] < target:
lo = mid + 1
rightpos = 0
lo,hi = midtarget,len(nums) - 1
while lo <= hi:
if (lo <= len(nums) - 2 and nums[lo + 1] != target) or lo == len(nums) - 1:
rightpos = lo
break
mid = (lo + hi + 1) // 2
if nums[mid] == target:
lo = mid
elif nums[mid] > target:
hi = mid - 1
return [leftpos,rightpos]
```
解題思路:我們使用二分查詢的方式首先先來定位target的位置,若定位不到就直接返回[-1,-1],然後我們定位到了一個target,我們將資料分割成左右兩個部分,在左側我們找左邊界,在右側我們找右邊界,都是使用二分查詢的方式,我們的時間複雜度o(logn)。
「其他文章」
- XGBoost - XGBoost應用中的其他問題(六)
- XGBoost - XGBoost樣本不均衡(七)
- cifar-10資料集整理解讀
- SVM - 多分類問題(九)
- 聚類演算法K-Means - 引數列表(四)
- 聚類演算法K-Means - 向量化應用(三)
- 邏輯迴歸 - 評分卡專案(五)
- 邏輯迴歸 - 引數部分(四)
- 邏輯迴歸 - 引數部分(三)
- 邏輯迴歸 - 原理部分(一)
- 資料預處理與特徵工程總結 - 特徵選擇 - 嵌入法和包裝法(五)
- 資料預處理與特徵工程總結 - 缺失值(二)
- 決策樹總結 - 決策樹Gini係數計算過程詳細解答(七)
- 決策樹總結 - 歸納總結決策樹的ID3,C4.5和CART的構建過程(六)
- 決策樹總結 - DecisionTreeClassifier(二)
- 決策樹總結 - DecisionTreeClassifier(一)
- 模型評估指標AUC(area under the curve)
- YOLOv3的原始碼精度理解(十二) get_map函式
- YOLOv3的原始碼精度理解(十) 對輔助檔案進行解讀
- 影象增強庫Albumentations使用總結