首页 > 其他分享 >二分查找对应三种区间的写法:

二分查找对应三种区间的写法:

时间:2022-09-05 22:55:52浏览次数:95  
标签:二分 right target nums int length 查找 写法 left

// 二分查找 --- [left, right]
    // 数组已经是有序的了!
    public static int binarySerach1(int[] nums, int target) {
        if (nums == null || nums.length == 0) {
            return -1;
        }
        int left = 0, right = nums.length-1;
        while (left <= right) {
            // 防止溢出 等同于(left + right)/2
            int mid = left + (right-left)/2;
            if (nums[mid] == target) {
                return mid;
            } else if (nums[mid] > target) {
                // target 在左区间,所以[left, middle - 1]
                right = mid-1;
            } else {
                // target 在右区间,所以[middle + 1, right]
                left = mid+1;
            }
        }

        return -1;
    }

    // 二分查找 --- [left, right)
    // 数组已经是有序的了!
    int binarySearch2(int[] nums, int target){
        if(nums == null || nums.length == 0)
            return -1;
        // 定义target在左闭右开的区间里,即:[left, right)
        int left = 0, right = nums.length;
        // 因为left == right的时候,在[left, right)是无效的空间,所以使用 <
        while(left < right){
            int mid = left + (right - left) / 2;
            if(nums[mid] == target){
                return mid;
            }
            else if(nums[mid] < target) {
                //  target 在右区间,在[middle + 1, right)中
                left = mid + 1;
            }
            else {
                // target 在左区间,在[left, middle)中
                right = mid;
            }
        }

        // Post-processing:
        // End Condition: left == right
        if(left != nums.length && nums[left] == target) return left;
        return -1;
    }

    // 二分查找 --- (left, right)
    // 数组已经是有序的了!
    int binarySearch3(int[] nums, int target) {
        if (nums == null || nums.length == 0)
            return -1;

        int left = 0, right = nums.length - 1;
        while (left + 1 < right){
            int mid = left + (right - left) / 2;
            if (nums[mid] == target) {
                return mid;
            } else if (nums[mid] < target) {
                //  target 在右区间,在(middle, right)中
                left = mid;
            } else {
                // target 在左区间,在(left, middle)中
                right = mid;
            }
        }

        // Post-processing:
        // End Condition: left + 1 == right
        if(nums[left] == target) return left;
        if(nums[right] == target) return right;
        return -1;
    }

标签:二分,right,target,nums,int,length,查找,写法,left
From: https://www.cnblogs.com/my-blog-site/p/16659940.html

相关文章

  • 递归、二分查找
    #递归函数:有最大递归深度,默认接近1000,各版本略有差异count=0defF1(n):n+=1print(n)#123……996F1(n)F1(count)#修改递归深度importsys......
  • Collections.sort排序方法的最简化写法
    假定按照Number对象的Id字段进行排序正序排序Collections.sort(resultList,Comparator.comparing(Number::getId));逆序排序Collections.sort(resultList,Comparato......
  • idea的查找与替换
    查找当前文件内容:ctrl+F如上图片查找全局文件:ctrl+shift+F或doubleshift(按两下)或ctrl+shift+N替换当前文件内容:ctrl+R如上图片你想通过编辑器快速的将所有的......
  • source insight f3、F4循环查找
    摘自:https://blog.csdn.net/Decisiveness/article/details/50748596searchforward(F4)和searchbackward(F3)搜索时会循环,找不到设置的地方将这个特性取消,不要它循环,找一套so......
  • C# WinForm 按名称查找控件
    1///<summary>2///按名称查找控件3///</summary>4///<paramname="parentControl">查找控件的父容器控件</param>5///<paramname="findCtrlName">查......
  • Oracle查看锁表sql写法
    --查看锁表进程SQL语句1:selectsess.sid,sess.serial#,lo.oracle_username,lo.os_user_name,ao.object_name,lo.locked_modefrom......
  • .net通过iText操作pdf文件实现查找关键字签字盖章(新)
    因为上一篇文章确认有问题,后面复测发现bug,现在重新写了,是基于iText写的,复测多次,基本上没问题了。其他需要使用者自行扩展了直接贴代码吧。1usingiText.IO.Image;......
  • NOIP复习(二)二分算法
    提供一种二分写法,不太用考虑边界的问题。intl=st,r=ed,ans=ed+1;while(l<=r){intmid=(l+r)>>1;if(check(mid))ans=mid,l=mid+......
  • 通过 Infinity 和 -Infinity 查找数组中最大和最小值
    functionfindMaxNum(numbers){letmax=-Infinity;for(constnofnumbers){if(n>max){max=n;}}returnmax;}functionfindMi......
  • 二分
    STL函数lower_bound(begin,end,val);、//在a数组中查找3第一次出现的位置//如果查到val,返回val的下标//如果没查到val,返回第一个大于val的元素的下标//如果没查到val,......