前言
继续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