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

    问题:

    给定一个数组,1 ≤ a[i] ≤ n (n = size of array),其中一些元素出现2次,其他出现1次,

    求 出现两次的这些元素。

    要求:不借助额外空间,时间复杂度为O(n)

    解法:

    抓住该题目给定数组的特性:

    ·所有元素 在1~n之间,可联系到 数值 和 偏移位置 的对应关系。

    ·仅出现2次或1次,可联系到正负数的特性。负负得正,一负为负。

    那么,可得一下解法:

    遍历一次数组,读到一个数值,把其作为index,去标记index对应的值。标记方法为 取反

    每次标记完后,再去判断刚刚标记的数值

    ·正数:那么负负得正,一定被标记过2次

    ·负数:一负的负,一定被标记过1次

    由于最多被标记两次,那么只要是正数,由于刚刚才被标记过一次,那么在此次之前,它必然已被标记过一次,也就是出现了2次。

    追加该数值到结果。

    代码参考:

     1 class Solution {
     2 public:
     3     vector<int> findDuplicates(vector<int>& nums) {
     4         vector<int> res;
     5         for(int i=0; i<nums.size(); i++){
     6             nums[abs(nums[i])-1]=-nums[abs(nums[i])-1];
     7             if(nums[abs(nums[i])-1]>0) res.push_back(abs(nums[i]));
     8         }
     9         return res;
    10     }
    11 };
  • 相关阅读:
    C# SQLiteHelper
    C# 自定义等待窗口
    C# Work PPT to PDF
    SQL 分隔字符串
    SQL 客户端查看
    SQL 自定义四舍五入
    SQL 并联更新
    C# 委托简单例子
    每天一个Linux命令(52)telnet命令
    每天一个Linux命令(51)ss命令
  • 原文地址:https://www.cnblogs.com/habibah-chang/p/12711025.html
Copyright © 2011-2022 走看看