My first page - 二分查找(java)——By Nicolas

首先呢,针对的是leetcode上面的704.二分查找写的此文章,首先呢,这个题目我是跑过了的,这个题目也比较简单,就是给出一个数组,然后输入一个搜索的数,如果有就输出这个数在数组中对应的下标。首先,我写的是一个比较暴力的解法,就是完全没有运用二分的思想,就是个单纯的暴力的解法,我把代码拉过来可以看看。

int length = arr.length;
int target;
Scanner in = new Scanner(System.in);
target = in.nextInt();
for(int i = 0;i<length;i++){
    if(arr[i] == target){
        System.out.println(i);
    }
    else if(i == length && target != arr[i]) {
        System.out.println("-1");
    }

首先呢,这个解法就是比较的暴力,就是单纯的运用for循环进行解决。

接下里,才是正题,就是二分,虽然小尼之前也学过二分的思想,但是这里给出的二分的思想非常的快捷,首先,解决任何一个关于二分的问题的时候,我们先需要看到它给出的二分的条件的区间,而且这个区间也是非常的类似与我们学过的数组,可开可闭,我先先看两边都是闭的的情况。首先我们分析,两边都是闭的时候,我们在对数组操作的时候,那就是数组中的任何一个元素我们都会进行操作。不多说,拉代码

int lengh = nums.length;
Scanner in = new Scanner(System.in);
val = in.nextInt();
int left=0,right=lengh-1;
while(left<=right){
     int mid = left + (right - left)/2;
     if(nums[mid]>target){
            right = mid - 1;
        }
     else if(mums[mid]<target){
            left = mid + 1;
        }
     else{
            return mid;
        }
}
return -1;

这一段代码就充分体现了二分的思想,在这一段里面,最为重要的是right与left的操作在因为这种情况是每一个元素都会进行比较,在right或left还没有被改变的时候,我们的nums[mid]就已经被比较了,所以我们下一一个区域就不用再管到mid了,所以我们就写了减一或者加一的操作,其实其他情况也是一样的,其实这就是充分体现了数组的数学上的思想,如果我们在数组中的元素需要去考虑,那么我们就先比较,比较完了就丢弃,如果我们不需要考虑,那么我们的边界取他们都无所谓(这就是其他的情况)。以上就是小尼对二分的思想的看法

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值