题目描述:
一个长度为 n的整数数组 nums,其中 nums的所有整数都在范围[1,n]内,且每个整数出现 一次 或 两次 。请你找出所有出现两次的整数,请实现一个时间复杂度为 O(n)且仅使用 O(1)额外空间的算法。
解题思路:
利用数组值和索引的范围关系,每遇到一个数,就把这个数的绝对值减一当成索引,把这个索引的值取反(加个负号)。因为我们只是改变符号,所以不改变数的绝对值。当遇到索引的值为负数时,证明这个索引是第二次被查询(因为一开始所有的数都是正数),此时(索引+1)是第二次出现,就可以收获结果。
#include<iostream>
#include<vector>
using namespace std;
int main(){
int n;
cin>>n;
vector<int> nums(n);
for(int i=0;i<n;i++){
cin>>nums[i];
}
int index;
vector<int> result;
for(int num:nums){
index = abs(num)-1;
if(nums[index]<0){
result.push_back(abs(num));
}else{
nums[index] = -nums[index];
}
}
for(int num:result){
cout<<num<<' ';
}
return 0;
}