【一日双题—见微知著】一道简单+中等题——二分查找+搜索长度未知的有序数组(二分变形)


一、简单题 704. 二分查找

1.1题目描述

给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。(假设无重复元素)

在这里插入图片描述

1.2解题思路

  • 由排序好、查找直接锁定二分查找算法(也叫折半法,在每次判断后能够将搜索范围减少一半
二分算法图解:

每次搜索范围为 [left,right] ,判断中间值 mid=(left+right)/2 是否为搜索目标,若目标大于中间值 if(target>nums[mid]) 则目标在mid右边,即为[mid+1,right]于是将 left=mid+1 ;若等于,则直接输出即可;若小于同理把 right=mid-1

由于判断结束条件为left <= right,而left >= 0, right <= nums.lenght - 1;因此就算有mid+1,mid-1也不会超出0~length-1的范围。

具体图示如下:
在这里插入图片描述

二分算法Java实现:
class Solution {
    public int search(int[] nums, int target) {
        int left=0,right=nums.length-1;
        while(left<=right){
        		//int mid=(left+right)/2;下面的方法防止计算溢出
            int mid = left + (right - left) / 2; 
            if(target>nums[mid]){
                left=mid+1;
            }
            else if(target==nums[mid]){
                return mid;
            }
            else{//target<nums[mids]
                right=mid-1;
            }
        }
        return -1;
    }
}

二、中等题 702. 搜索长度未知的有序数组

2.1题目描述

给定一个升序整数数组,写一个函数搜索 nums 中数字 target。如果 target 存在,返回它的下标,否则返回 -1。注意,这个数组的大小是未知的。你只可以通过 ArrayReader 接口访问这个数组,ArrayReader.get(k) 返回数组中第 k 个元素(下标从 0 开始)。

你可以认为数组中所有的整数都小于 10000。如果你访问数组越界,ArrayReader.get 会返回 2147483647。

2.2解题思路

  • 由排序好、查找直接锁定二分查找算法(也叫折半法,在每次判断后能够将搜索范围减少一半),但是和上一题不同的是,这次无法确定右边界

由此先确定右边界,先令left=0,right=1,判断target是否大于nums.get(right),若大于,先令left=right+1,然后直接倍增right*=2,若小于等于则取得边界[left,right];确定边界后,再使用之前的思路即可。

边界确定算法图解:

在这里插入图片描述

题解Java实现:
class Solution {
    public int search(ArrayReader reader, int target) {
        int left = 0;
        int right = 1;
        while (target > reader.get(right)) {
            left = right+1;
            right = right * 2;
        }
        while(left<=right){
            //int mid=(left+right)/2;下面的方法防止计算溢出
            int mid = left + (right - left) / 2; 
            if(target>reader.get(mid)){
                left=mid+1;
            }
            else if(target==reader.get(mid)){
                return mid;
            }
            else{//target<reader.get(mid)
                right=mid-1;
            }
        }
        return -1;
    }
}

结尾

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems

关注作者,每日带你刷题,从简单的算法题了解最常用的算法技能(算法题解双日一更)
每日同类型两道算法题——简单到进阶,让你不知不觉成为无情的刷题机器

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

代码之狐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值