leetcode解题:递归&分治(下)

这篇博客讲具体题目

50. Pow(x, n)

实现 pow(x, n) ,即计算 x 的 n 次幂函数。
示例:

输入: 2.00000, 10
输出: 1024.00000
===========================
输入: 2.10000, 3
输出: 9.26100
===========================
输入: 2.00000, -2
输出: 0.25000
解释: 2-2 = 1/22 = 1/4 = 0.25

说明:
− 100.0 &lt; x &lt; 100.0 {-100.0 &lt; x &lt; 100.0} 100.0<x<100.0
n 是 32 位有符号整数,其数值范围是 [ − 2 31 , 2 31 − 1 ] {[−2^{31}, 2^{31} − 1] } [231,2311]

class Solution:
    def myPow(self, x: float, n: int) -> float:
        
        """
        递归
        n分为奇偶数两种情况
        
        """
        
        if not n:
            return 1
        if n < 0 :
            return 1/self.myPow(x, -n)
        if n % 2:
            # n为奇数的情况
            return self.myPow(x, n-1) * x
        return self.myPow(x * x, n / 2)

执行用时 : 52 ms, 在Pow(x, n)的Python3提交中击败了80.77% 的用户
内存消耗 : 13.3 MB, 在Pow(x, n)的Python3提交中击败了26.84% 的用户

非递归的形式:

class Solution:
    def myPow(self, x: float, n: int) -> float:

        # 非递归(这里用到了位运算,优点是速度快)
        if n < 0:
            x = 1 / x
            n = -n
        pow = 1
        while n:
        	# n的二进制数与1的二进制数的逻辑与
            if n & 1:
                pow *= x
            x *= x
            n >>= 1
            # 把">>"左边的运算数的各二进位全部右移若干位,>> 右边的数字指定了移动的位数
        return pow

执行用时 : 56 ms, 在Pow(x, n)的Python3提交中击败了70.98% 的用户
内存消耗 : 13.2 MB, 在Pow(x, n)的Python3提交中击败了61.54% 的用户
python 位运算

169. 求众数

给定一个大小为 n 的数组,找到其中的众数。众数是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。
你可以假设数组是非空的,并且给定的数组总是存在众数。
示例:

输入: [3,2,3]
输出: 3
===========================
输入: [2,2,1,1,1,2,2]
输出: 2
def majorityElement(nums) -> int:
    # 法1:字典
    # 我这个的时间复杂度较高,因为下面又多了一个循环
    hashmap = {}
    for index in range(len(nums)):
        if nums[index] not in hashmap:
            hashmap[nums[index]] = 1
        else:
            hashmap[nums[index]] += 1

    for item in hashmap.items():
        if item[1] > len(nums) / 2:
            return item[0]

    # 法2:sorted,这个解法有些投机取巧。时间复杂度为O(NlogN)
    # nums = sorted(nums)
    # return nums[len(nums)//2]

print(majorityElement([2, 2, 1, 1, 1, 2, 2]))
print(majorityElement([3, 2, 3]))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值