• LC.349. Intersection of Two Arrays


    https://leetcode.com/problems/intersection-of-two-arrays/description/
    Given two arrays, write a function to compute their intersection.

    Example:
    Given nums1 = [1, 2, 2, 1], nums2 = [2, 2], return [2].

    Note:
    Each element in the result must be unique.
    The result can be in any order.


    corner case, ways to initialize array
    1: int[] res = new int[x] ;
    2: int[] res = new int[]{1,2,3} ;
    3: declare but initialize later
    int[] res ;
    res = new int[3] ;


     1 /**
     2      * if using binary search:
     3      * time:   nums1 #: n   nums2 #: m
     4      * sorting for num2: mlogm
     5      * b.s for num1: n*log(m)
     6      * total mlogm + n*log(m)  ---> nlogn
     7      *
     8      * space: o(n) for using hashset storing nums1
     9      */
    10     public int[] intersection_bs(int[] nums1, int[] nums2) {
    11         if (nums1 == null || nums1.length == 0 || nums2 == null || nums2.length == 0) {
    12             return new int[]{};
    13         }
    14         Set<Integer> set = new HashSet<>();
    15         Arrays.sort(nums2);
    16         for (Integer num : nums1) {
    17             if (binarySearch(nums2, num)) {
    18                 set.add(num);
    19             }
    20         }
    21         //convert from set to to array
    22         int i = 0;
    23         int[] resArray = new int[set.size()];
    24         for (Integer num : set) {
    25             resArray[i++] = num;
    26         }
    27         return resArray;
    28     }
    29 
    30     private boolean binarySearch(int[] nums2, Integer num) {
    31         int left = 0, right = nums2.length - 1;
    32         while (left + 1 < right) {
    33             int mid = left + (right - left) / 2;
    34             if (nums2[mid] == num) {
    35                 return true;
    36             } else if (nums2[mid] < num) {
    37                 left = mid;
    38             } else {
    39                 right = mid;
    40             }
    41         }
    42         // post processing for the left and right
    43         return nums2[left] == num || nums2[right] == num;
    44     }
    45 
    46     //use two pointers time: o(n) space: o(n)
    47     public int[] intersection_twoPointer(int[] nums1, int[] nums2) {
    48         if (nums1 == null || nums1.length == 0 || nums2 == null || nums2.length == 0) {
    49             return new int[]{};
    50         }
    51         Set<Integer> set = new HashSet<>();
    52         Arrays.sort(nums1);
    53         Arrays.sort(nums2);
    54         int i = 0;
    55         int j = 0;
    56         //here time complexity is: n + m: 取交集,当然要两个都不为空
    57         while (i < nums1.length && j < nums2.length) {
    58             if (nums1[i] < nums2[j]) {
    59                 i++;
    60             } else if (nums1[i] > nums2[j]) {
    61                 j++;
    62             } else {
    63                 set.add(nums1[i]);
    64                 i++;
    65                 j++;
    66             }
    67         }
    68         //convert from set to to array
    69         int i = 0;
    70         int[] resArray = new int[set.size()];
    71         for (Integer num : set) {
    72             resArray[i++] = num;
    73         }
    74         return resArray;
    75     }
    76 
    77     //method 3: time o(n) space: o(n)
    78     public int[] intersection_twoSets(int[] nums1, int[] nums2) {
    79         if (nums1 == null || nums1.length == 0 || nums2 == null || nums2.length == 0) {
    80             return new int[]{};
    81         }
    82         Set<Integer> set = new HashSet<>();
    83         for (Integer num : nums1) {
    84             //when you add nums to set, dont need to consider dup. will overwrite
    85             set.add(num);
    86         }
    87         Set<Integer> ret = new HashSet<>();
    88         for (Integer num : nums2) {
    89             if (set.contains(num)) {
    90                 ret.add(num);
    91             }
    92         }
    93         int[] resArr = new int[ret.size()];
    94         int i = 0;
    95         for (Integer num : ret) {
    96             resArr[i++] = num;
    97         }
    98         return resArr;
    99     }

     

  • 相关阅读:
    sql取每个分组的第一行数据
    PHP microtime() 函数
    笔记产品会不会被淘汰
    making an os NO.1 怎样进内核之二
    hjkhjkh
    HTTP协议理解
    hjkhjkh
    making an os NO.1 怎样进内核之一
    hjkhjkh
    笔记产品会不会被淘汰
  • 原文地址:https://www.cnblogs.com/davidnyc/p/8471308.html
Copyright © 2020-2023  润新知