leetcode hot100-65 在排序数组中查找元素的第一个和最后一个位置

方法一:利用 ≥ , ≤ , >, < 的性质,这也是因为题目中 非递减顺序排列的整数数组

class Solution {
public:
    int lower_bound(vector& nums, int target) {
        int left = 0;
        int right = nums.size()-1;
        while (left<=right) {
            int mid = left + (right-left)/2;
            if (nums[mid] < target) {
                left = mid + 1;
            } else {
                right = mid - 1;
            }
        }
        // 循环结束后 left = right+1
        // 此时 nums[left-1] < target 而 nums[left] = nums[right+1] >= target
        // 所以 left 就是第一个 >= target 的元素下标
        return left;
    }

    vector searchRange(vector& nums, int target) {
        int start = lower_bound(nums,target);
        if (start == nums.size() || nums[start] != target) {
            return {-1,-1};
        }     
        int end = lower_bound(nums,target+1)-1;
        // 要想找到 ≤target 的最后一个数,无需单独再写一个二分。我们可以先找到这个数的右边相邻数字,也就是 >target 的第一个数。在所有数都是整数的前提下,>target 等价于 ≥target+1,这样就可以复用我们已经写好的二分函数了,即 lowerBound(nums, target + 1),算出这个数的下标后,将其减一,就得到 ≤target 的最后一个数的下标。
        return {start,end};
    }
    
};

方法二 :笨方法,两次遍历,分别找第一次出现和最后一次出现的 target

class Solution {
public:
    vector searchRange(vector& nums, int target) {
        int left = 0;
        int right = nums.size()-1;
        int first = -1;
        int last = -1;
        vector result;
        // 找第一个等于target的位置
        while (left<=right) {
            int mid = left + (right-left)/2;
            if (nums[mid]==target) {
                first = mid;
                right = mid - 1;
            } else if (nums[mid] > target) {
                right = mid - 1;
            } else {
                left = mid + 1;
            }
        }
        // 最后一个等于target的位置
        left = 0;
        right = nums.size() - 1;
        while (left<=right) {
            int mid = left + (right-left)/2;
            if (nums[mid]==target) {
                last = mid;
                left = mid + 1;
            } else if (nums[mid] > target) {
                right = mid - 1;
            } else {
                left = mid + 1;
            }
        }
        result = {first, last}; 
        //result.push_back(first);result.push_back(last); 
        //push_back只能单个元素插入
        return result;
    }
};

你可能感兴趣的:(leetcode,算法,数据结构)