1. 程式人生 > >兩個有序陣列,從中各取一個組成pair,求和最小的前K個pair(楊氏矩陣top k問題)

兩個有序陣列,從中各取一個組成pair,求和最小的前K個pair(楊氏矩陣top k問題)

 不需要把所有的pair放進優先佇列,每次只放當前數的下邊和右邊的數,其他更遠的數,肯定比這兩個數更大,

vector<pair<int, int>> topKPair(vector<int> &A, vector<int> &B, int k) {
	vector<pair<int, int>> ans;
	if (A.empty() || B.empty()) return ans;

	priority_queue<pair<int, pair<int, int>>, vector<pair<int, pair<int, int>>>, greater<pair<int, pair<int, int>>>> pq;
	set<pair<int, int>> marked;
	for (pq.push(make_pair(A[0] + B[0], make_pair(0, 0))), marked.insert(make_pair(0, 0)); k > 0 && !pq.empty(); --k) {
		auto p = pq.top(); pq.pop();
		int i = p.second.first, j = p.second.second;
		ans.push_back(make_pair(A[i], B[j]));

		auto down = make_pair(i + 1, j);
		if (i + 1 < A.size() && marked.find(down) == marked.end()) {
			pq.push(make_pair(A[i + 1] + B[j], down));
			marked.insert(down);
		}
		auto right = make_pair(i, j + 1);
		if (j + 1 < B.size() && marked.find(right) == marked.end()) {
			pq.push(make_pair(A[i] + B[j + 1], right));
			marked.insert(right);
		}
	}
	return ans;
}

醜數問題也可以用堆,即,每得到下一個醜數,把這個數和 {2, 3, 5 } 相乘的結果加進堆,只不過這個堆要支援去重,所以實際用set 做

這一類問題的特點:從小到大輸出序列,每輸出一個值,把和這個值相鄰的序列值放入堆。



相關推薦

有序陣列從中一個組成pair求和Kpair(矩陣top k問題

 不需要把所有的pair放進優先佇列,每次只放當前數的下邊和右邊的數,其他更遠的數,肯定比這兩個數更大, vector<pair<int, int>> topKPair(vector<int> &A, vector<int

陣列操作練習----奇偶後and矩陣查數

調整陣列使奇數全部都位於偶數前面。 題目: 輸入一個整數陣列,實現一個函式,來調整該陣列中數字的順序使得陣列中所有的奇數位於陣列的前半部分,所有偶數位於陣列的後半部分。 思路分析: 這裡涉及到一個數組的各個數值的奇偶性,肯定要逐個判斷。 這裡我們給出的的方法是定

LeetCode 4. Median of Two Sorted Arrays (求有序陣列k大數字分治法)

There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of the two sorted arrays. The overall run time complex

給定有序陣列找出合併之後的陣列中位數

中位數定義:假如一個數組的長度Len為偶數,那麼中位數為第 Len/2 個數;如果Len為奇數,那麼中位數為第Len/2+1個數。 比如 Arr[ 1, 2, 3, 4, 5]中位數為3;Arr[ 2, 3, 4, 5]中位數為3。 給定兩個遞增排序陣列,請設計一種高效演算

有序陣列A[k]和B[k]長度都為k。求k的(a[i]+b[j])

設A={A1,A2,A3,A4,A5,A6,.......} ,B={B1,B2,B3,B4,B5,B6,.......} 因為A和B都是有序的陣列,必須充分的利用這點,可能有同學,看到有同學覺得這個題目比較容易,直接將所有的組合都計算出來,然後取最小的K個,其實出題的人是

合併有序陣列要求時間複雜度為O(n且只要到O(1的輔助空間

i= 0表示有序陣列arr1的首元素,j = 未知,表示有序陣列arr2的首元素 ①首先比較第一個有序陣列arr1和第二個有序陣列arr2第一個元素的大小 如果arr1[i] < arr[j]

Algorithm 04 : 尋找有序陣列中的第N個數要求時間複雜度為O(logm+logn)

Question : Give a divide and conquer algorithm for the following problem : you are given two sorted lists of size m and n

leetcode88 合併有序陣列

給定兩個有序整數陣列 nums1 和 nums2,將 nums2 合併到 nums1 中,使得 num1 成為一個有序陣列。 說明: 初始化 nums1 和 nums2 的元素數量分別為 m 和 n。 你可以假設&nbs

LeetCode 之合併有序陣列

問題描述: 給定兩個有序整數陣列 nums1 和 nums2,將 nums2 合併到 nums1 中,使得 num1 成為一個有序陣列。 說明: 初始化 nums1 和&n

資料結構演算法題/合併有序陣列

給定兩個有序整數陣列 nums1 和 nums2,將 nums2 合併到 nums1 中,使得 num1 成為一個有序陣列。 說明: 初始化 nums1 和 nums2&n

資料結構演算法題/有序陣列的中位數

有三種方法,時間複雜度分別是O(m+n) ,O(k),O(log(m+n)) 注意點: 判斷合併後的陣列的元素個數是奇數還是偶數 如果是奇數取中間值;如果是偶數取中間2個數的平均值。 兩種求中位數的方法: (1)方法1,判斷奇數個還是偶數個 if (lengthall % 2 == 0)

LeetCode 88 和並有序陣列--python

給定兩個有序整數陣列 nums1 和 nums2,將 nums2 合併到 nums1 中,使得 num1 成為一個有序陣列。 說明: 初始化 nums1 和 nums2 的元素數量分別為 m 和 n。 你可以假設&n

leetcode88. 合併有序陣列

def merge(self, nums1, m, nums2, n): """ 關鍵點是nums1原陣列的長度是m+n,肯定要在nums1上操作效率高 如果正向比較的話移動次數很多,逆向的話不需要移動 注意m,n是以1開頭的

LeetCode-合併有序陣列

.title { text-align: center; margin-bottom: .2em } .subtitle { text-align: center; font-size: medium; font-weight: bold; margin-top: 0 } .todo { font-famil

【LeetCode】88. 合併有序陣列

題目連結:https://leetcode-cn.com/problems/merge-sorted-array/description/ 題目描述 給定兩個有序整數陣列 nums1 和 nums2,將 nums2 合併到 nums1 中,使得 num1 成為一個有序陣列。

python 合併有序陣列

給定兩個有序整數陣列 nums1 和 nums2,將 nums2 合併到 nums1 中,使得 num1 成為一個有序陣列。 說明: 初始化 nums1 和 nu

【JS】合併有序陣列 #陣列

給定兩個有序整數陣列 nums1 和 nums2,將 nums2 合併到 nums1 中,使得 num1 成為一個有序陣列。 說明: 初始化 nums1 和 nums2 的元素數量分別為 m 和 n。 你可以假設 nums1 有足夠的空間(空間大小大於或等於 m + n)來儲存 nu

LeetCode之4. 尋找有序陣列的中位數

LeetCode之4. 尋找兩個有序陣列的中位數 給定兩個大小為 m 和 n 的有序陣列 nums1 和 nums2。 請你找出這兩個有序陣列的中位數,並且要求演算法的時間複雜度為 O(log(m + n))。 你可以假設 nums1 和 nums2 不會同時為空。

leetcode演算法題4: 尋找有序陣列的中位數

題目:給定兩個大小為 m 和 n 的有序陣列 nums1 和 nums2。 請你找出這兩個有序陣列的中位數,並且要求演算法的時間複雜度為 O(log(m + n))。 你可以假設 nums1 和 nums2 不會

有序陣列求交集

面試碰到這個題 輸入:l1 = [1,3,4,5,2,4,1,7] l2 = [2,5,2,6,7,9] 輸出:[5,2,7] def comNumber(l1,l2): i=0 j=0 res = [] while i < len(l1) and