1. 程式人生 > >第十一個算法-兩個數組的交集

第十一個算法-兩個數組的交集

tag 又是 循環 int ++ 浪費時間 返回 次數 節點

給定兩個數組,寫一個方法來計算它們的交集。

例如:
給定 nums1 = [1, 2, 2, 1], nums2 = [2, 2], 返回 [2, 2].

註意:

    • 輸出結果中每個元素出現的次數,應與元素在兩個數組中出現的次數一致。
    • 我們可以不考慮輸出結果的順序。

思路:

  1,先排序

  2,定義第二個數組的循環節點,為了匹配重復數據

  3,雙循環排序

代碼:

public int[] intersect(int[] nums1, int[] nums2) {

Arrays.sort(nums1);
Arrays.sort(nums2);
int stag = 0;
int stag1 = 0;

for (int i = 0; i <nums1.length ; i++) {

for (int j = stag; j <nums2.length ; j++) {
if(nums1[i] == nums2[j]){
stag = j+1;
nums1[stag1] = nums1[i];
stag1++;
break;
}

}
}
int[] nums3 = new int[stag1];

System.arraycopy(nums1,0,nums3,0,stag1);
return nums3;
}

別人好的算法:
public int[] intersect(int[] nums1, int[] nums2) {

Arrays.sort(nums1);
Arrays.sort(nums2);
int[] s = nums1.length<nums2.length?nums1:nums2;
int[] l = nums1.length<nums2.length?nums2:nums1;
int[] a = new int[s.length];
int k = 0;
int i = 0;
int j = 0;
while (i<s.length&&j<l.length)
{
if(s[i]<l[j])
{
i++;
}else if(s[i]>l[j])
{
j++;
}else
{
a[k] = s[i];
i++;
j++;
k++;
}
}
int[] r = new int[k];
System.arraycopy(a, 0, r, 0, k);
return r;
}


又是很長的時間,真是頭疼。感覺太浪費時間了。

第十一個算法-兩個數組的交集