452. 用最少数量的箭引爆气球
解法:排序+贪心
对于某个气球,沿着其右边界射箭,能够尽可能射中最多的气球,所有左边界小于其右边界的均被射中。因此想要求最小弓箭数,即找到数组中最少非重叠子区间数。求解方式如下:
1、先对数组按右边界升序排序。
2、维护指针pos,用于表明当前子区间右边界,初始为point[0][1]。
3、遍历数组,若左边界小于等pos,则区间之间相互重叠,可用一支箭射中,若左边界大于pos,则为新的子区间,更新pos为point[i][1],弓箭数量+1.
贪心的思想是每次取右边界,目的尽可能囊括更多的重叠区间,在这样的贪心策略下(由局部最优(如果当前射出最右侧的箭都不能解决某个气球,才需要一支新的箭)找到全局最优),最终会得到最少的弓箭数。
class Solution:
def findMinArrowShots(self, points: List[List[int]]) -> int:
if not points:
return 0
points.sort(key=lambda balloon: balloon[1])
pos = points[0][1]
ans = 1
# print(points)
for balloon in points:
if balloon[0] > pos:
pos = balloon[1]
ans += 1
return ans
1154. 一年中的第几天
解法:逻辑计算
这题核心是了解每月有多少天,以及对特殊情况"闰年"的判断。
class Solution:
def dayOfYear(self, date: str) -> int:
year, month, day = [int(x) for x in date.split("-")]
amount = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
if year % 400 == 0 or (year % 4 == 0 and year % 100 != 0):
amount[1] += 1
ans = sum(amount[:month - 1])
return ans + day