[英]Minimizing time complexity when looping over two arrays
對於計算機科學入門課程,我們必須編寫一個函數來查找兩個數組的交集,每個唯一元素只顯示一次,並且不會分配比我們需要的更多空間。
例如:
數組 A = {1, 2, 3, 3, 3, 5}
數組 B = {2, 2, 2, 3, 5, 6}
A 和 B 的交集 = {2, 3, 5}
如何在不循環兩個數組的情況下完成此操作? 就目前而言,我有:
//find how large of an array I'll need
for array A
for array A
if A[i] is already somewhere earlier in array A
stop
else
loop through array B
if A[i] is in array B, increment a counter
declare a new array of size counter
//add unique elements to the array
for array A
for array A
if A[i] is already somewhere earlier in array A
stop
else
loop through array B
if A[i] is in array B, add it to the new array
我有兩個幾乎相同的嵌套 for 循環,這似乎效率很低。 如果我使用 python,我可以將唯一元素附加到列表中,但是有沒有辦法在 C 中做類似的事情? 我可以只聲明一個我可能需要的最大大小的數組,但我試圖最小化空間復雜度。
如果您知道集合,則可以使用它。 時間復雜度為O(n)
您可以在此處了解有關 set 以及如何在C
實現一個的更多信息。
然后你可以做這樣的事情(用Java編寫):
public int[] intersection(int[] nums1, int[] nums2) {
Set<Integer> set1 = getSet(nums1);
Set<Integer> set2 = getSet(nums2);
Set<Integer> ans = new HashSet<>();
for(Integer i: set1) {
if(set2.contains(i)) {
ans.add(i);
}
}
int[] ret = new int[ans.size()];
int count = 0;
for(Integer i: ans) {
ret[count] = i;
count++;
}
return ret;
}
public Set<Integer> getSet(int[] arr) {
Set<Integer> set = new HashSet<>();
for(int a: arr) { set.add(a); }
return set;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.