leetcode刷题记录341-350 python版

前言

继续leetcode刷题生涯
这里记录的都是笔者觉得有点意思的做法
参考了好几位大佬的题解,尤其是powcai大佬和labuladong大佬,感谢各位大佬

341. 扁平化嵌套列表迭代器

# 栈
class NestedIterator:
    def __init__(self, nestedList: [NestedInteger]):
        # 对于nestedList中的内容,我们需要从左往右遍历,
        # 但堆栈pop是从右端开始,所以我们压栈的时候需要将nestedList反转再压栈
        self.stack = nestedList[::-1]
    def next(self) -> int:
        # hasNext 函数中已经保证栈顶是integer,所以直接返回pop结果
        return self.stack.pop(-1).getInteger()
    def hasNext(self) -> bool:
        # 对栈顶进行‘剥皮’,如果栈顶是List,把List反转再依次压栈,
        # 然后再看栈顶,依次循环直到栈顶为Integer。
        # 同时可以处理空的List,类似[[[]],[]]这种test case
        while len(self.stack) > 0 and self.stack[-1].isInteger() is False:
            self.stack += self.stack.pop().getList()[::-1]
        return len(self.stack) > 0

342. 4的幂

class Solution:
    def isPowerOfFour(self, num: int) -> bool:
        if num > 1:
            while num % 4 == 0:
                num //= 4
        return num == 1

343. 整数拆分

# 数学
class Solution:
    def integerBreak(self, n: int) -> int:
        if n <= 3: return n - 1
        a, b = divmod(n, 3)
        if b == 0: return 3 ** a
        if b == 1: return 3 ** (a - 1) * 4
        return 3 ** a * 2
# 动态规划
class Solution:
    def integerBreak(self, n: int) -> int:
        dp = [1] * (n + 1)
        for i in range(2, n + 1):
            for j in range(1, i):
                dp[i] = max(dp[i], max(j, dp[j]) * max(i - j, dp[i - j]))
        return dp[-1]

344. 反转字符串

class Solution:
    def reverseString(self, s: List[str]) -> None:
        """
        Do not return anything, modify s in-place instead.
        """
        s[:] = s[::-1]
# 双指针
class Solution:
    def reverseString(self, s: List[str]) -> None:
        """
        Do not return anything, modify s in-place instead.
        """
        left = 0
        right = len(s) - 1
        while left < right:
            s[left], s[right] = s[right], s[left]
            left += 1
            right -= 1

345. 反转字符串中的元音字母

class Solution:
    def reverseVowels(self, s: str) -> str:
        lookup = set('aeiouAEIOU')
        s_list = list(s)
        left, right = 0, len(s_list) - 1
        while left < right:
            while left < right and s_list[left] not in lookup: left += 1
            while left < right and s_list[right] not in lookup: right -= 1
            s_list[left], s_list[right]= s_list[right], s_list[left]
            left += 1
            right -= 1
        return "".join(s_list)

347. 前 K 个高频元素

# 库函数
class Solution:
    def topKFrequent(self, nums: List[int], k: int) -> List[int]:
        import collections
        return [item[0] for item in collections.Counter(nums).most_common(k)]
# 桶排序
class Solution:
    def topKFrequent(self, nums: List[int], k: int) -> List[int]:
        from collections import Counter
        c = Counter(nums)
        buckets = [[] for _ in range(len(nums) + 1)]
        for x, y in c.items():
            buckets[y].append(x)
        res = []
        for i in range(len(nums), -1, -1):
            if len(res) > k:
                break
            res.extend(buckets[i])
        return res[:k]

349. 两个数组的交集

class Solution:
    def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]:
        return list(set(nums1) & set(nums2))
# 双指针
class Solution:
    def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]:
        nums1.sort()
        nums2.sort()
        p1 = 0
        p2 = 0
        res = set()
        while p1 < len(nums1) and p2 < len(nums2):
            if nums1[p1] == nums2[p2]:
                res.add(nums1[p1])
                p1 += 1
                p2 += 1
            elif nums1[p1] > nums2[p2]:
                p2 += 1
            else:
                p1 += 1
        return list(res)

350. 两个数组的交集 II

# 库函数
class Solution:
    def intersect(self, nums1: List[int], nums2: List[int]) -> List[int]:
        import collections
        return list((collections.Counter(nums1) & collections.Counter(nums2)).elements())
# 双指针
class Solution:
    def intersect(self, nums1: List[int], nums2: List[int]) -> List[int]:
        nums1.sort()
        nums2.sort()
        p1 = 0
        p2 = 0
        res = []
        while p1 < len(nums1) and p2 < len(nums2):
            if nums1[p1] == nums2[p2]:
                res.append(nums1[p1])
                p1 += 1
                p2 += 1
            elif nums1[p1] > nums2[p2]:
                p2 += 1
            else:
                p1 += 1
        return res

猜你喜欢

转载自blog.csdn.net/weixin_44604541/article/details/106664710