• 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 };
  • 相关阅读:
    Git 从入门到入坑
    单件模式(单例模式)
    装饰者模式
    观察者模式
    设计模式入门
    SpringBoot + Mybatis + Redis 整合入门项目
    Spring Boot 前后端交互及参数传递
    Spring Securtiy 认证流程(源码分析)
    Spring Boot 静态页面跳转
    第一条手机验证码
  • 原文地址:https://www.cnblogs.com/anghostcici/p/6664352.html
Copyright © 2020-2023  润新知