美文网首页
3. 数组中重复的数字

3. 数组中重复的数字

作者: tracy_668 | 来源:发表于2021-10-07 11:10 被阅读0次

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

    自己写的

    import java.util.*;
    
    
    public class Solution {
        /**
         * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
         *
         * 
         * @param numbers int整型一维数组 
         * @return int整型
         */
        public int duplicate (int[] numbers) {
            // write code here
            for (int i = 0; i < numbers.length; i++) {
                if (numbers[i] == i) {
                    continue;
                }
                if (numbers[numbers[i]] == numbers[i]) {
                    return numbers[i];
                }
                int tmp = numbers[numbers[i]];
             
                numbers[numbers[i]] = numbers[i];
                numbers[i] = tmp;            
                i--;
            }
            return -1;
        }
    }
    

    比较快的方式: 但空间O(n)

    [图片上传失败...(image-f3ebe8-1633576326042)]

    解题思路

    要求时间复杂度 O(N),空间复杂度 O(1)。因此不能使用排序的方法,也不能使用额外的标记数组。

    对于这种数组元素在 [0, n-1] 范围内的问题,可以将值为 i 的元素调整到第 i 个位置上进行求解。在调整过程中,如果第 i 位置上已经有一个值为 i 的元素,就可以知道 i 值重复。

    以 (2, 3, 1, 0, 2, 5) 为例,遍历到位置 4 时,该位置上的数为 2,但是第 2 个位置上已经有一个 2 的值了,因此可以知道 2 重复:

    [图片上传失败...(image-4bb643-1633576326042)]

    public int duplicate(int[] nums) {
        for (int i = 0; i < nums.length; 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 t = nums[i];
        nums[i] = nums[j];
        nums[j] = t;
    }
    
    

    相关文章

      网友评论

          本文标题:3. 数组中重复的数字

          本文链接:https://www.haomeiwen.com/subject/dloanltx.html