二分法
基本思想:设数据是按升序排序的,对于给定值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
- 2.第一个错误版本:题目链接:https://leetcode-cn.com/problems/first-bad-version/
解法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
- 有效的完全平方数:给定一个正整数 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