LeetCode704. 二分查找

package leetCodeNumber;

/**
 * @ClassName LeetCode704
 * @Description 二分查找
 *      题目难度:简单
 *      考查知识点:二分查找
 * @Author Jiangnan Cui
 * @Date 2022/6/5 17:09
 * @Version 1.0
 */
public class LeetCode704 {
    /**
     * 题目描述:
     *     给定一个n个元素有序的(升序)整型数组nums和一个目标值target,写一个函数搜索nums中的target,
     * 如果目标值存在返回下标,否则返回 -1。
     * 链接:https://leetcode.cn/problems/binary-search/
     */

    /**
     * @MethodName search1
     * @Description for循环一个一个直接遍历查找
     *      时间复杂度:O(n),其中n为数组长度
     *      空间复杂度:O(1)
     * @param: nums
     * @param: target
     * @return: int
     * @Author Jiangnan Cui
     * @Date 2022/6/5 17:12
     */
    public static int search1(int[] nums, int target) {
        //数组长度
        int n = nums.length;
        //遍历数组一个一个查找
        for (int i = 0; i < n; i++) {
            if(nums[i] == target)
                return i;
        }
        return -1;
    }

    /**
     * @MethodName search2
     * @Description 由于数组是有序排列的,可以使用二分查找进行遍历
     *      时间复杂度:O(logn),其中,n为数组长度
     *      空间复杂度:O(1)
     * @param: nums
     * @param: target
     * @return: int
     * @Author Jiangnan Cui
     * @Date 2022/6/5 17:19
     */
    public static int search2(int[] nums, int target){
        //定义查找范围的左右边界left、right
        int left = 0, right = nums.length - 1;
        //当左边界<=右边界时,说明在查找范围内,进行查找
        while (left <= right){
            //计算中点,注意:为避免整型溢出,此处不使用(left + right) / 2
            int mid = (right - left) / 2 + left;
            //将中点数组值与目标值进行比较
            if(nums[mid] == target){
                return mid;//直接查到时,直接返回中点下标
            }else if(nums[mid] < target){
                left = mid + 1;//小于目标值时,说明要查找的数在中点右侧,所以左边界从中点处向右移动1位
            }else{
                right = mid - 1;//大于目标值时,说明要查找的数在中点左侧,所以右边界从中点处向左移动1位
            }
        }
        //不满足查找范围时,说明查不到,直接返回-1
        return -1;
    }


    public static void main(String[] args) {
        //测试用例1
        int[] nums1 = {-1,0,3,5,9,12};
        int target1 = 9;

        //测试用例2
        int[] nums2 = {-1,0,3,5,9,12};
        int target2 = 2;

        //测试
        //方法1
//        System.out.println(search1(nums1, target1));
//        System.out.println(search1(nums2, target2));

        //方法2
        System.out.println(search2(nums1, target1));
        System.out.println(search2(nums2, target2));
    }

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值