题目链接:https://leetcode.com/problems/find-all-duplicates-in-an-array/description/
数组中重复的数据
给定一个整数数组 a,其中1 ≤ a[i] ≤ n (n为数组长度), 其中有些元素出现2次而其他元素出现一次。
找到所有出现2次的元素。
空间复杂度o(1),时间复杂度o(n)
示例:
输入:
[4,3,2,7,8,2,3,1] 2次
输出:
[2,3]
身为小白来讲,这题真的超赞,第一次get到正负标记法这种思想。首先想到之前一道以为类似的题,统计一串字符串各个字母出现的次数,此题运用数组下标法,令开辟一个数组,循环到哪个字母就令其本身--a的ASCII码 对应的下标++;但后来细读了一遍题目,发现和刚才那题完全不同,第一元素最多出现两次,只统计两次的;第二1 ≤ a[i] ≤ n,a[i]范围已经很有意思的限制在了1---n内,这是此题思想关键。倘若没有告诉,在复杂度就不好控制了。
正负标记法
for:
if num:
if(a[num-1]>0)
a[num-1]=-a[num-1]; //让num做下标-1的数组取反,代表出现一次,继续循环,先判断该下标数子如果已经是负了,证明已经出现过一次了,加上这次,else :两次,输出
else 2次了;
void TwoNum()
{
int i;
printf("[");
for(i=0;i<N;i++)
{
if(a[a[i]-1]>0)
a[a[i]-1]=-a[a[i]-1];
else
printf("%d.",a[i]);
}
printf("]");
}