leetcode 34. 在排序數組中查找元素的第一個和最後一個位置

地址 https://leetcode-cn.com/problems/find-first-and-last-position-of-element-in-sorted-array/算法

給定一個按照升序排列的整數數組 nums,和一個目標值 target。找出給定目標值在數組中的開始位置和結束位置。數組

你的算法時間複雜度必須是 O(log n) 級別。spa

若是數組中不存在目標值,返回 [-1, -1]。code

示例 1:

輸入: nums = [5,7,7,8,8,10], target = 8
輸出: [3,4]
示例 2:

輸入: nums = [5,7,7,8,8,10], target = 6
輸出: [-1,-1]

 

解法 考覈二分查找blog

先找出最左端索引 再找出最右端第一個不符合條件索引再減去1 考慮只有一個數字符合條件的狀況。索引

還要注意數組只有一個數字或者沒有數字的邊界狀況element

代碼leetcode

class Solution {
public:
    
    
    vector<int> searchRange(vector<int>& nums, int target) {

    int l = 0; int r = nums.size()-1;
    if(nums.empty()) return  vector<int>(2, -1);
    if (nums.size() == 1) {
        if(nums[0] == target)
            return vector<int>(2, 0);
        else 
            return  vector<int>(2, -1);
    }

    while (l < r)
    {
        int mid = l + r >> 1;
        if ( nums[mid] >= target  ) r = mid;
        else l = mid + 1;
    }
    int idx = l;
    if (nums[idx] != target) 
        return vector<int>(2, -1);


    l = idx;  r = nums.size()-1;

    while (l < r)
    {
        int mid = l + r >> 1;
        if (nums[mid] > target) r = mid;
        else l = mid + 1;
    }

    int idx2 = l;

    if (nums[idx2] != target) 
        return vector<int>{idx,idx2-1};


    return vector<int>{idx, idx2};

}
    
    
    
};
相關文章
相關標籤/搜索