無重疊區間我的想法是開一個數組a,遍歷給出的區間,在數組a里將對應落在的區間index標記。如果有重復區間就只選擇最小的那個區間標記。但是這道題的區間好像很長-5 * 104 <= starti < endi <= 5 * 104沒法用數組a表示總的區間范圍。
核心思路是當多個區間覆蓋同一個點時,保留更短的區間。那么怎么模擬區間覆蓋過程呢?我們只好從已經有的區間入手,按照區間的結尾進行排序,每次選擇結尾最早的給后面留出更大的空間,且選擇和前一個區間不重疊的。
func eraseOverlapIntervals(intervals [][]int) int {if len(intervals) < 2 {return 0}// 排序區間末尾的那個點。區間末尾越小,越多空間留給其他區間使用。貪心時可以選擇盡量多的不重疊區域sort.Slice(intervals, func(i, j int) bool {return intervals[i][1] < intervals[j][1]})// 按順序遍歷區間,有重合區間的刪除res := 0maxlen := intervals[0][0] // 記錄最長距離,用于判斷是否會重合。因為不知道每次最長距離從哪里開始。for _, v := range intervals {if v[0] >= maxlen {maxlen = v[1]} else {fmt.Println(v)res++}} return res
}
用最少數量的箭引爆氣球讀完題目也想開一個數組記錄區間。看了看也不行,借鑒上一道題目,減去重疊區間就是要射箭的次數。
func findMinArrowShots(points [][]int) int {if len(points) < 2 {return len(points)}sort.Slice(points, func(i, j int) bool {return points[i][1] < points[j][1]})res := 0maxlen := points[0][1] for i:=1; i<len(points); i++ {if points[i][0] > maxlen {maxlen = points[i][1]} else {// fmt.Println(points[i])res++}} return len(points)-res
}