LeetCode 217 重复的数

tips:

1 两次循环 

2 arrays.sort

3 hashSet set 

   类比Arraylist 数组

          set.contains(i)

          set.add

          list.get(idx)


题目

给定两个数组,写一个方法来计算它们的交集。

例如:
给定 nums1 = [1, 2, 2, 1]nums2 = [2, 2], 返回 [2, 2].

注意:

  •    输出结果中每个元素出现的次数,应与元素在两个数组中出现的次数一致。
  •    我们可以不考虑输出结果的顺序。



分析

1 对于这种相同的元素取出来的用 arraylist

  对于相同元素只取出来一次的用 hashset

  思路都可以用 双指针的方式

                    1 先排序

                    2 双指针走,相同的话,都提前,否则根据情况走i 走j



代码

不重复

public int[] intersection(int[] nums1, int[] nums2) {
        HashSet<Integer> set = new HashSet<Integer>();
        Arrays.sort(nums2);
        for(int i : nums1){
            if(binarysearch(nums2, i)){
                set.add(i);
            }
        }
        int[] array = new int[set.size()];
        int k = 0;
        for(Integer i : set){
            array[k++] = i;
        }
        return array;
    }

    public boolean binarysearch(int[] array, int k){
        int i = 0;
        int j = array.length - 1;
        boolean b = false;
        while (i <= j){
            int mid = i + (j - i)/2;
            if(array[mid] > k){
                j = mid - 1;
            }else if(array[mid] < k){
                i = mid + 1;
            }else{
               return  true;
            }
        }
        return b;
    }


重复 双指针法 比较好理解

class Solution {
    public int[] intersect(int[] nums1, int[] nums2) {
         ArrayList<Integer> list = new ArrayList<Integer>();
         Arrays.sort(nums1);
         Arrays.sort(nums2);
         int i = 0, j = 0;
         while (i < nums1.length && j < nums2.length){
             if(nums1[i] > nums2[j]){
                 j++;
             }else if(nums1[i] < nums2[j]){
                 i++;
             }else{
                 list.add(nums1[i]);
                 i++;
                 j++;
             }
         }
         int[] result = new int[list.size()];
         int idx = 0;
         for(Integer k : list){
             result[idx++] = k;
         }
         return result;    
    }
}

用hashmap的解法

    1 hashmap<k, v> map

    2 map.containkey(key)

       map.get(key) 取到val值;类似的arraylist 也有get方法

public int[] intersect(int[] nums1, int[] nums2){
    HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
    for(int i = 0; i < nums1.length; i++){
        if(map.containsKey(nums1[i])) map.put(nums1[i], map.get(nums1) + 1);
        else map.put(nums1[i], 1);
    }
    List<Integer> list = new ArrayList<Integer>();
    for (int i = 0; i < nums2.length; i++) {
        if(map.containsKey(nums2[i])) list.add(nums2[i]); map.put(nums2[i], map.get(nums2[i]) - 1);
    }

     int[] result = new int[list.size()];
     int idx = 0;
     for(Integer k : list){
         result[idx++] = k;
     }
     return result;
}

    


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值