劍指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更直接。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章