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

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

题目:

  • 在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。
  • 数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。
  • 请找出数组中任意一个重复的数字。

思路:

  • 例如 nums = [2, 3, 1, 0, 2, 5, 3],我们从第一个数字开始遍历,首先遍历到下标 0,也就是数字 2,它不等于它的下标,因此将它和位置为 2 的数字 1 进行交换,得到 [1, 3, 2, 0, 2, 5, 3]。
  • 此时,我们需要继续对下标为 0 的数字进行处理,因为它还不等于它的下标,因此再将它和位置为 1 的数字 3 进行交换,得到 [3, 1, 2, 0, 2, 5, 3]。
  • 同理,继续处理下标为 0 的数字,将它和位置为 3 的数字 0 进行交换,得到 [0, 1, 2, 3, 2, 5, 3]。
  • 现在,下标为 0 的数字已经等于它的下标,我们继续遍历下一个数字,也就是下标为 1 的数字 1。由于它已经在它应该在的位置上,我们不需要对它进行任何操作。继续遍历下一个数字,也就是下标为 2 的数字 2,我们发现它已经不等于它的下标,因此需要将它和位置为 2 的数字 2 进行交换。此时,我们发现位置为 2 的数字已经等于它的下标,因此继续遍历下一个数字。
  • 以此类推,最终我们会找到一个重复的数字。

代码:

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

    private void swap(int[] nums, int i, int j) {
        int temp = nums[i];
        nums[i] = nums[j];
        nums[j] = temp;
    }
}

你可能感兴趣的:(剑指 Offer 03. 数组中重复的数字)