vlambda博客
学习文章列表

力扣刷题笔记 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