二分查找一般用于查找数组中的某个元素:所以在这里我们需要知道数组的一写相关知识:
数组在内存中的存储方式:数组是存放在连续内存空间上的相同类型数据的集合。
数组下标都是从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() 是为了保证最终取到的结果为整数