442. Find All Duplicates in an Array

好像是新题,刷面经居然刷到新题了。。。
跟做过的一个HARD的有点像,也是把element当做下一个位置坐标,准确地说是element-1,只不过那个HARD的题是看有没有重复,然后array是read only。

这里nums的数有3种情况:
出现1次,出现2次,出现0次。
我们找第二种。
出现2次,比如element 8出现2次,那么我们按照element的值来走到下一个的时候,会有2次走到nums[8]。 标记一下,这样下次来的时候就知道了。。比如把正的换成负的,下次来的时候发现是个负数,就知道我们来过一次。当然,想赢的根据element的值来走的时候,如果是负数,要换成正数。。

public class Solution {
    public List<Integer> findDuplicates(int[] nums) {
        List<Integer> res = new ArrayList<>();
        if (nums.length <= 1) return res;
        
        for (int i = 0; i < nums.length; i++) {
            int next = Math.abs(nums[i]) - 1;
            if (nums[next] < 0) res.add(next+1);
            else nums[next] = -nums[next];
        }
        
        return res;
    }
}
posted @ 2016-10-28 06:04  哇呀呀..生气啦~  阅读(1267)  评论(0编辑  收藏  举报