zoukankan      html  css  js  c++  java
  • 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的代码

  • 相关阅读:
    BZOJ 3506 机械排序臂 splay
    BZOJ 2843 LCT
    BZOJ 3669 魔法森林
    BZOJ 2049 LCT
    BZOJ 3223 文艺平衡树 splay
    BZOJ 1433 假期的宿舍 二分图匹配
    BZOJ 1051 受欢迎的牛 强连通块
    BZOJ 1503 郁闷的出纳员 treap
    BZOJ 1096 ZJOI2007 仓库设计 斜率优化dp
    BZOJ 1396: 识别子串( 后缀数组 + 线段树 )
  • 原文地址:https://www.cnblogs.com/abc-begin/p/8150213.html
Copyright © 2011-2022 走看看