LeetCode剑指Offer03.数组中重复的数字(简单题)Java题解

找出数组中重复的数字

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

题解一:遍历数组

找到数组中任意一个重复的数字,遍历数组,利用集合存储,遇到重复的数字就返回。
初始化集合为空集合,初始化重复数字repeat
遍历每个元素


class Solution {
    
    
    public int findRepeatNumber(int[] nums) {
    
    
        Set<Integer> set = new HashSet<Integer>();
        int repeat = -1;
        for(int num : nums){
    
    
            if(!set.add(num)){
    
    
                repeat = num;
                break;
            }
        }
        return repeat;
    }
}

时间复杂度:O(n)。
这种方法实际上是暴力破解法的延伸,是用空间去换时间的解法。

题解二:原地置换法

注意题目中的条件:数字在0 - n-1的范围内,且数组长度为n
把数组的索引看成是哈希表的键key,数组的元素看成哈希表的值val
值为val的元素放在键也为val的位置上,也就是哈希表键值对的映射关系为key == val
故将nums[i]放入nums[nums[i]]中,若重复,输出重复数即为所求。

class Solution {
    
    
    public int findRepeatNumber(int[] nums) {
    
    
		for(int i = 0; i < nums.length; i++){
    
    
			while(nums[i]!=i){
    
     // 来回交换,直到nums[i] == i;
				if(nums[nums[i]]==nums[i]){
    
     // 如果nums[nums[i]] = nums[i],那么有两值相等。
					return nums[i];
				}
			int temp = nums[i];
			nums[i] = nums[nums[i]];
			nums[nums[i]] = temp;
			}
		}
		retun 0;
	}
}

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

题解三 排序法

把n个数字按照从大到小排列,找出相邻两个相同的数字即可。
此处略过解法。类似暴力破解。

Guess you like

Origin blog.csdn.net/qq_44005101/article/details/114630587