1. 程式人生 > 其它 >LeetCode-劍指offer-03-陣列中重複的數字

LeetCode-劍指offer-03-陣列中重複的數字

技術標籤:LeetCode劍指offer刷題記錄重複的數字消失的數字

目錄


原題連結

原題連結劍指 Offer 03. 陣列中重複的數字

找出陣列中重複的數字。

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

輸入:

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

限制:2 <= n <= 100000


解題過程

問題轉化:消失的數字 -----> LeetCode-448-找到所有陣列中消失的數字

時間複雜度: O ( n ) O(n) O(n) | 空間複雜度: O ( 1 ) O(1) O(1)

在這裡插入圖片描述

class Solution {
    public int findRepeatNumber(int[] nums) {
        // 消失的數字
        // 1. 元素整體加1,將這個問題完全轉換成“消失的數字”問題
        for(int i = 0; i < nums.length; i++) ++nums[i];
        // 2. 給陣列元素做標記
        for(int i = 0; i < nums.length; i++){
            int
newIndex = Math.abs(nums[i]) - 1; if(nums[newIndex] > 0){ nums[newIndex] *= -1; } } // 3. 遍歷陣列,如果大於0,則返回(注意要將第一步加上的1減去) for(int num : nums){ if(num > 0) return num - 1; } return -1; } }

利用Set的不重複特性 | 時間複雜度: O ( n ) O(n)

O(n) | 空間複雜度: O ( n ) O(n) O(n)

在這裡插入圖片描述

class Solution {
    public int findRepeatNumber(int[] nums) {
        // 利用Set的元素不重複特性
        Set<Integer> set = new HashSet<>();
        for(int num : nums){
            // 如果無法加入該元素,則說明集合中存在重複的元素,直接返回即可
            if(!set.add(num)){
                return num;
            }
        }
        return -1;
    }
}

先排序,後遍歷 | 時間複雜度: O ( n l o g n ) O(nlogn) O(nlogn) | 空間複雜度: O ( l o g n ) O(logn) O(logn)

在這裡插入圖片描述

class Solution {
    public int findRepeatNumber(int[] nums) {
        // 先排序
        Arrays.sort(nums);
        for(int i = 1; i < nums.length; i++){
            // 返回重複值
            if(nums[i] == nums[i - 1]) return nums[i];
        }
        return -1;
    }
}