Set Intersection Size At Least Two

hard greedy sorting intervals

Problem

Given a list of closed intervals, find the smallest set S such that every interval contains at least two integers from S.

Inputintervals=[[1,3],[3,7],[8,9]]
Output5
One valid set is {1,2,3,7,8,9}; minimum size 5.

def intersectionSizeTwo(intervals):
    intervals.sort(key=lambda x: (x[1], -x[0]))
    a = b = -1
    ans = 0
    for s, e in intervals:
        if s > b:
            ans += 2
            b, a = e, e-1
        elif s > a:
            ans += 1
            a, b = b, e
    return ans
function intersectionSizeTwo(intervals) {
  intervals.sort((x,y) => x[1]-y[1] || y[0]-x[0]);
  let a = -1, b = -1, ans = 0;
  for (const [s, e] of intervals) {
    if (s > b) { ans += 2; b = e; a = e-1; }
    else if (s > a) { ans += 1; a = b; b = e; }
  }
  return ans;
}
int intersectionSizeTwo(int[][] intervals) {
    Arrays.sort(intervals, (x,y) -> x[1]!=y[1] ? x[1]-y[1] : y[0]-x[0]);
    int a = -1, b = -1, ans = 0;
    for (int[] iv : intervals) {
        int s = iv[0], e = iv[1];
        if (s > b) { ans += 2; b = e; a = e-1; }
        else if (s > a) { ans += 1; a = b; b = e; }
    }
    return ans;
}
int intersectionSizeTwo(vector<vector<int>>& intervals) {
    sort(intervals.begin(), intervals.end(), [](auto& x, auto& y){
        return x[1] != y[1] ? x[1] < y[1] : x[0] > y[0];
    });
    int a = -1, b = -1, ans = 0;
    for (auto& iv : intervals) {
        int s = iv[0], e = iv[1];
        if (s > b) { ans += 2; b = e; a = e-1; }
        else if (s > a) { ans += 1; a = b; b = e; }
    }
    return ans;
}
Time: O(n log n) Space: O(1)