給出乙個區間的集合,請合併所有重疊的區間。
示例 1:
輸入: [[1,3],[2,6],[8,10],[15,18]]
輸出: [[1,6],[8,10],[15,18]]
解釋: 區間 [1,3] 和 [2,6] 重疊, 將它們合併為 [1,6].
示例 2:
輸入: [[1,4],[4,5]]
輸出: [[1,5]]
解釋: 區間 [1,4] 和 [4,5] 可被視為重疊區間。
我的思路:
首先對輸入的初始二維陣列進行排序,我的排序方法是插入排序,按子陣列的第二個元素從大到小進行排序,避免了隨後進行二次排序。
然後利用數學上的兩區間有交集進行判斷兩個相鄰的子陣列是否為包含或者有交集,此時利用遞迴的方法比較容易理解。
**的時間複雜度和空間複雜度都很高,需要進行優化,發上來做個筆記,後面再優化。
優化前,排序使用得是插入排序,僅僅排序得時間複雜度為o(n2),效率極低:
//對 intervals 進行排序,按每個子陣列第乙個元素排序
sortinsert(intervals)
//對 intervals 進行二次排序,按每個子陣列第二個元素排序
res = sortmerge(intervals,len(intervals),0,res)
return res
}func exc(i int ,j int , num int)
//插入排序--二維陣列
func sortinsert(num int) }}
}}// 得到重疊區間
func sortmerge(num int , l int ,i int , res int) int else if num[0][0]<=num[1][0] && num[0][1]>=num[1][1]
res = sortmerge(num[1:],l,i+1,res)
} if num[0][1] != 'a'
return res
}優化後:
將插入排序演算法換為快速排序演算法,快排得時間複雜度為o(nlogn),而且如果採用三點比較法選取分割槽點,效率還會進一步提高:
leetcode 計算耗時與網路環境也有關,這是測出來幾次得最快速度。
**如下:
func merge(intervals int) int
res := make(int,0)
//對 intervals 進行排序,按每個子陣列第乙個元素排序
sortquick(intervals)
//對 intervals 進行二次排序,按每個子陣列第二個元素排序
res = sortmerge(intervals,len(intervals),0,res)
return res
}func exc(i int ,j int , num int)
//插入排序--二維陣列
func sortinsert(num int) }}
}} //快速排序
func sortquick(num int)
var flag int
if length+1 == 0
a := num[0][1]
x := (length+1)/2
b := num[x][1]
c := num[length][1]
flag,mid := findmid(a,b,c,x,length)
num[flag],num[length] = num[length],num[flag]
flag = length
// fmt.println(num)
i := 0
for j := 0;j <= length ; j++
} //防止不必要得交換
num[i] , num[flag] = num[flag] , num[i]
//遞迴呼叫
// fmt.println(mid,num)
sortquick(num[:i])
sortquick(num[i+1:])
}//三點取中法選取分割槽點,此方法比固定取某個key點更加優化一些
//傳出兩個值,分別為key 和 對應得 value
//c語言可用陣列傳遞
func findmid(a , b , c , x , l int) (int,int)
if c > max
if a < min
if c < min
// fmt.println(max,min)
if a < max && a > min
if b < max && b > min
if c < max && c > min
return 0,a
}// 得到重疊區間
func sortmerge(num int , l int ,i int , res int) int else if num[0][0]<=num[1][0] && num[0][1]>=num[1][1]
res = sortmerge(num[1:],l,i+1,res)
} if num[0][1] != 'a'
return res
}
看來優化很重要,快排果然優秀! Leetcode 56 合併區間
對所有區間按起點位置進行排序 遍歷到k點後的 l,r 已知的包含k點的最大區間 遍歷到k 1點,若該起點屬於 l,r 那麼可能擴充套件這個區間的終點,r max r,k 1點的end definition for an interval.struct interval interval int s,...
LeetCode 56 合併區間
給出乙個區間的集合,請合併所有重疊的區間。示例 1 輸入 1,3 2,6 8,10 15,18 輸出 1,6 8,10 15,18 解釋 區間 1,3 和 2,6 重疊,將它們合併為 1,6 示例 2 輸入 1,4 4,5 輸出 1,5 解釋 區間 1,4 和 4,5 可被視為重疊區間。解題思路 1...
LeetCode 56 合併區間
給出乙個區間的集合,請合併所有重疊的區間。示例 1 輸入 1,3 2,6 8,10 15,18 輸出 1,6 8,10 15,18 解釋 區間 1,3 和 2,6 重疊,將它們合併為 1,6 示例 2 輸入 1,4 4,5 輸出 1,5 解釋 區間 1,4 和 4,5 可被視為重疊區間。題意還是好理...