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  }