leetcode刷题之二分查找法

二分法

基本思想:设数据是按升序排序的,对于给定值key,从序列的中间位置k开始比较,如果当前位置arr[k]值等于key,则查找成功;若key小于当前位置值arr[k],则在数列的前半段中查找,arr[low,mid-1];若key大于当前位置值arr[k],则在数列的后半段中继续查找arr[mid+1,high],直到找到为止。

时间复杂度:O(log(n)) #(以2为底数)。

注意事项(1)当数据量很大适宜采用该方法。(2)采用二分法查找时,数据需要排好序。

  • 1. x的平方根,实现 int sqrt(int x) 函数。计算并返回 x 的平方根,其中 x 是非负整数。由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。题目链接:https://leetcode-cn.com/problems/sqrtx/

解法I(二分法):参考链接:https://leetcode-cn.com/problems/sqrtx/solution/er-fen-cha-zhao-niu-dun-fa-python-dai-ma-by-liweiw/

def mySqrt(x):
    left = 0
    right = x//2+1
    while left<right:
        #右移运算,运算结果正好能对应一个整数的二分之一值,这就正好能代替数学上的除2运算,但是比除2运算要快。
        mid = (left + right + 1)>>1
        square = mid*mid
        
        if square > x:
            right = mid-1
        else:
            left = mid
    return left

解法I:

# The isBadVersion API is already defined for you.
# @param version, an integer
# @return a bool
# def isBadVersion(version):
class Solution:
    def firstBadVersion(self, n):
        """
        :type n: int
        :rtype: int
        """
        if isBadVersion(0) == True : return 0
        if isBadVersion(n-1) == False : return n
        left = 1
        right = n-1
        while left < right :
            mid = (left+right)>>1
            if isBadVersion(mid) == True:
                right = mid
            else:left = mid + 1
        return left

  1. 有效的完全平方数:给定一个正整数 num,编写一个函数,如果 num 是一个完全平方数,则返回 True,否则返回 False。题目链接:https://leetcode-cn.com/problems/valid-perfect-square/

    解法I:(自己的解法),注意:搞清到底是左还是右中位数
class Solution:
    def isPerfectSquare(self, num: int) -> bool:
        if num == 0 or num==1:return True
        left = 1
        right = num//2
        while left<right :
            mid = (left+right+1)>>1
            sqr = mid**2
            if sqr<num:
                left = mid
            elif sqr>num:
                right = mid-1
            else:return True
        return False
        

发布了59 篇原创文章 · 获赞 8 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/Galen_xia/article/details/103210572