Find All Duplicates in an Array

problem description:

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?

我们用形象的语言来描述,现在有n张牌,每张牌的有一个1~n的数字,每个数字出现1次或2次。这n张牌排成一排,我们要找出里面重复的数字。

如果没有重复的数字,从小到大排,每个位置应该放的是和位置一样的数字。我们向着这个目标,重新排列这些牌。

从第一个位置开始,把第一张牌和它本该在的位置交换,直到第一个位置放的牌数值为1,转移到第二个位置;

当当前位置的牌和它本该在的位置的牌一样,且当前位置的牌在前面,说明有重复且该重复没有被输出,输出该重复值,转移到第二个位置;

以此类推~~~

即可输出所有重复的值,不过输出的结果不是按序排列。

该复杂度为O(n),且不需要额外的内存空间。

代码如下:

#include<iostream>
#include<vector>
#include<algorithm>
#include<numeric>
#include <math.h> 
using namespace std;

class Solution {
public:
	vector<int> findDuplicates(vector<int>& nums) ;//输出结果不是按序排列
};

vector<int> Solution::findDuplicates(vector<int> &nums)
{
	int temp,cur;//cur为当前所检查的第i个未知所指的元素
	int i=0;
	vector<int> result;
	vector<int>::iterator it=nums.begin();
	while(i<nums.size())
	{
		cur=*(it+i);
		if(cur!=(i+1))//当前位置所放的值不是本该放的
		{
			temp=*(it+cur-1);//it+cur-1为cur本该在的位置
			if(temp!=cur)//cur本该在的位置放的不是cur
			{
				//交换当前位置与它本该在的位置的值
				*(it+cur-1)=cur;
				*(it+i)=temp;
				if(i>cur-1)
					i++;
			}
			else
			{
				result.push_back(temp);
				i++;
			}


		}
		else
			i++;
		
	}
	return result;
}

int main()
{
	vector<int> nums,result;
	Solution s;
	int w,i,t;
		while(cin>>w&&w!='p')//输入数组中元素,输入p为结束
	{
		nums.push_back(w);
	//	cin>>x;
	}
		result=s.findDuplicates(nums);
		vector<int>::iterator it=result.begin();
		t=result.size();
		if(t==0)
			cout<<"数组中没有重复的数"<<endl;
		else
		{
			for(i=0;i<t;i++)
			cout<<*(it+i)<<',';
			cout<<endl;
		}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值