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
Comments NOTHING