本題是leetcode,地址:442. 數組中重複的數據java
給定一個整數數組 a,其中1 ≤ a[i] ≤ n (n爲數組長度), 其中有些元素出現兩次而其餘元素出現一次。數組
找到全部出現兩次的元素。設計
你能夠不用到任何額外空間並在O(n)時間複雜度內解決這個問題嗎?code
示例:blog
輸入:
[4,3,2,7,8,2,3,1]leetcode輸出:
[2,3]get
這道題設計的很巧(keng)妙(die),能解決這道題的前提是看懂題目預設數據特色:整數、取值範圍:1 ≤ a[i] ≤ n;微博
基於這兩點,設計思路是:class
i
時,將位置i-1
處的數字翻轉爲負數。i-1
上的數字已經爲負,則i
是出現兩次的數字。這樣代碼也就出來了;List
public List<Integer> findDuplicates(int[] nums) { List<Integer> rs = new ArrayList<>(); for(int index = 0; index < nums.length; index ++) { int v = Math.abs(nums[index]); int v2 = nums[v -1]; if(v2 < 0) { rs.add(v); } else { nums[v -1] = -nums[v -1]; } } return rs; }