有时候会抽时间看看题目,锻炼一下
简单记录下二分查找吧,会持续更新的啊哈~~~
仅供参考,路过看下就行,欢迎交流~
第35题
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
你可以假设数组中无重复元素。例如:
输入: [1,3,5,6], 5 输出: 2
输入: [1,3,5,6], 2 输出: 1
输入: [1,3,5,6], 7 输出: 4
输入: [1,3,5,6], 0 输出: 0
想法:简单粗暴一点,因为是排序数组,所以直接for遍历就可以了。
class Solution(object):
def searchInsert(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: int
"""
# 如果target大于max(nums),则直接插入最后位置
for i in range(0,len(nums)):
if nums[i] >= target:
return i
return len(nums)
但是若目标值若是最大的,则得等循环len(nums)遍才能找到,时间复杂度高。也因为是排序的数组,所以可以考虑二分法。
class Solution(object):
def searchInsert(self, nums, target):
left = 0
right = len(nums)-1
while left <= right :
# 中间的数
middle = (right-left) / 2 + left
if nums[middle] == target:
return middle
elif nums[middle] > target : # 即target在左边
right = middle - 1
else :
left = middle + 1
return left
第69题:x的平方根
实现 int sqrt(int x) 函数。
计算并返回 x 的平方根,其中 x 是非负整数。
由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。
输入: 8
输出: 2
说明: 8 的平方根是 2.82842…,
由于返回类型是整数,小数部分将被舍去。
class Solution(object):
def mySqrt(self, x):
l, r = 0, x
while l <= r:
mid = l + (r-l)//2
if mid * mid <= x < (mid+1)*(mid+1):
return mid
elif x < mid * mid:
r = mid
else:
l = mid + 1
第367题:有效的完全平方数
给定一个正整数 num,编写一个函数,如果 num 是一个完全平方数,则返回 True,否则返回 False。
说明:不要使用任何内置的库函数,如 sqrt。
输入:16 输出:True
输入:14 输出:False
class Solution:
def isPerfectSquare(self, num):
"""
:type num: int
:rtype: bool
"""
left = 0
right = num
#tag = None
while left <= right :
mid = (right-left)//2 + left # 减少循环次数
val = mid *mid
if val == num :
#tag = True
return True
elif val > num :
#tag = False
right = mid - 1
else:
#tag = False
left = mid + 1
#return tag
# 注释掉部分减少运行时间,其次通过val来减少中间运算
return False
第441题:排列硬币
你总共有 n 枚硬币,你需要将它们摆成一个阶梯形状,第 k 行就必须正好有 k 枚硬币。
给定一个数字 n,找出可形成完整阶梯行的总行数。
n 是一个非负整数,并且在32位有符号整型的范围内。
n = 5
硬币可排列成以下几行:
¤
¤ ¤
¤ ¤
因为第三行不完整,所以返回2.
n = 8
硬币可排列成以下几行:
¤
¤ ¤
¤ ¤ ¤
¤ ¤
因为第四行不完整,所以返回3.
class Solution(object):
def arrangeCoins(self, n):
if n == 0:
return 0
left = 1
right = n/2
while left <= right:
mid = (right-left)/2+left
total = (mid * (mid+1)) / 2
if total > n:
right = mid - 1
elif n - total < mid + 1:
return mid
elif n-total == mid + 1:
return mid+1
else:
left = left + 1
return left