NC704二分查找笔记思路

NC704二分查找

二分查找只针对有序数组进行查找,如果无序,需排序后才能进行查找。

递归查找

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

示例 1:

输入: nums = [-1,0,3,5,9,12], target = 9
输出: 4
解释: 9 出现在 nums 中并且下标为 4
输入: nums = [-1,0,3,5,9,12], target = 9
输出: 8
解释: -1 8不存在数组中,返回-1

二分查找思路分析

  • 首先确认该数组中间的下标 即 (left+right)/2
  • 然后使需要查找的数target与nums[mid]进行比较
    • 如果nums[mid] < target,那证明该数在二分的右边,因此需要递归的向右查找
    • 如果nums[mid] > target,那证明该数在二分的左边,因此需要递归的向左查找
    • 如果nums[mid] = target,直接返回
  • 退出递归的条件:
    • 当找到数据时,结束递归
    • 当遍历完后找不到数据,返回 -1 (left>right时,退出递归)

在实现题目之前,需要了解下递归是什么? 递归:自已(方法)调用自已

​ 具体来讲就是把规模大的问题转化为规模小的相似的子问题来解决。在函数实现时,因为解决大问题的方法和解决小问题的方法往往是同一个方法,所以就产生了函数调用它自身的情况。另外这个解决问题的函数必须有明显的结束条件,这样就不会产生无限递归的情况了。

  • 一定有一种可以退出程序的情况
  • 总是在尝试将一个问题简化成更小规模
  • 父问题与子问题不存在重叠的部分

那接下来就是解题思路:

假设我们需要寻找的数据在数组的左边的情况下

在这里插入图片描述

假设在右边的情况下
在这里插入图片描述

** 废话不多说,上代码!!!**

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

    /**
     * @param nums   传入有序数组
     * @param target 传入目标值
     * @return 如果存在该值,返回该值下标,如果不存在返回-1
     */
    public int search(int[] nums, int target) {

        /*
         * 定义左边界以及右边界
         */
        int left = 0;
        int right = nums.length - 1;

        while (left <= right) {
            int mid = left + (right - left) / 2;
            // int mid = (left + right)/2;
            if (nums[mid] > target) {
                right = mid - 1;
            } else if (nums[mid] < target) {
                left = mid + 1;
            } else {
                return mid;
            }
        }
        return -1;
    }

    /**
     * @param nums   有序数组
     * @param left   左边界
     * @param right  右边界
     * @param target 目标数据
     * @return 如果存在该值,返回该值下标,如果不存在返回-1
     */
    public static int binarySearch(int[] nums, int left, int right, int target) {
        int mid = (left + right) / 2;
        int midValue = nums[mid];
        if (left > right) {
            return -1;
        }
        if (midValue < target) {//如果nums[mid] < target,那证明该数在二分的右边,因此需要递归的向右查找
            return Solution.binarySearch(nums, mid + 1, right, target);
        } else if (midValue > target) {  //如果nums[mid] > target,那证明该数在二分的左边,因此需要递归的向左查找
            return Solution.binarySearch(nums, left, mid - 1, target);
        } else {
            return mid;
        }
    }

    public static void main(String[] args) {
    //测试数据修改即可。
        int[] nums = new int[]{1, 2, 3, 5, 9, 12, 18, 22, 35, 82, 92};
        int target = 10;
        int left = 0;
        int right = nums.length - 1;
        int i = Solution.binarySearch(nums, left, right, target);
        System.out.println("target = " + i);
/*        Solution solution = new Solution();
        int num = solution.search(nums, target);
        System.out.println(num);*/
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值