二分查找 [力扣704]

二分查找一般用于查找数组中的某个元素:所以在这里我们需要知道数组的一写相关知识:

数组在内存中的存储方式:数组是存放在连续内存空间上的相同类型数据的集合。

  • 数组下标都是从0开始的。

  • 数组内存空间的地址是连续的

因为数组的在内存空间的地址是连续的,所以我们在删除或者增添元素的时候,就难免要移动其他元素的地址。

数组的元素是不能进行删除的,只能覆盖

这里我们可以思考一个问题:那么二维数组在内存的空间地址是连续的么?

在上面的例子中:我们可以看出二维数组地址是连续一条线的 C++中二维数组在地址空间上是连续的

在java中算法是没有规律的也就不能说连续了

这里需要补充的知识有:进制的判断

力扣704 【二分查找】

二分查找也称折半查找,折半查找幽囚线性表必须采用顺序存储结构,表中元素按照关键字有序排列

二分查找的条件

1.是一个有序数列

2.必须是按照关键词大小进行排序

实现原理

假设我们比较的有序数列有三个数,我们比较一个元素的值和数组中间位置的元素的值进行比较,如果比中间的元素大,则在有序数组的后半部分进行查找;如果中间位置的元素的值小,则跟有序数组的前半部分进行比较;如果相等,则找到了比较元素的位置.

流程
  • 把待查找的元素与有序数组的中间位置的值进行比较,如果大于则比较后半部分,小于则比较前半部分

  • 此后,有序数组变为原来数组的前半部分或者后半部分

  • 继续执行第一步,依次比较元素与当前数组的中间值的大小

容易混淆的点

在判断while循环的时候是写 <= 还是<    面对if 判断的时候是 left=middle-1 还是left=middle
这里需要根据数组的区间来判断
数组区间是 左闭右闭 就是 <=
数组区间是 左闭右开 就是 <
class Solution {
    public int search(int[] nums, int target) {
    int left=0;
    int right=nums.length-1;
    int middle;
    while(left<=right){
        middle=(left+right)/2;
    if(nums[middle]>target){
        right=middle-1;
    }else if(nums[middle]<target){
        left=middle+1;
    }else{
        return middle;
    }
  
    }
      return -1;
    }
}
// 注:java 中如果相除的两个数都是整数,那么结果也会是整数,这就是取整除法
 * @param {number[]} nums
 * @param {number} target
 * @return {number}
 */
var search = function(nums, target) {
let left=0, right=nums.length-1, middle;
while(left<=right){
    middle=Math.floor((left+right)/2);
    if(nums[middle]>target){
        right=middle-1;
    }else if(nums[middle]<target){
        left=middle+1;
    }else{
        return middle;
    }
}
return -1;
};
// Math.floor()  返回小于或等于一个给定数字的最大整数 这里使用到Math.floor() 是为了保证最终取到的结果为整数

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值