剑指 Offer 03. 数组中重复的数字

思路1:原地置换

  因为数组长度为n,所有数字都在0~n-1的范围内,所以假如数组中数字不重复,则数组元素的下标等于数组元素的值。

  在此基础上,遍历数组,将元素放到值所对应的索引处。如果该索引处已存在该元素,则该元素重复,返回结果。

代码:

时间复杂度O(n),空间复杂度O(1)

class Solution {
    public int findRepeatNumber(int[] nums) {
        for (int i = 0;i<nums.length;i++)
        {
            while(nums[i]!=i)
            {
                if (nums[i] == nums[nums[i]])
                    return nums[i];
                int tmp = nums[i];
                nums[i] = nums[tmp];
                nums[tmp] = tmp;
            }
        }
        return -1;
    }
}

 

 思路2:哈希表

  用一个哈希表记录已遍历的元素,每次遍历时检查这个元素是否出现过。

  与思路1对比,优点:不要求数字都在 0~n-1 的范围内;

          缺点:空间复杂度提高到O(n)

代码:

class Solution {
    public int findRepeatNumber(int[] nums) {
        int[] cnt = new int[nums.length];
        for (int num : nums) {
            cnt[num]++;
            if (cnt[num]>1)
                return num;
        }
        return -1;
    }
}
posted @ 2020-03-18 13:48  zjcfrancis  阅读(138)  评论(0编辑  收藏  举报