算法篇之(二分查找)

前言:数组中查找元素的时间复杂度是O(n),本篇博客主要学习一种高效查找元素的方法:二分查找,其只能是在有序数组里使用,运用到了分治的思想,不是从到找到尾,而是划定一个范围,然后不断地去缩小查找的范围,最终找到目标元素,时间复杂度是O(log(n))。

思维导图

力扣704

二分查找的经典题,给定有序数组,查找指定元素

力扣

Python代码解题:

1、定义左右边界的变量,左边下标为0,右边是数组的最后一个元素的下标值,len(nums)-1

2、加入一层循环,如果左边下标小于等于右边下标,left<=right,则找到一个中间下标,mid = left + (right - left) / 2

3、用刚找到的中间下标在数组中对应的的值和目标元素进行对比,如果相等,则直接返回,找到的值, if nums[mid] == target: return mid

4、如果找到的中间下标在数组中对应的的值大了,则去左边找, 右界发生变化,right = mid - 1

反之,去右边找,左界发生变化,left = mid + 1

5、如果当左界大于右界,left>right,还没找到,则直接返回-1

需要注意的地方:

第2步时mid = left + (right - left) / 2这行代码,为什么不换成mid = (right +left) / 2?

这种写法可能存在溢出的风险,如果数组长度很长,left不断向right的值靠近,int长度是有限的,此时left+right的值可能会出现负数,用mid = left + (right - left) / 2,有效地规避了这种风险,结果也是正确的,计算的值也是左右边界的一半。

class Solution(object):
    def search(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: int
        """
        left = 0
        right = len(nums) -1 
        while left <= right :
            mid = left + (right - left)/2
            if nums[mid] == target:
                return mid
            elif nums[mid] < target:
                left = mid + 1
            elif nums[mid] > target:
                right = mid - 1
        return -1

力扣69 计算平方根

力扣

Python代码解题:

class Solution(object):
    def mySqrt(self, x):
        """
        :type x: int
        :rtype: int
        """
        if x == 0 or x == 1:
            return x
        left = 1
        right = x
        while left <= right :
            mid = (left + right)//2
            if mid == x / mid:
                return mid
            elif mid > x / mid:
                right = mid - 1
            else:
                left = mid + 1

        if left  > x / left:
            return left - 1
        else:
            return left

猜你喜欢

转载自blog.csdn.net/MRJJ_9/article/details/132088670