力扣刷题笔记 1《二分查找》
“ 今天的努力
不会被辜负”
01
—
704.二分查找
题目:给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
思路:因为数组是升序的,可采用二分(折半)查找的方法对nums进行搜索target。
具体步骤:先定义两个指针指向数组的头和尾,再计算出中间位置指针,通过比较中间位置指针的值与目标(target)值是否相等,相等则返回数组下标;如果中间位置的值大于目标值,则说明目标值在中间位置的左侧,即将尾指针换到中间位置向左一个位置;反之则将头指针换到中间位置向右一个位置,直到找到目标值,否则当左指针大于右指针值说明该目标值不存在,返回-1。
Java代码:
class Solution {
public int search(int[] nums, int target) {
//二分查找
int s=0; //头指针start
int e=nums.length-1; //尾指针end
while(e>=s){
// int mid = (s+e)/2; //中间指针middle
int mid = s+(e-s)/2; //防止溢出
if(nums[mid]==target){
return mid;
}else if(nums[mid]>target){
e = mid-1;
}else if(nums[mid]<target){
s = mid+1;
}
}
return -1;//没找到返回-1
}
}
注意:刚开始自己会纠结于头尾坐标之和是奇数还是偶数;其实该点可能忽略,因为Java中int类型的数相加后除2还是int类型数,即向下取整。所以不管两数和为奇数还是偶数中间位置都能找到。
时间复杂度:O(logN)
计算过程:
空间复杂度:O(1)
计算过程:在数组长度随意变化的情况下,二分查找所需的变量个数为3,即为3*n^0