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

85 阅读1分钟

方法一:HashMap,TC : O(N), SC: O(N)

class Solution {
    public int findRepeatNumber(int[] nums) {
        Set<Integer> set = new HashSet<>();
        int result = 0;
        for (int x : nums) {
            if (!set.contains(x)) {
                set.add(x);
            } else {
                result = x;
                break;
            }
        }
        return result;

    }
}

方法二:原地哈希,TC : O(N), SC: O(1)

  • 充分利用idx和item的范围关系,【0,n】和【0,n-1】
  • 把item归位,如果归位的过程中遇到重复了,直接返回那个重复值。
class Solution {
    public int findRepeatNumber(int[] nums) {
        for (int i = 0; i < nums.length; i++) {
            while (nums[i] != i) {
                if (nums[nums[i]] == nums[i]) {
                    return nums[i];
                }
                //swap(nums, i, nums[i]);
                int tmp = nums[nums[i]];
                nums[nums[i]] = nums[i];
                nums[i] = tmp;
            }
        }
        return 0;

    }
}