20.12.1 leetcode34
阿新 • • 發佈:2020-12-01
題目連結:https://leetcode-cn.com/problems/find-first-and-last-position-of-element-in-sorted-array/
題意:給你一個有序陣列和一個target值,讓求target值出現的第一次位置和最後一次位置。
分析:二分很明顯,不過我自己的方法只是二分查詢target值,隨便找到一個target值之後遍歷周圍獲得位置,而題解方法要巧妙很多:
找leftIdx即為在陣列中尋找第一個大於等於target的下標,尋找rightIdx即為在陣列中尋找第一個大於target的下標,然後將下標減一。
先是我的菜雞程式碼
class Solution {public: vector<int> searchRange(vector<int>& nums, int target) { int n=nums.size(); vector<int> ans(2); ans[0]=-1,ans[1]=-1; int l=0,r=n-1; while(l<=r){ int mid=(l+r)/2; //cout<<l<<" "<<r<<" "<<mid<<endl;if(nums[mid]<target){ l=mid+1; }else if(nums[mid]>target){ r=mid-1; }else if(nums[mid]==target){ ans[0]=mid,ans[1]=mid; while((ans[0]-1)>=0&&nums[ans[0]-1]==nums[mid])ans[0]-=1;while((ans[1]+1)<n&&nums[ans[1]+1]==nums[mid])ans[1]+=1; break; } } return ans; } };
題解的:
class Solution { public: int binarySearch(vector<int>& nums, int target, bool lower) { int left = 0, right = (int)nums.size() - 1, ans = (int)nums.size(); while (left <= right) { int mid = (left + right) / 2; if (nums[mid] > target || (lower && nums[mid] >= target)) { right = mid - 1; ans = mid; } else { left = mid + 1; } } return ans; } vector<int> searchRange(vector<int>& nums, int target) { int leftIdx = binarySearch(nums, target, true); int rightIdx = binarySearch(nums, target, false) - 1; if (leftIdx <= rightIdx && rightIdx < nums.size() && nums[leftIdx] == target && nums[rightIdx] == target) { return vector<int>{leftIdx, rightIdx}; } return vector<int>{-1, -1}; } };