github.com/qiuhoude/go-web@v0.0.0-20220223060959-ab545e78f20d/algorithm/leetcode/non-overlapping-intervals_test.go (about) 1 package leetcode 2 3 import ( 4 "sort" 5 "testing" 6 ) 7 8 //435. 无重叠区间 https://leetcode-cn.com/problems/non-overlapping-intervals/ 9 10 func eraseOverlapIntervals(intervals [][]int) int { 11 n := len(intervals) 12 if n == 0 { 13 return 0 14 } 15 // 求最多有多少个子区域不重叠 ,然后 len(intervals) - 最多个数 16 sort.Slice(intervals, func(i, j int) bool { // 结束位置升序 17 return intervals[i][1] < intervals[j][1] 18 }) 19 ans := 1 20 dp := make([]int, n) // 状态表存储的是 ,到该下标 最大不重复的个数 21 dp[0] = 1 // 最少也有一个 22 for i := 1; i < n; i++ { 23 maxCnt := 0 24 for j := i - 1; j >= 0; j-- { // 当前位置 与前的区域进行对比看是否有有重叠 25 if !isOverlapping(intervals[j], intervals[i]) { 26 maxCnt = dp[j] 27 break 28 } 29 } 30 dp[i] = max(maxCnt+1, dp[i-1]) 31 ans = max(ans, dp[i]) 32 } 33 /*lastEnd := intervals[0][1] 34 for i := range intervals { 35 if intervals[i][0] < lastEnd { //覆盖了 36 continue 37 } 38 lastEnd = intervals[i][0] 39 ans ++ 40 }*/ 41 42 return n - ans 43 } 44 45 func max(a, b int) int { 46 if a > b { 47 return a 48 } 49 return b 50 } 51 52 // 判断两个区间是否有重复 53 func isOverlapping(rg1, rg2 []int) bool { 54 55 return (rg1[0] < rg2[0] && rg2[0] < rg1[1]) || 56 (rg1[0] < rg2[1] && rg2[1] < rg1[1]) || 57 (rg2[0] < rg1[0] && rg1[0] < rg2[1]) || 58 (rg2[0] < rg1[1] && rg1[1] < rg2[1]) || 59 rg1[0] == rg2[0] && rg1[1] == rg2[1] 60 } 61 62 func TestEraseOverlapIntervals(t *testing.T) { 63 arg := [][]int{{1, 2}, {2, 3}} 64 ret := eraseOverlapIntervals(arg) 65 t.Log(ret) 66 } 67 func TestOverlapping(t *testing.T) { 68 69 tests := []struct { 70 name string 71 arg1 []int 72 arg2 []int 73 want bool 74 }{ 75 {"[1,2],[1,3]", []int{1, 2}, []int{1, 3}, true}, 76 {"[1,2],[3,4]", []int{1, 2}, []int{3, 4}, false}, 77 {"[4,8],[3,4]", []int{4, 8}, []int{3, 4}, false}, 78 {"[4,8],[3,6]", []int{4, 8}, []int{3, 6}, true}, 79 {"[1,2],[1,2]", []int{1, 2}, []int{1, 2}, true}, 80 } 81 for _, tt := range tests { 82 t.Run(tt.name, func(t *testing.T) { 83 if got := isOverlapping(tt.arg1, tt.arg2); got != tt.want { 84 t.Errorf("isOverlapping() = %v, want %v", got, tt.want) 85 } 86 }) 87 } 88 }