给定一个整数数组 a,其中1 ≤ a[i] ≤ n (n为数组长度), 其中有些元素出现两次而其他元素出现一次。
找到所有出现两次的元素。
你可以不用到任何额外空间并在O(n)时间复杂度内解决这个问题吗?
解析:难度在于不用到任何额外空间并在O(n)时间复杂度内解决这个问题。因此需要在原数组上做文章。首先我考虑排序算法,但没有排序算法能够在O(n)时间复杂度内解决这个问题。再进行审题,题目中指定数组内元素1 ≤ a[i] ≤ n ,也就是任意一个元素-1都可以是数组的一个索引,如果我们把每个元素都看作一个索引的话,那么重复元素必定指向同一个位置,因此我们只需要循环这个数组,把索引经过的值做一个标记,就可以找出有标记的位置,从而找到该索引,从而找到重复值。这个标记不能占用空间,因此我们需要修改原数值,可以将这个数值标记为原始值*-1,这样不影响该值继续作为索引。
重点在于数组内元素可以作为数组索引这一特点。