《算法》是我学习算法的记录。
二分查找
概述
在有序数组中搜索特定值的过程。
二分查找中使用的术语:
- 目标 Target —— 你要查找的值
- 索引 Index —— 你要查找的当前位置
- 左、右指示符 Left,Right —— 我们用来维持查找空间的指标
- 中间指示符 Mid —— 我们用来应用条件来确定我们应该向左查找还是向右查找的索引
算法思想
二分法:二分法查找的思路如下:
(1)首先,从数组的中间元素开始搜索,如果该元素正好是目标元素,则搜索过程结束,否则执行下一步。
(2)如果目标元素大于/小于中间元素,则在数组大于/小于中间元素的那一半区域查找,然后重复步骤(1)的操作。
(3)如果某一步数组为空,则表示找不到目标元素。
结构
一个典型的二分查找实例:
有一个有序数组{1,1,2,4,6,8,7,8},输入一个目标target=4,查找目标在该数组中的位置,返回位置;若无,则返回-1。
public class Solution {
public static void main(String[] args) {
//利用s来接受search的返回值
int s= search(new int[]{1, 1, 2, 4, 6, 8, 7, 8},4);
//打印返回值
System.out.println(s);
}
public static int search(int[] nums, int target){
//建立两个指针:一个为最左端,一个为最右端
int left=0,right=nums.length-1;
//当left<=right时,循环
while(left<=right){
//计算中间位置mid
int mid=left+(right-left)/2;
//if语句:当nums[mid]等于target时,则找到了数组中元素中值等于target的相应的角标mid
if(target==nums[mid]){
return mid;
}
//如果target小于,则使right指针指向mid-1的位置,进行下一次循环;
//同理若target大于,则使left指针指向mid+1的位置。
else if(target<nums[mid]){
right=mid-1;
}else{
left=mid+1;
}
}
//若循环结束仍未找到target,则返回负值。
return -1;
}
}
时间和空间复杂度
时间复杂度:O(log n)
我们的每一次所需查找的数量都是上一次的一半
空间复杂度:O(1) —常量空间
我们只需要额外建立三个常量:left、right、mid
166

被折叠的 条评论
为什么被折叠?



