34. 在排序数组中查找元素的第1个和最后1个位置

显然是二分,关键在于怎么处理mid,+1,-1的微妙处。

cpp实现:

/*
 * @lc app=leetcode.cn id=34 lang=cpp
 *
 * [34] 在排序数组中查找元素的第一个和最后一个位置
 */
#include<iostream>
#include<vector>
using namespace std;

// @lc code=start
class Solution {
public:
    vector<int> searchRange(vector<int>& nums, int target) {
        if (nums.size()==0){
            return vector<int> {-1,-1};
        }
        int low = lowerFound(nums,target);
        int high = upperFound(nums,target);
        if (low<0 || low>=nums.size()){
            // 越界
            low = -1;
        }// 值不相等
        else if  (nums[low]!=target) low=-1;

        if (high<0 || high>=nums.size()){
            // 越界
            high = -1;
        }
        // 值不相等        
        else if (nums[high]!=target) high=-1;

        return vector<int> {low,high};
    }
    int lowerFound(vector<int>& nums, int target){
        int left=0, right=nums.size()-1;        
        while(left<right){
            int mid = left + (right-left)/2;
            if (nums[mid]==target){
                // 找到一个,收紧右边界
                right = mid;
            }
            else if (nums[mid]<target){
                // 在右边
                left = mid+1;
            }
            else if (nums[mid]>target){
                // 在左边
                right = mid-1;
            }
        }
        cout<<"left: "<<left<<endl;
        return left;
    }
    int upperFound(vector<int> nums, int target){
        int left=0, right=nums.size()-1;        
        while(left<right){
            int mid = left + (right-left)/2;
            if (nums[mid]==target){
                // 找到一个,收紧左边界                
                left = mid+1;
            }
            else if (nums[mid]<target){
                // 在右边
                left = mid+1;
            }
            else if (nums[mid]>target){
                // 在左边
                right = mid-1;
            }
        }
        if (nums[left]==target){
            // 如果是[7,7,7],7这种情况
            return left;
        }
        cout<<"high: "<<left-1<<endl;
        return left-1; // 否则就是[7,7,8],7这种情况
    }
};
// @lc code=end

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值