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