leetcode算法基础训练:第一天:二分查找

在这里插入图片描述在这里插入图片描述补充知识:
在这里插入图片描述利用二分思想先找其左边界,再找其右边界即可,注意找左边界的时候,由右侧逼近;找右边界的时候,由左侧逼近,即可。

class Solution {
public:
    vector<int> searchRange(vector<int>& nums, int target) {
        vector<int> res(2,-1);
        if(nums.empty()) return res;
        int n=nums.size(),l=0,r=n-1;
        while(l<r){
            int m=l+(r-l)/2;
            if(nums[m]>=target) r=m;
            else l=m+1;
        }
        if(nums[l]!=target) return res;
        res[0]=l;
        r=n;//边界条件
        while(l<r){
            int m=l+(r-l)/2;
            if(nums[m]<=target) l=m+1;
            else r=m;
        }
        res[1]=l-1;
        return res;
    }
};

在这里插入图片描述`
由第一项进行二分突破。

class Solution {
public:
    int search(vector<int>& nums, int target) {
        if (target > nums[0]) {
            for(int i = 0; i < nums.size(); i++) {
                if (target == nums[i]) {
                    return i;
                } else if (target < nums[i]) {
                    return -1;
                }
            }
        } else if (target < nums[0]){
            for(int i = nums.size()- 1; i >= 0; i--) {
                if (target == nums[i]) {
                    return i;
                } else if (target > nums[i]) {
                    return -1;
                }
            }
        }else return 0;
        return -1;
    }
};

在这里插入图片描述

class Solution {
public:
    bool searchMatrix(vector<vector<int>>& matrix, int target) {
    int m = matrix.size(), n = matrix[0].size();
    //获取行列数据
    int l = 0, r = m * n - 1, mid;
    while(l <= r) {
        mid = l + (r - l) / 2;
        int x = matrix[mid / n][mid % n];
        //mid/n得到行数,mid%n得到列数,这里可以不用单独用变量,可能会导致超时。
        if(x < target) {
            l = mid + 1;
        } else if(x > target) {
            r = mid - 1;
        } else {
            return true;
        }
    }
    return false;
}
};
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值