Sort by start (ascending), then by end (descending for ties). This way, longer intervals come first among those with same start. Track the maximum end seen so far. An interval is covered if its end <= maxEnd. Sort intervals.
Track maxEnd = .
For each interval: if end > maxEnd, it is not covered; update maxEnd. Otherwise, it is covered.
Count non-covered intervals. Time: . Space: . Without the descending end sort, you would miss coverage relationships between same-start intervals.