数组:二分查找

使用二分法来查找数组元素是挺高效的一种算法,但是对于判断条件经常容易出现错误,这里写一下判断条件的制定规则
二分法是不断的把区间变小,最重要的就是区间的制定。
一般有两种区间控制类型:1. 左闭右闭 [left,right] 2. 左闭右开 [left,right)
不管哪种方法,控制middle变量的方法是一样的

middle=left+((right-left)/2) //防止溢出

1、[left,right]
因为左右两边都是闭区间,因此都是有效下标值。right的初始值为nums[].length-1。当left==right时是有效的,即right和left都是同一个值。因此循环条件应置为

left<=right

当nums[middle]>target时,要更改左段的结束区间

right=middle-1
left=middle+1

2、[left,right)
因为这里是左闭右开区间,所以right的取值是取不到的,会将其初始值置为数组大小,可以把循环条件置为

left<right

当nums[middle]>target时,要更改左段的结束区间

right=middle
left=middle+1

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

输入: nums = [-1,0,3,5,9,12], target = 9
输出: 4
解释: 9 出现在 nums 中并且下标为 4
示例 2:

输入: nums = [-1,0,3,5,9,12], target = 2
输出: -1
解释: 2 不存在 nums 中因此返回 -1

使用左闭右闭:

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

使用左闭右开

class Solution {
    public int search(int[] nums, int target) {
        Arrays.sort(nums);
        int n=nums.length;
        int right=n,left=0;
        int middle=0;
        //左闭右开
        while(left<right){
            middle=left+((right-left)/2);
            if(nums[middle]<target){
                left=middle+1;
            }else if(nums[middle]>target){
                right=middle;
            }else if(nums[middle]==target){
                return middle;
            }
        }
        return -1;  
    }
}
posted @   Dreamer_szy  阅读(158)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示