1. 程式人生 > 實用技巧 >20.12.1 leetcode34

20.12.1 leetcode34

題目連結: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};
    }
};