Java實現 LeetCode 442 數組中重複的數據

442. 數組中重複的數據

給定一個整數數組 a,其中1 ≤ a[i] ≤ n (n爲數組長度), 其中有些元素出現兩次而其餘元素出現一次。java

找到全部出現兩次的元素。數組

你能夠不用到任何額外空間並在O(n)時間複雜度內解決這個問題嗎?ide

示例:spa

輸入:
[4,3,2,7,8,2,3,1]code

輸出:
[2,3]索引

* 這個題屬於技巧題 首先仔細看輸入的給定的數組值 該值的區間爲 1 ≤ a[i] ≤ n
 * 這實際上是這道題解題的關鍵點,好好利用這個信息。 某些元素出現了兩次,
 * 而一些其餘的元素只出現了1次,咱們能夠利用這些元素在出現次數上面的不同作文章。
 *
 * 仔細觀察發現1 ≤ a[i] ≤ n 這個條件,正好和咱們數組的下標差1,咱們能夠按照數值
 * 來遍歷數組,那麼在數組中具備相同值的元素,會被通過兩次,那麼咱們只要想出一種方式
 * 在這個遍歷結束後能夠區分,哪些元素被通過了屢次便可,因爲數組元素具備1 ≤ a[i] ≤ n
 * 這樣的範圍,那其實咱們當每次通過一個元素時,給他加上n,當遍歷結束時,咱們再次遍歷數組
 * 那些數值超過2n的元素索引+1,對應的就是咱們的出現了兩次的元素。
class Solution {
    
    public List<Integer> findDuplicates(int[] nums) {
        List<Integer> ret = new ArrayList<>();

        int n = nums.length;
        for(int i = 0; i < n; i++){
            nums[(nums[i] - 1) % n] += n;
        }

        for(int i = 0; i < n; i++){
            if(nums[i] > 2 * n) ret.add(i+1);
        }
        return ret;
    }
}

442. 數組中重複的數據

給定一個整數數組 a,其中1 ≤ a[i] ≤ n (n爲數組長度), 其中有些元素出現兩次而其餘元素出現一次。it

找到全部出現兩次的元素。io

你能夠不用到任何額外空間並在O(n)時間複雜度內解決這個問題嗎?class

示例:List

輸入:
[4,3,2,7,8,2,3,1]

輸出:
[2,3]

* 這個題屬於技巧題 首先仔細看輸入的給定的數組值 該值的區間爲 1 ≤ a[i] ≤ n
 * 這實際上是這道題解題的關鍵點,好好利用這個信息。 某些元素出現了兩次,
 * 而一些其餘的元素只出現了1次,咱們能夠利用這些元素在出現次數上面的不同作文章。
 *
 * 仔細觀察發現1 ≤ a[i] ≤ n 這個條件,正好和咱們數組的下標差1,咱們能夠按照數值
 * 來遍歷數組,那麼在數組中具備相同值的元素,會被通過兩次,那麼咱們只要想出一種方式
 * 在這個遍歷結束後能夠區分,哪些元素被通過了屢次便可,因爲數組元素具備1 ≤ a[i] ≤ n
 * 這樣的範圍,那其實咱們當每次通過一個元素時,給他加上n,當遍歷結束時,咱們再次遍歷數組
 * 那些數值超過2n的元素索引+1,對應的就是咱們的出現了兩次的元素。
class Solution {
    
    public List<Integer> findDuplicates(int[] nums) {
        List<Integer> ret = new ArrayList<>();

        int n = nums.length;
        for(int i = 0; i < n; i++){
            nums[(nums[i] - 1) % n] += n;
        }

        for(int i = 0; i < n; i++){
            if(nums[i] > 2 * n) ret.add(i+1);
        }
        return ret;
    }
}
相關文章
相關標籤/搜索