• 547. Intersection of Two Arrays【easy】


    Given two arrays, write a function to compute their intersection.

    Notice
    • Each element in the result must be unique.
    • The result can be in any order.
    Example

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

    Challenge

    Can you implement it in three different algorithms?

    解法一:

     1 class Solution {
     2 public:
     3     /**
     4      * @param nums1 an integer array
     5      * @param nums2 an integer array
     6      * @return an integer array
     7      */
     8     vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
     9         sort(nums1.begin(), nums1.end());
    10         sort(nums2.begin(), nums2.end());
    11 
    12         vector<int> intersect;
    13         vector<int>::iterator it1 = nums1.begin(), it2 = nums2.begin();
    14         while ((it1 != nums1.end()) && (it2 != nums2.end())) {
    15             if (*it1 < *it2) {
    16                 it1++;
    17             } else if (*it1 > *it2) {
    18                 it2++;
    19             } else {
    20                 intersect.push_back(*it1); 
    21                 it1++; it2++;
    22             }
    23         }
    24         
    25         auto last = unique(intersect.begin(), intersect.end());
    26         intersect.erase(last, intersect.end());
    27         return intersect;
    28     }
    29 };

    sort & merge

    类属性算法unique的作用是从输入序列中“删除”所有相邻的重复元素。该算法删除相邻的重复元素,然后重新排列输入范围内的元素,并且返回一个迭代器(容器的长度没变,只是元素顺序改变了),表示无重复的值范围得结束。在STL中unique函数是一个去重函数, unique的功能是去除相邻的重复元素(只保留一个),其实它并不真正把重复的元素删除,是把重复的元素移到后面去了,然后依然保存到了原数组中,然后 返回去重后最后一个元素的地址,因为unique去除的是相邻的重复元素,所以一般用之前都会要排一下序。

    常见的用法如下:

     1 /*
     2  * sort words alphabetically so we can find the duplicates 
     3  */ 
     4 sort(words.begin(), words.end()); 
     5 
     6 /* eliminate duplicate words: 
     7  * unique reorders words so that each word appears once in the 
     8  * front portion of words and returns an iterator one past the unique range; 
     9  * erase uses a vector operation to remove the nonunique elements 
    10  */ 
    11  vector<string>::iterator end_unique =  unique(words.begin(), words.end()); 
    12  
    13  words.erase(end_unique, words.end());

    参考@NineChapter的代码

    解法二:

     1 public class Solution {
     2     /**
     3      * @param nums1 an integer array
     4      * @param nums2 an integer array
     5      * @return an integer array
     6      */
     7     public int[] intersection(int[] nums1, int[] nums2) {
     8         Arrays.sort(nums1);
     9         Arrays.sort(nums2);
    10         
    11         int i = 0, j = 0;
    12         int[] temp = new int[nums1.length];
    13         int index = 0;
    14         while (i < nums1.length && j < nums2.length) {
    15             if (nums1[i] == nums2[j]) {
    16                 if (index == 0 || temp[index - 1] != nums1[i]) {
    17                     temp[index++] = nums1[i];
    18                 }
    19                 i++;
    20                 j++;
    21             } else if (nums1[i] < nums2[j]) {
    22                 i++;
    23             } else {
    24                 j++;
    25             }
    26         }
    27         
    28         int[] result = new int[index];
    29         for (int k = 0; k < index; k++) {
    30             result[k] = temp[k];
    31         }
    32         
    33         return result;
    34     }
    35 }

    sort & merge

    参考@NineChapter的代码

    解法三:

     1 public class Solution {
     2     /**
     3      * @param nums1 an integer array
     4      * @param nums2 an integer array
     5      * @return an integer array
     6      */
     7     public int[] intersection(int[] nums1, int[] nums2) {
     8         if (nums1 == null || nums2 == null) {
     9             return null;
    10         }
    11         
    12         HashSet<Integer> hash = new HashSet<>();
    13         for (int i = 0; i < nums1.length; i++) {
    14             hash.add(nums1[i]);
    15         }
    16         
    17         HashSet<Integer> resultHash = new HashSet<>();
    18         for (int i = 0; i < nums2.length; i++) {
    19             if (hash.contains(nums2[i]) && !resultHash.contains(nums2[i])) {
    20                 resultHash.add(nums2[i]);
    21             }
    22         }
    23         
    24         int size = resultHash.size();
    25         int[] result = new int[size];
    26         int index = 0;
    27         for (Integer num : resultHash) {
    28             result[index++] = num;
    29         }
    30         
    31         return result;
    32     }
    33 }

    hash map

    参考@NineChapter的代码

    解法四:

     1 public class Solution {
     2     /**
     3      * @param nums1 an integer array
     4      * @param nums2 an integer array
     5      * @return an integer array
     6      */
     7     public int[] intersection(int[] nums1, int[] nums2) {
     8         if (nums1 == null || nums2 == null) {
     9             return null;
    10         }
    11         
    12         HashSet<Integer> set = new HashSet<>();
    13         
    14         Arrays.sort(nums1);
    15         for (int i = 0; i < nums2.length; i++) {
    16             if (set.contains(nums2[i])) {
    17                 continue;
    18             }
    19             if (binarySearch(nums1, nums2[i])) {
    20                 set.add(nums2[i]);
    21             }
    22         }
    23         
    24         int[] result = new int[set.size()];
    25         int index = 0;
    26         for (Integer num : set) {
    27             result[index++] = num;
    28         }
    29         
    30         return result;
    31     }
    32     
    33     private boolean binarySearch(int[] nums, int target) {
    34         if (nums == null || nums.length == 0) {
    35             return false;
    36         }
    37         
    38         int start = 0, end = nums.length - 1;
    39         while (start + 1 < end) {
    40             int mid = (end - start) / 2 + start;
    41             if (nums[mid] == target) {
    42                 return true;
    43             }
    44             if (nums[mid] < target) {
    45                 start = mid;
    46             } else {
    47                 end = mid;
    48             }
    49         }
    50         
    51         if (nums[start] == target) {
    52             return true;
    53         }
    54         if (nums[end] == target) {
    55             return true;
    56         }
    57         
    58         return false;
    59     }
    60 }

    sort & binary search

    参考@NineChapter的代码

    解法五:

     1 public class Solution {
     2     public int[] intersection(int[] nums1, int[] nums2) {
     3         // Write your code here
     4         HashSet<Integer> set1 = new HashSet<>();
     5         ArrayList<Integer> result = new ArrayList<>();
     6         for(int n1 : nums1){
     7             set1.add(n1);
     8         }
     9         for(int n2 : nums2){
    10             if(set1.contains(n2)){
    11                 result.add(n2);
    12                 set1.remove(n2);
    13             }
    14         }
    15         int[] ret = new int[result.size()];
    16         for(int i = 0; i < result.size(); i++){
    17             ret[i] = result.get(i);
    18         }
    19         return ret;
    20     }
    21 };

    参考@NineChapter的代码

  • 相关阅读:
    【javascript基础】之【理解JavaScript函数(函数和对象的区别和联系)】
    time
    IE6双倍边距
    【javascript基础】之【delete 运算符】
    【javascript基础】之【解剖JavaScript中的null和undefined】
    buildessential centos
    centOS restart xinetd
    g77 CentOS
    yum search package
    xos_thread
  • 原文地址:https://www.cnblogs.com/abc-begin/p/8150213.html
Copyright © 2020-2023  润新知