JAVA剑指offer题目03 数组中重复的数字我的解题思路

题目链接
前阵子在leetCode上做了一道剑指offer的“题目,是这样的
JAVA剑指offer题目03 数组中重复的数字我的解题思路_第1张图片
题目很简单, 非常直观的解法就是:
排序
然后就搞定了,但是这样的时间复杂度是O(nlogn)。
没事,那就出大招,空间换时间:不管三七二十一我就是哈希 ,然后遍历就完事。时间和空间复杂度都是O(n)。但是我觉得,这样好像不够温和儒雅,这空间复杂度完全可以优化呀。下面给大家看看我的解法。

我们可以构建这个一个特殊的哈希表,下标0到n-1依次对应数值0到n-1有没有出现过,如果数字x第一次出现,那么下标x 的位置的元素应该为该位置的相反值,标识这个数字x出现过,当我们下一次再遇到x,判断一下下标x的值是否<0,如果是的话表示之前已经访问过,我们就找到了这个重复的数 因为题意表明一定有重复的数字 所以如果在前面都没有返回的话 说明重复的数字就是0 直接最后返回0就好了

public int findRepeatNumber(int[] nums) {
        for (int i = 0; i < nums.length ; i++) {
           //nums[i]可能为负(为负是因为这个下标对应的元素出现过了),所以应该用绝对值表示
            int index = Math.abs(nums[i]);
            if (nums[index]<0)
                return index;
            nums[index] *= (-1) ;
        }
        return 0;
}

没错 就是这样粗鄙的解法,空间复杂度降为O(1)。 我们抓住了题目的关键信息,长度为n且所有数字都在0~n-1。

你可能感兴趣的:(算法,LeetCode,leetcode,算法,java)