バーストバルーンの矢印LeetCode 0452.最小数は矢印バルーンの最小数と爆発[中] [パイソン] [貪欲]セクション
問題
球形の風船の数は、2次元空間に広がりがあります。各バルーンのために、提供された入力は、水平直径の開始および終了座標です。それは水平なので、y座標は重要でない、従って開始及び直径で十分の端のx座標。スタートはいつも終わりよりも小さくなっています。最大で10 ^ 4の風船があります。
矢印は、x軸に沿った異なる点から正確に垂直に撮影することができます。X場合XSTART≤X≤たxendにおける矢印ショットでXSTARTとxendをバーストを有するバルーン。撮影できる矢印の数に制限はありません。ショット一度矢印は無限にまで旅を続けます。問題は、すべての風船を破裂さ撃たれなければならない矢印の最小数を見つけることです。
例:
Input:
[[10,16], [2,8], [1,6], [7,12]]
Output:
2
Explanation:
One way is to shoot one arrow for example at x = 6 (bursting the balloons [2,8] and [1,6]) and another arrow at x = 11 (bursting the other two balloons).
問題
2次元空間での多くの球形の風船があります。各バルーンのために、入力は、水平方向にバルーンの開始および終了座標の直径が設けられています。それは水平なので、y座標は、限り、我々はx座標の始まりと終わりが十分にある知っているように、それほど重要ではありません。スタート座標は、座標の終わりよりも常に小さいです。10 ^ 4風船面までの存在。
弓矢は完全にX軸に垂直に沿った異なる点から放射されてもよいです。バルーンXSTARTの開始および終了座標の直径場合、座標に矢印xを放出、xendを、及びXSTART≤X≤xendを満たし、バルーンが爆発します。弓の数は限定されることなく出射することができます。弓と矢を撮影したら、あなたは無期限に転送することができます。我々は、すべての、すべての風船が爆発したことが弓と矢の最低限必要な数を見つけたいです。
例:
输入:
[[10,16], [2,8], [1,6], [7,12]]
输出:
2
解释:
对于该样例,我们可以在x = 6(射爆[2,8],[1,6]两个气球)和 x = 11(射爆另外两个气球)。
思考
貪欲間隔
第一小の右端が大きいために、現在temp_posを比較する第一の組の右端にtemp_posポインタ、及び各時間が矢印と共にtemp_pos <左端点は、必要性を示す場合、更新はtemp_posあり、エンドポイントを残し現在の右のポイントは、比較を続けます。
時間計算量:O(LEN(点))
空間的複雑:O(1)
Pythonコード
class Solution(object):
def findMinArrowShots(self, points):
"""
:type points: List[List[int]]
:rtype: int
"""
if not points or len(points) == 0:
return 0
points.sort(key = lambda x: x[1]) # 按右端点从小到大排序
temp_pos = points[0][1]
cnt = 1
for i in range(len(points)):
if temp_pos >= points[i][0]: # 当右端点<左端点时,要再加一支箭
continue
temp_pos = points[i][1]
cnt += 1
return cnt