二分查找

目录

1.搜索旋转排序数组

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


1.搜索旋转排序数组

class Solution {
public:
    int search(vector<int>& nums, int target) {
        if (nums.size() <= 0)
            return -1;
        int low = 0;
        int high = nums.size() - 1;

        while (low < high)
        {
            int mid = (low + high) / 2;

            if (nums[mid] == target)
                return mid;
            else if (nums[mid] == nums[low] && nums[low] == nums[high])//特殊情况
            {
                for (int i = 0; i < nums.size(); i++)
                {
                    if (nums[i] == target)
                    {
                        return i;
                    }
                }
            }
            else if (nums[low] <= nums[mid])	//左边有序
            {
                if (nums[low] <= target && nums[mid] >target)
                {
                    high = mid - 1;
                }
                else
                {
                    low = mid + 1;
                }
            }
            else //右边有序
            {
                if (nums[mid] < target && nums[high] >= target)
                {
                    low = mid + 1;
                }
                else
                {
                    high = mid - 1;
                }
            }
        }

        if (nums[low] == target)
            return low;
        else
            return -1; 
    }
};

 

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

class Solution {
public:
    vector<int> searchRange(vector<int>& nums, int target) {
        vector<int>res = { -1, -1 };

        int low1 = 0;
        int high1 = nums.size();

        while (low1 < high1)    //查找第一个小于等于target的下标
        {
            int mid1 = (low1 + high1) / 2;

            if (nums[mid1] >= target)
            {
                high1 = mid1;
            }
            else
            {
                low1 = mid1 + 1;
            }
        }

        int low2 = 0;
        int high2 = nums.size();
        while (low2 < high2) //查找第一个大于target的下标
        {
            int mid2 = (low2 + high2) / 2;

            if (nums[mid2] <= target)
            {
                low2 = mid2 + 1;
            }
            else
            {
                high2 = mid2;
            }
        }

        if (low1 < nums.size() && nums[low1] == target) //注意:low1可能大于nums.size()
        {
            res[0] = low1;
        }
        if (low2 > 0 && nums[low2 - 1] == target) 
        {
            res[1] = low2 - 1;
        }
        return res;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值