題意:
你有 k 個 非遞減排列 的整數列表。找到乙個 最小 區間,使得 k 個列表中的每個列表至少有乙個數包含在其中。
我們定義如果 b-a < d-c 或者在 b-a == d-c 時 a < c,則區間 [a,b] 比 [c,d] 小。
示例 1:
輸入:nums =[[
4,10,
15,24,
26],[
0,9,
12,20]
,[5,
18,22,
30]]輸出:[20,
24]解釋:
列表 1:[4,
10,15,
24,26],24 在區間 [20,
24] 中。
列表 2:[0,
9,12,
20],20 在區間 [20,
24] 中。
列表 3:[5,
18,22,
30],22 在區間 [20,
24] 中。
資料範圍:
nums.length == k
1<= k <=
3500
1<= nums[i]
.length <=50-
1e5<= nums[i]
[j]<=
1e5nums[i] 按非遞減順序排列
解法:將a[i]
[j]變成二元組(a[i]
[j],i)
.那麼問題變為:
找到乙個長度最小的區間[l,r]
,滿足這個區間內每個序列都至少有乙個二元組在裡面.
將所有二元組放在一起排序,
然後列舉r,找到乙個最大的l,滿足[l,r]符合上面條件.
發現l可以雙指標維護,那麼這題就做完了.
同時,l和r的取值是離散的,因為肯定是陣列**現過的數,
所以只需要列舉出現過的數即可.
code:class
solution);
}}sort
(temp.
begin()
,temp.
end())
; map<
int,
int>mp;
int sum=0;
int l=0;
for(
int i=
0;isize()
;i++);
}if(--mp[temp[l++
].second]==0
)sum--;}
}return ans;}}
;
leetcode632 最小區間 堆
你有 k 個公升序排列的整數陣列。找到乙個最小區間,使得 k 個列表中的每個列表至少有乙個數包含在其中。我們定義如果 b a d c 或者在 b a d c 時 a c,則區間 a,b 比 c,d 小。示例 1 輸入 4,10,15,24,26 0,9,12,20 5,18,22,30 輸出 20 ...
leetcode632 最小區間(堆 多指標)
你有 k 個公升序排列的整數陣列。找到乙個最小區間,使得 k 個列表中的每個列表至少有乙個數包含在其中。我們定義如果 b a d c 或者在 b a d c 時 a c,則區間 a,b 比 c,d 小。示例 1 輸入 4,10,15,24,26 0,9,12,20 5,18,22,30 輸出 20,...
演算法題 二 之 最小區間
你有 k 個公升序排列的整數列表。找到乙個最小區間,使得 k 個列表中的每個列表至少有乙個數包含在其中。我們定義如果 b a d c 或者在 b a d c 時 a c,則區間 a,b 比 c,d 小。例如 輸入 4,10,15,24,26 0,9,12,20 5,18,22,30 輸出 20,24...