Skip to content

Latest commit

 

History

History
 
 

452. Minimum Number of Arrows to Burst Balloons

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 

There are some spherical balloons spread in two-dimensional space. For each balloon, provided input is the start and end coordinates of the horizontal diameter. Since it's horizontal, y-coordinates don't matter, and hence the x-coordinates of start and end of the diameter suffice. The start is always smaller than the end.

An arrow can be shot up exactly vertically from different points along the x-axis. A balloon with xstart and xend bursts by an arrow shot at x if xstart ≤ x ≤ xend. There is no limit to the number of arrows that can be shot. An arrow once shot keeps traveling up infinitely.

Given an array points where points[i] = [xstart, xend], return the minimum number of arrows that must be shot to burst all balloons.

 

Example 1:

Input: points = [[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).

Example 2:

Input: points = [[1,2],[3,4],[5,6],[7,8]]
Output: 4

Example 3:

Input: points = [[1,2],[2,3],[3,4],[4,5]]
Output: 2

Example 4:

Input: points = [[1,2]]
Output: 1

Example 5:

Input: points = [[2,3],[2,3]]
Output: 1

 

Constraints:

  • 0 <= points.length <= 104
  • points.length == 2
  • -231 <= xstart < xend <= 231 - 1

Related Topics:
Greedy, Sort

Similar Questions:

Solution 1. Greedy

// OJ: https://leetcode.com/problems/minimum-number-of-arrows-to-burst-balloons/
// Author: github.com/lzl124631x
// Time: O(NlogN)
// Space: O(1)
class Solution {
public:
    int findMinArrowShots(vector<vector<int>>& A) {
        if (A.empty()) return 0;
        sort(begin(A), end(A));
        int ans = 1, arrow = A[0][1];
        for (auto &b : A) {
            if (b[0] <= arrow) arrow = min(arrow, b[1]);
            else {
                arrow = b[1];
                ++ans;
            }
        }
        return ans;
    }
};

Or

// OJ: https://leetcode.com/problems/minimum-number-of-arrows-to-burst-balloons/
// Author: github.com/lzl124631x
// Time: O(NlogN)
// Space: O(1)
class Solution {
public:
  int findMinArrowShots(vector<vector<int>>& A) {
      sort(begin(A), end(A));
      int ans = 0, N = A.size();
      for (int i = 0; i < N; ++ans) {
          int arrow = INT_MAX;
          for (; i < N && A[i][0] <= arrow; ++i) arrow = min(arrow, A[i][1]);
      }
      return ans;
  }
}; 

Solution 2. Interval Scheduling Maximization (ISM)

// OJ: https://leetcode.com/problems/minimum-number-of-arrows-to-burst-balloons/
// Author: github.com/lzl124631x
// Time: O(NlogN)
// Space: O(1)
class Solution {
public:
    int findMinArrowShots(vector<vector<int>>& A) {
        sort(begin(A), end(A), [](auto &a, auto &b) { return a[1] < b[1]; });
        long ans = A.size(), e = LONG_MIN;
        for (auto &v : A) {
            if (v[0] <= e) --ans; // this interval overlaps with another interval. We don't need a separate arrow for it.
            else e = v[1];
        }
        return ans;
    }
};