L350 两个数组的交集 ii leetcode

1. 一个错误的思路:用小的那个数组,逐个扫描大的数组,如果存在,就加入新Arraylist。但是,这个算法有个很严重的问题,没有考虑次数
比如:

{3,1,2}
{1,1}

这样输出的是{1,1},但是结果是{1},所以,这个不行:

class Solution {
    public int[] intersect(int[] nums1, int[] nums2) {
        int len1=nums1.length;
        int len2=nums2.length;
        if(len1>len2){
            return comp(nums1,nums2);
        }else{
            return comp(nums2,nums1);
        }
    }
    public int[] comp(int[] arr_big,int[] arr_small){
        ArrayList al=new ArrayList();
        for(int i=0;i=0;i--){
            result[i]=al.get(i);
            
        }
        return result;
    }
}
2.先各自排序(如升序),然后用两个指针,比较两个数组,小的那个,往前走,继续比较,这样的目的是,升序后,后面的数比前面的大,如果其中一个数组前面的数已经都比另一个数组现在指针的数值小了,就应该往后走了。
例如:
{1,1,1,2,3,4,5,6,7,8} index
class Solution {
    public int[] intersect(int[] nums1, int[] nums2) {
        if(nums1.length==0||nums2.length==0){
            int[] nu={};
            return nu;
        }
        Arrays.sort(nums1);
        Arrays.sort(nums2);
        ArrayList ls=new ArrayList();
        int index1=0;
        int index2=0;
        while(true){
            if((index1>=nums1.length)||(index2>=nums2.length)){
                break;
            }
            if(nums1[index1]==nums2[index2]){
                ls.add(nums1[index1]);
                index1++;
                index2++;
            }else if(nums1[index1]

{3,4,5,6,7}  index B
那么,如果index A所指的数比indexB的小,(比如,A-》3,B-》4),那就只有可能和B所相同的数在A往后走了

3.思路,考虑次数,就先把其中一个数组存入表,值是键,次数为表的值;
用另一个数组扫描,有的话就加入结果中,并且把次数减一。

另外,因为代码中需要返回null,整数是不能赋值null的,所以需要Integer才行,注意哟
另外,有一个注意,就是map取出来的值,有可能是0,有可能是null,所以和数值或者null对比的时候,容易有问题;

class Solution {
    public int[] intersect(int[] nums1, int[] nums2) {
        HashMap map=new HashMap();
        for(int i=0;i al=new ArrayList();
        for(int i=0;i


你可能感兴趣的:(LeetCode刷题,JAVA练练手)