leetcode 二分查找 - easy

有时候会抽时间看看题目,锻炼一下
简单记录下二分查找吧,会持续更新的啊哈~~~
仅供参考,路过看下就行,欢迎交流~

  • 第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
    原文作者:unpredictable_X
    原文地址: https://segmentfault.com/a/1190000016284551
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞