博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LeetCode解题思路:442. Find All Duplicates in an Array
阅读量:7086 次
发布时间:2019-06-28

本文共 1836 字,大约阅读时间需要 6 分钟。

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]

题意:

给一个n个数的整数数组,数组元素大于1小于n,一部分元素出现一次,另一部分出现两次,找到数组中出现两次的元素。建议不使用另外的空间并且具有O(n)及以下的时间复杂度。

基本思路:

先不考虑最后一个建议要求,最直观的方法就是另外建一个从0到n的type型哈希表,表中所有元素的值为0.遍历数组,将元素的值对应哈希表中对应项自增,最后选取哈希表中值大于1的元素下标填入结果。

这个方法适用于所有求超过几次的问题,无论是两次,三次,五次。缺点就是不符合建议,申请了额外的n*sizeof(type)个字节的空间,时间复杂度仍然是O(n),但是要遍历两次。代码如下:

1 class Solution { 2 public: 3     vector
findDuplicates(vector
& nums) { 4 vector
new1; 5 vector
flag; 6 flag.resize(nums.size()+1); 7 for(auto elem:nums) 8 flag[elem]++; 9 for(size_t i=0; i

所以为了完美符合题目要求,我们要想办法把flag空间和nums空间融合,并且一次遍历就能找到重复元素。

因为nums里面全是正数,所以可以用正负号来作为flag。遍历数组并访问元素的值对应下标的元素,如果被访问值是正数那就改为负数,当第二次访问到的时候,这个数必然为负数就把下标加入结果,一次遍历后直接返回结果。因为数组是从0开始,所以访问的时候要减一,加入结果时要加一。

代码如下:

1 class Solution { 2 public: 3     vector
findDuplicates(vector
& nums) { 4 vector
new1; 5 int len = nums.size(); 6 for(int i =0; i < len; ++i) 7 { 8 int index = abs(nums[i])-1; 9 if(nums[index]<0)10 new1.push_back(index+1);11 nums[index] = -nums[index]; 12 }13 return new1;14 }15 };

 

新的问题:

如果题中有一个数出现了三次,找这个出现了三次的数怎么办?

思路:

按照简单粗暴的第一种思路肯定可以查出来,但是又不想增加那么多,怎么办?

现在我们在查的过程中已经有了一个标志位和结果数组,当这个数对应项访问到时如果已经为负数,就不再把它变为正数,并且使用find在结果矩阵中再找一次这个数是否已经在结果矩阵中,如果已经在那么就是出现了三次的数,如果不在就把这个数加入到候选结果但不能保证时间复杂的是O(n),根据选取的容器不同时间复杂度不同。当然这已经不是这道题的内容了。

 

转载于:https://www.cnblogs.com/hellomotty/p/7295286.html

你可能感兴趣的文章
Cisco模拟器GNS3和虚拟机VMware的整合
查看>>
Hyper-v 基本使用方法
查看>>
intotify+heartbeat+rsync实现samba的双机集群方案
查看>>
Linux 数据重定向
查看>>
android framebuffer
查看>>
年轻群体当道,哈弗F7如何赢得芳心?
查看>>
WebView注入Java对象注意事项
查看>>
libxml/HTMLparser.h file not found 解决方法
查看>>
实现局域网内单个ip断网
查看>>
vs code和node的相关使用 一一 bower 管理文件
查看>>
项目2 数据库表设计
查看>>
nagios 监控
查看>>
本地连接腾讯云linux服务器上的mysql,连接不上问题解决
查看>>
Office 365 系列之五:创建新用户
查看>>
无法在Chrome浏览器中查看SCCM ***S报告
查看>>
Web服务器指纹识别工具httprint
查看>>
报表服务入门(实验9)安装Report Builder
查看>>
python使用pipeline读写redis
查看>>
怎样通过信息化提高工厂工业化效率?
查看>>
Redis设计与实现 第二部分
查看>>