首页 > 编程语言 >二分查找-力扣(Java)

二分查找-力扣(Java)

时间:2023-02-02 17:57:52浏览次数:62  
标签:二分 right Java target nums 力扣 middle 目标值 left

题目描述

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

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/binary-search
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

简要描述二分法

首先应为一个有序数列,我们将会数字设定为一个数组nums,将要在数组中寻找的目标设置为target。在数组中,对数组中间值nums[middle]与target进行判断,并对其进行空间的压缩,然后再次判断新的nums[middle]与target的大小关系,直到nums[middle]与target相等为止

思路

  1. 首先明确题目要求,为寻找目标值,若存在返回下标,不存在则返回-1,标准的二分查找
  2. 明确了二分查找要求后,确定使用左闭右闭还是左闭合又开,即选择[left,right]还是[left,right),这里我选择的是左闭右闭
  3. 确定了使用左闭右闭写法之后,便应该明确怎么写代码。由于目标值在[left,right]区间,所以while(left ? right)中?处应填写<= ,因为在[left,right]区间中,left == right是存在的,例[1,1],所以应当使用<=
  4. 同时判断语句if (nums[middle] > target) 时,由于middle大于目标值,所以即目标值出现在左半边,所以应当将right(即右边界)赋值为middle - 1,因为判断条件为if (nums[middle] > target),此时的nums[middle] 必然不是目标值,所以可以自然往左一位
  5. 而判断语句if (nums[middle] < target)时,由于middle小于目标值,所以即目标值出现在右半边,所以应当将left(即左边界)赋值为middle + 1,原因参考上一点
  6. 当nums[middle] = tarage 时,直接return middle输出结果即可
  7. 最后在while循环外写入return -1表示目标值不存在即可

代码

class Solution {
    public int search(int[] nums, int target) {
        int left = 0 ;
        int right = nums.length -1;
        while(left <= right){
            int middle = left + (right - left) / 2;
            if(nums[middle] > target)
                right = middle -1;
            else if(nums[middle] < target)
                left = middle + 1;
            else if(nums[middle] == target)
            return middle;
        }
        return -1;
    }
}

提交截图

标签:二分,right,Java,target,nums,力扣,middle,目标值,left
From: https://www.cnblogs.com/XMMAX/p/17086845.html

相关文章

  • Java基础学习10--算法
     队列(2023-02-02)使用数组模拟队列(未优化)1.需要用的变量有front=-1,rear=-1,maxsize以及数组int[]arr;2.判断队列已满的条件是rear==maxsize-1,队列为空的条件是rear==fro......
  • Java 继承中方法的重写
    Java继承中方法的重写关于static的问题解释在构造器中有无static影响着构造器的如图中因为右一和右二中是动态写法所以在main中​因为静态方法是类的方法,而非静态......
  • Java内存模型之JMM
    Java内存模型之JMM问题你知道什么是Java内存模型JMM吗?JMM与volatile它们两个之间的关系?(下一章详细讲解)JMM有哪些特性or它的三大特性是什么?为什么要有JMM,它为......
  • Java多线程并发01——线程的创建与终止,几种方式介绍
    线程的创建方式在Java中,用户常用的主动创建线程的方式有三种,分别是继承Thread类、实现Runnable接口、通过Callable<Class>和Future。继承Thread类定义Thread......
  • Java多线程并发02——线程的生命周期与常用方法
    线程生命周期一个线程不是被创建了马上就开始执行,也不是一直处于执行状态。在线程的整个生命周期中会经历新建(New)、就绪(Runnable)、运行(Running)、阻塞(Blocked)和销毁(Terminate......
  • java Set和List的区别
    1、重复。Set不允许重复插入。2、插入顺序。Set不能保证插入顺序。3、null元素。4、实现类。list方法常用的实现类:ArrayList、LinkedList和Vector。Set:HashSet、Lin......
  • java的BigDecimal比较大小
    BigDecimala=newBigDecimal(10);BigDecimalb=newBigDecimal(2);if(a.compareTo(b)==0){System.out.println("a等于b");}if(a.compareTo(b)==1){......
  • Java里面为什么搞了双重检查锁,写完这篇文章终于真相大白了
    双重检查锁定与延迟初始化在java程序中,有时候可能需要推迟一些高开销的对象初始化操作,并且只有在使用这些对象时才进行初始化。此时程序员可能会采用延迟初始化。但要正......
  • Java里面为什么搞了双重检查锁,写完这篇文章终于真相大白了
    双重检查锁定与延迟初始化在java程序中,有时候可能需要推迟一些高开销的对象初始化操作,并且只有在使用这些对象时才进行初始化。此时程序员可能会采用延迟初始化。但要正......
  • Java里面为什么搞了双重检查锁,写完这篇文章终于真相大白了
    双重检查锁定与延迟初始化在java程序中,有时候可能需要推迟一些高开销的对象初始化操作,并且只有在使用这些对象时才进行初始化。此时程序员可能会采用延迟初始化。但要......