# 349 Intersection of Two Arrays
Given two arrays, write a function to compute their intersection.
Example 1:
Input: nums1 = [1,2,2,1], nums2 = [2,2]
Output: [2]
Example 2:
Input: nums1 = [4,9,5], nums2 = [9,4,9,8,4]
Output: [9,4]
Note:
Each element in the result must be unique.
The result can be in any order.
題目是要得到2個陣列的相交,回傳個一個整數陣列。我的解法是
1 先foreach遍尋nums1把nums1的加進hashset s1,因為hashset不重複的特性,nums重複的值就不會存到hashset s1裡。
2 再以nums2遍尋,每個判斷s1.contains(nums2[x])是的話就給hashset s3,因為再進來s3也不會再存重複的相交值。
3 最後建一個int整數的陣列r = new int[ s3.size() ]。
4 最後用foreach遍尋s3,把s3的值存入r裡後回傳r。
Runtime: 2 msMemory Usage: 37.4 MB,勝過98.26%的解法。
程式碼:
class Solution {
public int[] intersection(int[] nums1, int[] nums2) {
Set<Integer> s1 = new HashSet<>();
for(int x: nums1){
s1.add(x);
}
Set<Integer> s3 = new HashSet<>();
for(int s = 0 ; s < nums2.length ; s++){
if(s1.contains(nums2[s]) ){
s3.add(nums2[s]);
}
}
int[] rr = new int [s3.size()];
int index = 0;
for(int a: s3){
rr[index] = a;
index++;
}
return rr;
}
}
討論區裡的解法也類似。但不是用2個hashset,是用一個hashset + queue,有個比較快的作法,是1ms是1 用先將nums1 、 nums2 2個陣列作排序。
2 nums1與nums2逐個比較,nums1[i]比較大就遞增j,nums2[j]比較大就遞增i。
3 不大也不小當然就一樣,就要遞增int k值,這裡要比對是否是"相同的相交值",若nums1 {1,2,2,1} num2 {2,2,3,3,1}, 雖彼此的2有相交且是相交2次,但回傳陣列還是只有一個2。然後把新的相交值指定給nums1[k],有指定的k就會遞增。
4 最後回傳不new 一個int 陣列,而是用Arrays.copyOfRange(nums1 , 0 , k) 回傳即可。
程式碼:
class Solution {
public int[] intersection(int[] nums1, int[] nums2) {
Arrays.sort(nums1);
Arrays.sort(nums2);
int i = 0;
int j = 0;
int k = 0;
while( i< nums1.length && j < nums2.length){
if(nums1[i] < nums2[j]){
i++;
}else{
if(nums1[i] > nums2[j]){
j++;
}else{
if(k>0 ){
if(nums1[i] != nums1[k-1]){
nums1[k] = nums1[i];
k++;
}
}else{
nums1[k] = nums1[i];
k++;
}
i++;
j++;
}
}
}
return Arrays.copyOfRange(nums1, 0, k);
}
}
有個不太好理解的地方:
別人的寫法:
if (k == 0 || k > 0 && nums1[i] != nums1[k - 1]) {
nums1[k] = nums1[i];
k++;
}
我的寫法:
if(k>0 ){
if(nums1[i] != nums1[k-1]){
nums1[k] = nums1[i];
k++;
}
}else{
nums1[k] = nums1[i];
k++;
}
因為k初值是0,用 nums1[k - 1])來判斷不可以會exception,但
(k == 0 || k > 0 && nums1[i] != nums1[k - 1]) 可以,覺的不好理解才改成我的寫法。
Last updated
Was this helpful?