【Leetcode】350. Intersection of Two Arrays II

方法一:

思路:

用flag标记是否nums2中的该元素已经是相交的元素,若不是才加入结果list,并置flag为1然后跳出内层循环继续判断nums1的下一个元素。

public class Solution {
    public int[] intersect(int[] nums1, int[] nums2) {
        int len1 =  nums1.length;  
        int len2 =  nums2.length;  
        int len = Math.min(len1, len2);
        int[] flag = new int[len2]; 
        List<Integer> list = new ArrayList<Integer>();
        for (int i = 0; i < len1; i++) {  
            for (int j = 0; j < len2; j++) {  
                if (nums1[i] == nums2[j] && flag[j] == 0)  {
                    list.add(nums2[j]);
                    flag[j] = 1;
                    break;
                } 
            }  
        }  
        int size = list.size();
        int[] result = new int[size]; 
        for (int i = 0; i < size; i++) 
            result[i] = list.get(i);
        return result;
	}
}

Runtime:12ms


方法二:

思路:

将给定的数组排序;

i索引nums1,j索引nums2,直到某一数组遍历完毕;

若当前元素值nums1大于nums2,则j后移;若nums1小于nums2,则i后移;否则i、j都后移。

public class Solution {
    public int[] intersect(int[] nums1, int[] nums2) {
        int len1 =  nums1.length;  
        int len2 =  nums2.length;  
		int[] result = new int[Math.min(len1, len2)];
		int len = 0, i = 0, j = 0;
		Arrays.sort(nums1);
		Arrays.sort(nums2);
		while (i < len1 && j < len2) {
			if (nums1[i] == nums2[j]) {
				result[len] =nums1[i];
				len++;
				i++;
				j++;
			}
			else if (nums1[i] < nums2[j])
				i++;
			else
				j++;
		}
		result = Arrays.copyOf(result, len);
		return result;  
    }
}

Runtime:4ms


方法三:

思路:

对nums1进行Map,查找nums2元素是否在Map中。

public class Solution {
    public int[] intersect(int[] nums1, int[] nums2) {
        int len1 =  nums1.length;    
        int len2 =  nums2.length;   
		int[] result = new int[Math.min(len1, len2)]; 
		int j = 0;
		Map<Integer, Integer>map = new HashMap<Integer, Integer>();
		for (int i = 0; i < len1; i++) {
			if (map.containsKey(nums1[i]))
				map.put(nums1[i], map.get(nums1[i]) + 1);
			else
				map.put(nums1[i], 1);
		}
		for (int i = 0; i < len2; i++) {
			if (map.containsKey(nums2[i]) && map.get(nums2[i]) > 0) {
				result[j] = nums2[i];
				j++;
				map.put(nums2[i], map.get(nums2[i]) - 1);
			}	
		}
		result = Arrays.copyOf(result, j);
		return result;
    }
}

Runtime:7ms

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值