給定一個整數數組 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; } }
給定一個整數數組 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; } }