LeetBook作业记录: 二分查找


题目概述

给定一个升序数组nums和一个整数target, 用二分查找查找target是否在nums中,如果在,返回对应元素的index,如果不在,返回-1。


题目地址:https://leetcode-cn.com/leetbook/read/binary-search/xexoac/

一、解题思路

利用左右两个浮标标注二分查找的区域,初始状态下,左浮标在0位,右浮标在nums.length-1位。循环语句用index开始从数组中间查找,如果index指向的元素小于target,更新右浮标,如果大于target,则更新左浮标,如果等于就跳出循环。

这道题目的边界条件需要处理:
1)数组只有一个元素的情况
2)target小于数组第一个元素,target大于数组最后一个元素
3)target等于数组第一个元素或数组最后一个元素

二、作业记录

1.作业代码

代码如下:

class Solution {
    public int search(int[] nums, int target) {
        //处理数组只有一个元素的情况
        if( nums.length == 1 && nums[0] != target)
             return -1;    
      // 初始化浮标
        int left, right, index;
        left = 0;
        right = nums.length -1;
        index = (right - left) / 2;
         
        //处理target超出数组范围的情况
        if( nums[left] > target)
            return -1;
        if( nums[right] < target)
            return -1;
               
       // 循环开始
        while( nums[index] != target){
           // 浮标对应元素等于target的情况
            if( nums[index] == target)
                break;
            if( nums[left] == target)
                return left;
            if( nums[right] == target)
                return right;
           
           // index对应元素小于target,搜索区间向右收缩
            if( nums[index] < target){
                left = index;
                index = left + (right - left)/2;
            }
             // index对应元素大于target,搜索区间向左收缩   
            if( nums[index] > target){
                right = index;
                index = right - right/2;
            }
           // 搜索区间无法二分,仍然没有找到target
            if( left == right - 1 && nums[index] != target)
                return -1;
             
        }
        return index;
    }
}

2.作业表现

表现如下:
在这里插入图片描述
用时满足要求。内存消耗似乎不太好,但是我暂时也想不出优化的办法,先这样吧。等我把JVM的内存问题课程看完,说不定会有新思路。


复杂度分析

时间复杂度:题目要求是O(logn)的复杂度,我的思路是搜索区间对折的处理,应该是达标了。

空间复杂度:由于只用了3个浮标,常量级的额外存储,我认为复杂度是O(1)。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

不争之德

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

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

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

打赏作者

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

抵扣说明:

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

余额充值