我来交作业了,如果数组有序的解法,不知道还能不能优化

来源:4-2 map的使用 Intersection of Two Arrays II

weixin_慕村1119904

2022-03-03

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

    }
}
写回答

1回答

liuyubobobo

2022-03-04

大赞,一点儿毛病都没有!:)


一个小优化是,conn 的大小不需要开成 nums1.length + nums2.length 这么大,

开 Math.min(nums1.length, nums2.length) 这么大就够了。想想为什么?


==========


更进一步,如果问题允许我们修改 nums1 或者 nums2 数组的话,conn 这个数组的空间都不需要,直接复用 nums1 或者 nums2 就好了。可以参考下面的代码。


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

但是这些优化都是常数级别的优化,尤其是复用 nums1 或者 nums2 的空间,在实际工程项目中由于破坏了传来的参数,所以可能是不被允许的。在实际面试中,应该询问面试官是否可以破坏传来的参数。


继续加油!:)

1
1
weixin_慕村1119904
我懂了,这样的话就开辟的数组空间就少了,并且也满足需求,刚开始没注意这一点,非常感谢老师指点
2022-03-04
共1条回复

玩转算法面试-- Leetcode真题分门别类讲解

课程配套大量BAT面试真题,高频算法题解析,强化训练

7408 学习 · 1150 问题

查看课程