1. 程式人生 > 其它 >力扣442題:陣列中重複的資料

力扣442題:陣列中重複的資料

技術標籤:力扣演算法題演算法java資料結構leetcode陣列

給定一個整數陣列 a,其中1 ≤ a[i] ≤ n (n為陣列長度), 其中有些元素出現兩次而其他元素出現一次。找到所有出現兩次的元素。你可以不用到任何額外空間並在O(n)時間複雜度內解決這個問題嗎?

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

這個題力扣給的難度是中等。

演算法思路:通過上一題力扣448題學會了新的思路後顯得這題特別的簡單了,可以說是換湯不換藥吧,這兩個題思路都是一樣的,在原陣列的基礎上,不增加額外的空間,然後找到陣列下標和陣列元素之間的關係即可解出答案。

通過一次迴圈遍歷整個陣列,出現過的元素就把那個下標的元素乘上-1,如果第二次檢測到該位置的元素為負數,也就說明了這個元素出現了兩次,把下標加入list中即可。

原始碼:

class Solution {
    public List<Integer> findDuplicates(int[] nums) {
        List<Integer> list = new ArrayList<>();
        for (int i = 0; i < nums.length; i++) {
            int num = Math.abs(nums[i]);
            int index = num-1;
            if(nums[index] > 0){
                nums[
index] *= -1; }else{ list.add(index+1); } } return list; } }

執行用時:
7 ms ,在所有 Java 提交中擊敗了81.90%的使用者
記憶體消耗:
47.4 MB, 在所有 Java 提交中擊敗了52.24%的使用者