zoukankan      html  css  js  c++  java
  • 442. Find All Duplicates in an Array

    Given an array of integers, 1 ≤ a[i] ≤ n (n = size of array), some elements appear twice and others appear once.

    Find all the elements that appear twice in this array.

    Could you do it without extra space and in O(n) runtime?

     

    Example:

    Input:

    [4,3,2,7,8,2,3,1]

     

    Output:

    [2,3]

    idea: similar methods with 448 Find All Numbers Disappeared in an Array

    Solution 1: If nums[index] is already <0, index+1 is the duplicated number

     1 class Solution {
     2 public:
     3     vector<int> findDuplicates(vector<int>& nums) {
     4         int n=nums.size();
     5         vector<int> res;
     6         for (int i=0;i<n;i++){
     7             int index=abs(nums[i])-1; 
     8             if (nums[index]<0) res.push_back(abs(nums[i])); //diff with 448
     9             else nums[index]=-nums[index];
    10         }
    11         return res;
    12     }
    13 };

    Solution 2: If nums[i]!= i+1, nums[i] is the duplicated number.

     1 class Solution {
     2 public:
     3     vector<int> findDuplicates(vector<int>& nums) {
     4         int n=nums.size();
     5         vector<int> res;
     6         for (int i=0;i<n;i++){
     7             int index=nums[i]-1;
     8             if (nums[index]!=nums[i]) {
     9                 swap (nums[i],nums[index]);
    10                 --i;
    11             }
    12         }
    13         for (int i=0;i<n;i++){
    14             if (nums[i]!=i+1) res.push_back(nums[i]); //diff with 448
    15         }
    16         return res;
    17     }
    18 };

    Solution 3: If nums[i]>2*n, i+1 is the duplicated number.

     1 class Solution {
     2 public:
     3     vector<int> findDuplicates(vector<int>& nums) {
     4         int n=nums.size();
     5         vector<int> res;
     6         for (int i=0;i<n;i++){
     7             nums[(nums[i]-1)%n]+=n;
     8         }
     9         for (int i=0;i<n;i++){
    10             if (nums[i]>2*n) res.push_back(i+1); //diff with 448
    11         }
    12         return res;
    13     }
    14 };
  • 相关阅读:
    PHP核心代码库中的APC缓存说明123
    php5函数库
    javaweb 在netbeans 上的部署问题
    数据结构二叉树的递归与非递归遍历之java,javascript,php实现可编译(1)java
    实验五 Java网络编程及安全
    实验三 敏捷开发和XP实验
    实验二 Java面向对象程序设计
    实验一 Java开发环境的熟悉
    at&t 命令集合
    chkconfig命令
  • 原文地址:https://www.cnblogs.com/anghostcici/p/6664352.html
Copyright © 2011-2022 走看看