349. 350. | 區(qū)間合并題型 LeetCode

分析:
? 題目只需要輸出有交集的區(qū)間中的元素,且不重復(fù)。我們可以用哈希表來存儲nums2,然后遍歷nums1判斷是否有元素存在于哈希表中,若是的話就是交集元素。

? 不過,仔細(xì)觀察代碼可以發(fā)現(xiàn),對于nums2中重復(fù)的元素,我們只需要存儲一次即可,也就是說哈希表中的每個元素都是不同的。這時候我們可以直接用set容器來替代map,并且set容器可以直接刪除交集元素,而無需額外的判斷。??



分析:
? 這題與349一樣,用哈希表來解題就可以了。



分析:
? 比較常規(guī)的判斷區(qū)間是否重疊的問題,我們?nèi)匀豢梢韵仍O(shè)置一個新的合并集合,將合并后的,或者不需要合并的區(qū)間放進(jìn)去,然后返回這個集合的大小。
? 核心思路還是:集合排序后,可以合并的區(qū)間一定互相靠近且連續(xù)。并且,題目只要求當(dāng)某一個集合完全包含在另一個集合當(dāng)中時,才需要刪除,部分重疊則不需要刪除。
? 因此,我們可以將其歸納為以下幾個步驟:
對當(dāng)前區(qū)間,若其不與其他區(qū)間重疊,則放入新集合
若當(dāng)前區(qū)間與新區(qū)間重合,則判斷:
當(dāng)前區(qū)間是否包含在新區(qū)間內(nèi) [1, 2] -> [1,4],若是,則用新區(qū)間替換當(dāng)前區(qū)間
當(dāng)前區(qū)間是否包含了新區(qū)間 [2,8] -> [3,6],若是,則不做任何操作,繼續(xù)循環(huán)
否則,將新區(qū)間放入新集合,繼續(xù)循環(huán)

? 進(jìn)一步的,我們發(fā)現(xiàn) [1,2]->[1,4] 和 [2,8]->[3,6] 只是因為前后位置不同,所以導(dǎo)致了我們需外額外判斷這兩種情況。那如果,我們能把大的區(qū)間放到前面去,小的區(qū)間放到后面去,是不是就只需要判斷一次就可以了呢?

? 這種方法就是利用STL的特性,在排序的時候就把上面的那種情況考慮進(jìn)去,使得排序后的集合,大的區(qū)間永遠(yuǎn)在小的區(qū)間前面。這樣的話,我們只需要判斷當(dāng)前區(qū)間是否包含新區(qū)間即可。