LeetCode冲刺:Day32

ArslanTu 发布于 2022-12-09 1,075 次阅读


1. 多个数组求交集

难度

  • Easy
  • Medium
  • Hard

完成情况

  • 独立完成
  • 参考思路
  • 参考答案

思路

数字范围有限。用一个数组记录每个数字总的出现次数,等于数组数量者即为所求。

代码

class Solution:
def intersection(self, nums: List[List[int]]) -> List[int]:
cnt = [0] * 1001
for num in nums:
for number in num:
cnt[number] += 1
ans = []
n = len(nums)
for i in range(1001):
if cnt[i] == n: ans.append(i)
return ans

2. 统计圆内格点数目

难度

  • Easy
  • Medium
  • Hard

完成情况

  • 独立完成
  • 参考思路
  • 参考答案

思路

枚举所有的点,且对圆进行排序,以便尽早找到。

一开始想过枚举所有点,但不确定坐标范围。

代码

class Solution:
def countLatticePoints(self, circles: List[List[int]]) -> int:
ans = 0
circles.sort(key = lambda c: -c[2])
max_x = max(c[0] + c[2] for c in circles)
max_y = max(c[1] + c[2] for c in circles)
for i in range(max_x + 1):
for j in range(max_y + 1):
for x, y, r in circles:
if (x - i) * (x - i) + (y - j) * (y - j) <= r * r:
ans += 1
break
return ans

3. 统计包含每个点的矩形数目

难度

  • Easy
  • Medium
  • Hard

完成情况

  • 独立完成
  • 参考思路
  • 参考答案

思路

对纵坐标由大到小排序,若纵坐标不小于当前点的纵坐标,把其横坐标加入数组,然后对数组排序。二分查找计算横坐标不小于当前点横坐标的计数。

代码

class Solution:
def countRectangles(self, rectangles: List[List[int]], points: List[List[int]]) -> List[int]:
rectangles.sort(key=lambda r: -r[1])
n = len(points)
ans = [0] * n
i, xs = 0, SortedList()
for (x, y), id in sorted(zip(points, range(n)), key=lambda x: -x[0][1]):
while i < len(rectangles) and rectangles[i][1] >= y:
xs.add(rectangles[i][0])
i += 1
ans[id] = i - xs.bisect_left(x)
return ans

4. 花期内花的数目

难度

  • Easy
  • Medium
  • Hard

完成情况

  • 独立完成
  • 参考思路
  • 参考答案

思路

差分法。没发现有点不应该。

直接扒的代码,还有一些操作值得学习。

代码

class Solution:
def fullBloomFlowers(self, flowers: List[List[int]], persons: List[int]) -> List[int]:
diff = defaultdict(int) # 也可以用 SortedDict
for start, end in flowers:
diff[start] += 1
diff[end + 1] -= 1
times = sorted(diff.keys())
n = len(persons)
ans = [0] * n
i = sum = 0
for p, id in sorted(zip(persons, range(n))):
while i < len(times) and times[i] <= p:
sum += diff[times[i]] # 累加变化量
i += 1
ans[id] = sum
return ans