@@ -137,29 +137,21 @@ public:
137
137
### Java
138
138
``` java
139
139
/**
140
- 时间复杂度 : O(NlogN) 排序需要 O(NlogN) 的复杂度
141
-
142
- 空间复杂度 : O(logN) java所使用的内置函数用的是快速排序需要 logN 的空间
143
- */
140
+ * 时间复杂度 : O(NlogN) 排序需要 O(NlogN) 的复杂度
141
+ * 空间复杂度 : O(logN) java所使用的内置函数用的是快速排序需要 logN 的空间
142
+ */
144
143
class Solution {
145
144
public int findMinArrowShots (int [][] points ) {
146
- if (points. length == 0 ) return 0 ;
147
- // 用x[0] - y[0] 会大于2147483647 造成整型溢出
148
- Arrays . sort(points, (x, y) - > Integer . compare(x[0 ], y[0 ]));
149
- // count = 1 因为最少需要一个箭来射击第一个气球
150
- int count = 1 ;
151
- // 重叠气球的最小右边界
152
- int leftmostRightBound = points[0 ][1 ];
145
+ // 根据气球直径的开始坐标从小到大排序
146
+ // 使用Integer内置比较方法,不会溢出
147
+ Arrays . sort(points, (a, b) - > Integer . compare(a[0 ], b[0 ]));
148
+
149
+ int count = 1 ; // points 不为空至少需要一支箭
153
150
for (int i = 1 ; i < points. length; i++ ) {
154
- // 如果下一个气球的左边界大于最小右边界
155
- for (int i = 1 ; i < points. length; i++ ){
156
- if (points[i][0 ] > leftmostRightBound ) {
157
- // 增加一次射击
158
- count++ ;
159
- leftmostRightBound = points[i][1 ];
160
- // 不然就更新最小右边界
161
- } else {
162
- leftmostRightBound = Math . min(leftmostRightBound , points[i][1 ]);
151
+ if (points[i][0 ] > points[i - 1 ][1 ]) { // 气球i和气球i-1不挨着,注意这里不是>=
152
+ count++ ; // 需要一支箭
153
+ } else { // 气球i和气球i-1挨着
154
+ points[i][1 ] = Math . min(points[i][1 ], points[i - 1 ][1 ]); // 更新重叠气球最小右边界
163
155
}
164
156
}
165
157
return count;
0 commit comments