題目連結:
題目意譯:
你被給定兩個長度皆為 n 且索引值從 0 開始數的整數排列 A 和 B。
A 和 B 個一個前綴共同陣列為另一陣列 C,使得 C[i] 等於同時出現於 A 和 B 中且索引值小於或等於 i 的數字之個數。
回傳 A 和 B 的前綴共同陣列。
一個由 n 個整數組成的序列如果包含著 1 到 n 中所有數字恰好一次,則稱為一個「排列」。
限制:
1 ≦ A.length == B.length == n ≦ 50
1 ≦ A[i], B[i] ≦ n
保證 A 和 B 各自是 n 個整數的一個排列。
範例測資:
範例 1:
輸入: A = [1,3,2,4], B = [3,1,2,4]
輸出: [0,2,3,4]
解釋: 在 i = 0:沒有數字同時出現,所以 C[0] = 0。
在 i = 1:1 和 3 同時出現於 A 和 B 中,所以 C[1] = 2。
在 i = 2:1 、 2 和 3 同時出現於 A 和 B 中,所以 C[2] = 3。
在 i = 3:1 、 2 、 3 和 4 同時出現於 A 和 B 中,所以 C[3] = 4。
範例 2:
輸入: A = [2,3,1], B = [3,1,2]
輸出: [0,1,3]
解釋: 在 i = 0:沒有數字同時出現,所以 C[0] = 0。
在 i = 1:只有 3 同時出現於 A 和 B 中,所以 C[1] = 1。
在 i = 2:1 、 2 和 3 同時出現於 A 和 B 中,所以 C[2] = 3。
解題思維:
可以看到 C[i] 之值其實就是 C[i - 1](如果 i == 0,則將 C[-1] 視為 0)並根據 A[i] 、 B[i] 與先前出現的數字有無配對來給予額外增加量。
再加上 A 和 B 中的數字最大只有到 50,因此直接開一個大小 51 的陣列 T 來儲存每一種數字在 A[0] ~ A[i] 以及 B[0] ~ B[i] 的出現次數即可。
倘若 A[i] == B[i],則當然 C[i] = C[i - 1] + 1;而如果 T[A[i]] == 2 或是 T[B[i]] == 2,則 C[i] 需要額外增加相應配對數。
最後掃完之後便可以得到所求陣列 C。
此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。