两个数组的交集

给定两个数组,编写一个函数来计算它们的交集。
对于一个数字,其在交集中出现的次数等于该数字在两个数组中出现次数的最小值。
肯定是参照少的那一组,因为我们找的是交集。

import java.util.ArrayList;

public class Test {

    public static void main(String[] args) {
        int[] nums1=new int[]{1,1,2,2};
        int[] nums2=new int[]{1,2,3,3,4,4};
        intersect1(nums1,nums2);
    }

    static int[] intersect1(int[] nums1, int[] nums2) {
        long start = System.currentTimeMillis();
        int len1=nums1.length;
        int len2=nums2.length;
        boolean[] bl=new boolean[len2];
        ArrayList<Integer> al=new ArrayList<Integer>();
        for(int i=0;i<len1;i++) {
            for(int j=0;j<len2;j++) {
                if(nums1[i]==nums2[j] && bl[j]==false) {
                    al.add(nums1[i]);
                    bl[j]=true;
                    break;
                }
            }
        }
        int[] in = new int[al.size()];
        int e=0;
        for(int i:al)
            in[e++] = i;

        long end = System.currentTimeMillis();
        System.out.println(end-start);
        return in;

    }
}

如果两个数组是有序的,则可以便捷地计算两个数组的交集。

首先对两个数组进行排序,然后使用两个指针遍历两个数组。

初始时,两个指针分别指向两个数组的头部。每次比较两个指针指向的两个数组中的数字,如果两个数字不相等,则将指向较小数字的指针右移一位,如果两个数字相等,将该数字添加到答案,并将两个指针都右移一位。当至少有一个指针超出数组范围时,遍历结束。

class Solution {
    public int[] intersect(int[] nums1, int[] nums2) {
        Arrays.sort(nums1);
        Arrays.sort(nums2);
        int length1 = nums1.length, length2 = nums2.length;
        int[] intersection = new int[Math.min(length1, length2)];
        int index1 = 0, index2 = 0, index = 0;
        while (index1 < length1 && index2 < length2) {
            if (nums1[index1] < nums2[index2]) {
                index1++;
            } else if (nums1[index1] > nums2[index2]) {
                index2++;
            } else {
                intersection[index] = nums1[index1];
                index1++;
                index2++;
                index++;
            }
        }
        return Arrays.copyOfRange(intersection, 0, index);
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值