剑指offer-03-数组中重复的数字

题目描述

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

我的解法

排序

先排序,在找
性能不好

数组记录

用数据记录出现的次数
空间换时间

public int findRepeatNumber(int[] nums) {
        byte arr[] = new byte[nums.length];
        for(int n: nums){
            if(arr[n]==1)return n;
            arr[n]=0b1;
        }
        return -1;
}

时间击败90%
时间复杂度:O(N)
空间复杂度:O(N)

其他解法

这个方法很精妙
若没有重复,排序后元素nums[i]出现在的第i个
现在有重复,且没有排序,
遍历,判断num[i]是不是第i个,不是则交换,同时在途中判断是否有重复

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

算法是很巧妙
随着遍历进行,数组越来越有序,直到碰到第一个重复的数
性能很好,击败100%
时间复杂度O(N)
空间复杂度O(1)

其他还有些解法,什么HashMap,感觉都没什么特色,想要时间换空间,使用数组比map更直接。

原文地址:https://www.cnblogs.com/XT-xutao/p/12799513.html