leetcode 349. Intersection of Two Arrays

来源:互联网 发布:人工智能与信贷的结合 编辑:程序博客网 时间:2024/05/21 05:24

Given two arrays, write a function to compute their intersection.

Example:
Given nums1 = [1, 2, 2, 1]nums2 = [2, 2], return [2].

Note:

  • Each element in the result must be unique.
  • The result can be in any order.
问题是要求两个数组的交集。

我的想法就是map,为什么需要两个map呢?第一个map很好理解,存入nums中出现的数字,而map2则用来记录结果数组中出现的数字,确保结果数组中的数字是独一无二的。

package leetcode;import java.util.ArrayList;import java.util.Arrays;import java.util.HashMap;public class Intersection_of_Two_Arrays_349 {public int[] intersection(int[] nums1, int[] nums2) {if(nums1.length==0||nums2.length==0){return new int[]{};}int size=0;ArrayList<Integer> result=new ArrayList<Integer>();HashMap<Integer, Integer> map1=new HashMap<Integer, Integer>();HashMap<Integer, Integer> map2=new HashMap<Integer, Integer>();//map2的存在是防止result中的值不唯一for(int i=0;i<nums1.length;i++){if(map1.get(nums1[i])==null){map1.put(nums1[i], 0);//map的value随便取值}}for(int i=0;i<nums2.length;i++){if(map2.get(nums2[i])!=null){continue;}if(map1.get(nums2[i])!=null){size++;result.add(nums2[i]);map2.put(nums2[i], 0);}}int[] theResult=new int[size];for(int i=0;i<size;i++){theResult[i]=result.get(i);}return theResult;}public static void main(String[] args) {// TODO Auto-generated method stubIntersection_of_Two_Arrays_349 i=new Intersection_of_Two_Arrays_349();int[] nums1=new int[]{1,2,2,1};int[] nums2=new int[]{2,2};System.out.println(Arrays.toString(i.intersection(nums1, nums2)));}}

大神思路跟我差不多,不过用的是hashset,时间复杂度也是O(m+n).

        HashSet<Integer> set = new HashSet<Integer>();        ArrayList<Integer> res = new ArrayList<Integer>();        //Add all elements to set from array 1        for(int i =0; i< nums1.length; i++) set.add(nums1[i]);        for(int j = 0; j < nums2.length; j++) {           // If present in array 2 then add to res and remove from set            if(set.contains(nums2[j])) {                res.add(nums2[j]);                set.remove(nums2[j]);            }        }        // Convert ArrayList to array        int[] arr = new int[res.size()];        for (int i= 0; i < res.size(); i++) arr[i] = res.get(i);        return arr;
所以hashset和hashmap的区别到底是什么呢?可以看我下一篇文章http://blog.csdn.net/huanghanqian/article/details/73920394。
还有时间复杂度不如我俩解法的其他解法,放在下面看一看,拓宽一下思路。

Sort both arrays, use two pointers
Time complexity: O(nlogn)

public class Solution {    public int[] intersection(int[] nums1, int[] nums2) {        Set<Integer> set = new HashSet<>();        Arrays.sort(nums1);        Arrays.sort(nums2);        int i = 0;        int j = 0;        while (i < nums1.length && j < nums2.length) {            if (nums1[i] < nums2[j]) {                i++;            } else if (nums1[i] > nums2[j]) {                j++;            } else {                set.add(nums1[i]);                i++;                j++;            }        }        int[] result = new int[set.size()];        int k = 0;        for (Integer num : set) {            result[k++] = num;        }        return result;    }}
Binary search
Time complexity: O(nlogn)
public class Solution {    public int[] intersection(int[] nums1, int[] nums2) {        Set<Integer> set = new HashSet<>();        Arrays.sort(nums2);        for (Integer num : nums1) {            if (binarySearch(nums2, num)) {                set.add(num);            }        }        int i = 0;        int[] result = new int[set.size()];        for (Integer num : set) {            result[i++] = num;        }        return result;    }        public boolean binarySearch(int[] nums, int target) {        int low = 0;        int high = nums.length - 1;        while (low <= high) {            int mid = low + (high - low) / 2;            if (nums[mid] == target) {                return true;            }            if (nums[mid] > target) {                high = mid - 1;            } else {                low = mid + 1;            }        }        return false;    }}

原创粉丝点击