LeetCode - 两个数组的交集 II

题目:

给出两个数组,写出一个方法求出它们的交集

例1:

输入: nums1 = [1, 2, 2, 1], nums2 = [2, 2], 
输出: [2].

例2:

输入: nums1 = [1, 2], nums2 = [2], 
输出: [2].

挑战

可以用三种不同的方法实现吗?

注意事项

-结果中的每个元素必须是唯一的。
-结果可以是任意顺序的。

 二分查找方法:

public int[] intersection(int[] nums1, int[] nums2) {

        Arrays.sort(nums1);
        Arrays.sort(nums2);
        HashSet<Integer> result_set = null;
        if (nums1.length > nums2.length) {
            result_set = inter_set(nums2, nums1);
        } else {
            result_set = inter_set(nums1, nums2);
        }

        int[] result = new int[result_set.size()];
        int index = 0;
        for (int key : result_set) {
            result[index++] = key;
        }
    }

    public Boolean bineary_search(int[] nums, int key) {
        int begin = 0;
        int end = nums.length - 1;

        while (begin < end) {
            int middle = (begin + end) / 2;
            Log.e(TAG,"middle      "+middle+"");
            if (nums[middle] == key) {
                return true;
            }
            else if (nums[middle] > key) {
                end = middle - 1;
            }
            else if (nums[middle] < key) {
                begin = middle + 1;
            }
        }
        if (nums[begin] == key) {
            return true;
        }
        if ( end!=-1 && nums[end] == key) {
            return true;
        }
        return false;
    }

    public HashSet<Integer> inter_set(int[] small, int[] big) {
        HashSet<Integer> result = new HashSet<Integer>();
        for (int i = 0; i < small.length; i++) {

            if (i > 0 && small[i] == small[i - 1]) {
                continue;
            }
            if (result.contains(small[i])) {
                continue;
            }
            if (bineary_search(big, small[i])) {
                result.add(small[i]);
            }
        }
        return result;
    }

方法二:

public class Solution {
    /**
     * @param nums1: an integer array
     * @param nums2: an integer array
     * @return: an integer array
     */
    public int[] intersection(int[] nums1, int[] nums2) {
        // write your code here
        int a = 0;
        int [] in_result ;
        
        HashSet<Integer> set = new HashSet<Integer>();
        HashSet<Integer> set_result = new HashSet<Integer>();
        
        if (nums1 == null || nums1.length == 0  || nums2 == null || nums2.length == 0 ) {
            in_result =new int[set_result.size()];
            return in_result;
        } 
        
        for (int i = 0;i < nums1.length;i++) {
            set.add(nums1[i]);
        }
        
        for (int j = 0;j < nums2.length;j++) {
            if (set.contains(nums2[j]) && !set_result.contains(nums2[j])) { 
               set_result.add(nums2[j]); 
            }
        }
        
        in_result =new int[set_result.size()];
    
        for (int newList : set_result) {
           in_result[a++] = newList;
        }
         
       return in_result;
 }
}

第三种方法:

目前想到的是两个for循环。在这里就不写了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值