[每日一題] 第十九題:陣列中重複的數字

DRose發表於2020-07-31

找出陣列中重複的數字。

在一個長度為 n 的陣列 nums 裡的所有數字都在 0~n-1 的範圍內。陣列中某些數字是重複的,但不知道有幾個數字重複了,也不知道每個數字重複了幾次。請找出陣列中任意一個重複的數字。

示例 1:

輸入:

[2, 3, 1, 0, 2, 5, 3]
輸出:23 

限制:

  • 2 <= n <= 100000

方法一:我的做法

還可以最佳化,但是這畢竟是我提交的,所以直接複製貼上。哈哈。

程式碼

class Solution {
    public int findRepeatNumber(int[] nums) {
        int length = nums.length;
        int[] index = new int[length];
        for (int i=0; i<length; i++) {
            index[i] = 0;
        }
        for (int i=0; i<length; i++) {
            index[nums[i]]++;
        }
        for(int i=0; i<length; i++) {
            if (index[i] > 1) {
                return i;
            }
        }
        return 0;
    }
}

複雜度

時間複雜度:O(3N)
空間複雜度:O(N)

方法二:使用集合遍歷陣列

由於只需要找出陣列中任意一個重複的數字,因此遍歷陣列,遇到重複的數字即返回。為了判斷一個數字是否重複遇到,使用集合儲存已經遇到的數字,如果遇到的一個數字已經在集合中,則當前的數字是重複數字。

初始化集合為空集合,重複的數字 repeat = -1
遍歷陣列中的每個元素:
將該元素加入集合中,判斷是否新增成功
如果新增失敗,說明該元素已經在集合中,因此該元素是重複元素,將該元素的值賦給 repeat,並結束遍歷
返回 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)。
遍歷陣列一遍。使用雜湊集合(HashSet),新增元素的時間複雜度為 O(1),故總的時間複雜度是 O(n)。
空間複雜度:O(n)。不重複的每個元素都可能存入集合,因此佔用 O(n) 額外空間。

個人理解

  1. 集合特性: 集合類中的 Set.add() 方法用來向 Set 集合新增物件。如果 Set 集合中已經包含相同的物件,則不改變 Set 集合。該方法返回值為 boolean 物件,如果 Set 集合中不包含要新增的物件,則新增物件並返回 true,否則返回 false

來源

作者:LeetCode-Solution
連結:leetcode-cn.com/problems/shu-zu-zh...
來源:力扣(LeetCode)

來源:力扣(LeetCode)
連結:leetcode-cn.com/problems/shu-zu-zh...
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章