算法基础讲解--二分法

1、二分查找法的核心

很多人没有抓住二分法的核心,使用二分查找的前提是有序、无重复,满足这两点以后,就可以考虑使用二分法来解决问题。而二分法的核心是边界区间的处理,理解好边界区间的概念,才是最最重要的。

2、边界区间的处理

首先要理解区间的概念,区间可以简单理解为从start到end。
一个数组,从下标0开始,到任意大于0的下标结束,是一个区间。
而二分法中,区间一般分为左闭右闭[left,right],以及左闭右开[left,right),并且在查找中这个区间的数值是动态变化的;取中间值middle=(left+right)/2,利用middle去数组中对比数据,主要分三种情况:
1、当nums[middle]>target时,那么middle右边可以砍掉了,最新的right为middle-1,此时边界区间为[left,middle-1]
2、当nums[middle]<target时,那么middle左边可以砍掉了,最新的left为middle+1,此时边界区间为[middle+1,right]
3、当nums[middle] = =target时,直接返回middle下标

3、原题讲解

LeetCode原题704,给定一个整形数组nums,在nums中寻找目标target,如果目标值存在则返回下标,不存在则返回-1。思路如下:
数组起始下标为left,终点下标为right,中间下标为middle;以middle去一一对比,首先判断middle与target值的大小对比。
-- 如果nums[middle]>target,则right=middle-1.
-- 如果nums[middle]<target,则left=middle+1.
-- 如果nums[middle]==target,则返回middle.
-- 如果不存在,则return -1.
要注意的是,边界left和right是随着判断结果,动态变化的,这是关键,下面是代码

class Solution {
   public int search(int[] nums, int target) {
       //[left,right]
       int left =0;
       int right = nums.length-1;

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

4、总结

后续会不断的精简、并推出一系列的数据结构与算法的讲解,很多概念性的知识可以自行百度,这里适用于有一定基础的同学,有讲错的地方希望大家指出,感谢!

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值