leetcode217-Intersection of Two Arrays

时间:2024-04-08 12:32:31

这道题目要求俩个数组的交集,且不能重复,我们可以很自然的想到一种办法,就是先遍历第一个数组,将元素存入set,然后再遍历第二个数组,如果元素在set中存在那就说明该元素是肯定存在于第一个数组中的,同时可以把该元素也存入一个set(因为要求输出数组中元素是唯一的),set相对来说数据结构要比数组复杂,所以cpu时间也不会低

还有另外一种方法,这种在数组类算法中一定要考虑到这种方法,就是用数组元素的值作为另外一个数组的下标,这种思路在排序以及这个题目中都是有效的,当然前提一定是下标的范围是有限的,比如这道题目他就限制了数组元素的值不超过1000,我们可以新建一个1001长度的数组,把第一个数组的元素作为新数组的下标,值为1存入,然后遍历第二个数组,值如果是1的可以将值更新为2。然后我们再遍历这个新的数组,值为2的元素对应的下标就是俩个数组的一些交际元素了

import java.util.HashSet;
import java.util.Set;

public class intersectionofTwoArrays {
	public static void main(String[] args) {
		int[] nums1 = {4,9,5};
		int[] nums2 = {9,4,9,8,4};
		int[] res = getOnly(nums1,nums2);
		for(int i = 0;i<res.length;i++) {
			System.out.println(res[i]);
		}
		System.out.println("================");
		int[] arr = getOnly(nums1,nums2);
		for(int i = 0;i<arr.length;i++) {
			System.out.println(arr[i]);
		}
	}
	public static int[] getOnlyOtherVersion(int[] nums1,int[] nums2) {
		int [] arr = new int[1001];
		for(int i = 0;i < nums1.length;i++) {
			arr[nums1[i]] = 1;
		}
		for(int i = 0;i<nums2.length;i++) {
			if(arr[nums2[i]] == 1) {
				arr[nums2[i]] = 2;
			}
		}
		int len = 0;
		for(int i = 0;i<arr.length;i++) {
			if(arr[i] == 2) {
				len++;
			}
		}
		int j = 0;
		int[] res = new int[len];
		for(int i = 0;i<arr.length;i++) {
			if(arr[i] == 2) {
				res[j++] = i;
			}
		}
		return res;
	}
	public static int[] getOnly(int[] nums1,int[] nums2) {
		Set set = new HashSet();
		for(int i = 0;i<nums1.length;i++) {
			set.add(nums1[i]);
		}
		Set<Integer> setOne = new HashSet();
		for(int i = 0;i<nums2.length;i++) {
			if(set.contains(nums2[i])) {
				setOne.add(nums2[i]);
			}
		}
		int j = 0;
		int[] res = new int[setOne.size()];
		for(int i : setOne) {
			res[j++] = i;
		}
		return res;
	}
}