继续leetcode刷题生涯
这里记录的都是笔者觉得有点意思的做法
参考了好几位大佬的题解,尤其是powcai大佬和labuladong大佬,感谢各位大佬
class Solution:
def frequencySort(self, s: str) -> str:
return "".join(k * v for k, v in collections.Counter(s).most_common())
# 贪心,类似435
class Solution:
def findMinArrowShots(self, points: List[List[int]]) -> int:
if not points: return 0
points.sort(key=lambda x: x[1])
cur_end = points[0][1]
num = 1
for start, end in points[1:]:
if start > cur_end:
num += 1
cur_end = end
return num
class Solution:
def minMoves(self, nums: List[int]) -> int:
return sum(nums) - len(nums) * min(nums)
class Solution:
def fourSumCount(self, A: List[int], B: List[int], C: List[int], D: List[int]) -> int:
lookup = collections.defaultdict(int)
res = 0
for a in A:
for b in B:
lookup[a+b] += 1
for c in C:
for d in D:
res += lookup[-(c + d)]
return res
class Solution:
def findContentChildren(self, g: List[int], s: List[int]) -> int:
g.sort()
s.sort()
res = 0
i, j = 0, 0
while i < len(g) and j < len(s):
while j < len(s) and g[i] > s[j]:
j += 1
if j < len(s):
res += 1
i += 1
j += 1
return res
# 栈
class Solution:
def find132pattern(self, nums: List[int]) -> bool:
ak = float("-inf")
stack = []
for num in reversed(nums):
if ak > num: return True
while stack and stack[-1] < num:
ak = stack.pop()
stack.append(num)
return False
# 双指针
class Solution:
def circularArrayLoop(self, nums: List[int]) -> bool:
n = len(nums)
# x的下一个位置
nxt = lambda x: (x + nums[x]) % n
for i in range(n):
if nums[i] == 0: continue
slow = i
fast = nxt(i)
# 快慢指针
while nums[slow] * nums[fast] > 0 and nums[fast] * nums[nxt(fast)] > 0:
if slow == fast:
if slow == nxt(slow):
break
else:
return True
slow = nxt(slow)
fast = nxt(nxt(fast))
# 访问过的置0
val = nums[i]
while val * nums[i] > 0:
tmp = nxt(i)
nums[i] = 0
i = tmp
return False
# 5^x
class Solution:
def poorPigs(self, buckets: int, minutesToDie: int, minutesToTest: int) -> int:
pigs = 0
while (minutesToTest // minutesToDie + 1) ** pigs < buckets:
pigs += 1
return pigs
# s+s再去掉首尾应该还有一个s
class Solution:
def repeatedSubstringPattern(self, s: str) -> bool:
return (s+s)[1:-1].find(s) != -1
class LFUCache:
def __init__(self, capacity: int):
from collections import OrderedDict, defaultdict
self.freq = defaultdict(OrderedDict)
self.key_to_freq = {}
self.capacity = capacity
self.min_freq = 0
def get(self, key: int) -> int:
if key not in self.key_to_freq:
return -1
key_freq = self.key_to_freq[key]
res = self.freq[key_freq].pop(key)
if not self.freq[key_freq] and key_freq == self.min_freq:
self.min_freq += 1
self.freq[key_freq + 1][key] = res
self.key_to_freq[key] = key_freq + 1
return res
def put(self, key: int, value: int) -> None:
if self.capacity == 0: return
# key 本身就在其中
if key in self.key_to_freq:
key_freq = self.key_to_freq[key]
self.freq[key_freq].pop(key)
if not self.freq[key_freq] and key_freq == self.min_freq:
self.min_freq += 1
self.freq[key_freq + 1][key] = value
self.key_to_freq[key] = key_freq + 1
else:
# key不在, 要弹出频率使用次数少的key
if len(self.key_to_freq) == self.capacity:
k, v = self.freq[self.min_freq].popitem(last=False)
self.key_to_freq.pop(k)
self.key_to_freq[key] = 1
self.freq[1][key] = value
self.min_freq = 1