for idx, interval := range intervals { if idx+1 < len(intervals) && intervals[idx][0] == intervals[idx+1][0] && intervals[idx][1] == intervals[idx+1][1] { continue } for i := interval[0]; i <= interval[1]; i++ { end[i] = interval[1] v[i]++ } } // fmt.Println(end) // fmt.Println(v) var ans [][]int
for i := 0; i < SIZE; i++ { // if v[end[i]] == 0{ // continue // } if i != 0 && end[i] == 0 { continue } if v[end[i]] == 1 { tmp := make([]int, 2) tmp[0] = i i = end[i] tmp[1] = i ans = append(ans, tmp) } if v[end[i]] >= 2 { tmp := make([]int, 2) tmp[0] = i for v[end[i]] >= 2 && i != end[i] { i = end[i] } i = end[i] tmp[1] = i // fmt.Println(tmp) ans = append(ans, tmp) } } return ans }
其实有更简单的方法,也是先排序(这里以左端点为例),然后按照下面的思路处理
1 2 3 4 5
if 当前区间的左端点 <= 前一个区间的右端点 { 与 ans 的最后一个区间合并(右端点取最大值) } else { 直接加入 ans }
funcminDistance(word1 string, word2 string)int { m, n := len(word1), len(word2) dp := make([][]int, m+1) for i := range dp { dp[i] = make([]int, n+1) }
for i := 0; i < m+1; i++ { dp[i][0] = i } for j := 0; j < n+1; j++ { dp[0][j] = j } for i := 1; i < m+1; i++ { for j := 1; j < n+1; j++ { if word1[i-1] == word2[j-1] { dp[i][j] = dp[i-1][j-1] } else { dp[i][j] = 1 + Min(dp[i][j-1], dp[i-1][j], dp[i-1][j-1]) } } } return dp[m][n] }
funcMin(args ...int)int { min := args[0] for _, item := range args { if item < min { min = item } } return min }