力扣442(java)-陣列中重複的資料(中等)
題目:
給你一個長度為 n 的整數陣列 nums ,其中 nums 的所有整數都在範圍 [1, n] 內,且每個整數出現 一次 或 兩次 。請你找出所有出現 兩次 的整數,並以陣列形式返回。
你必須設計並實現一個時間複雜度為 O(n) 且僅使用常量額外空間的演算法解決此問題。
示例 1:
輸入:nums = [4,3,2,7,8,2,3,1]
輸出:[2,3]
示例 2:
輸入:nums = [1,1,2]
輸出:[1]
示例 3:
輸入:nums = [1]
輸出:[]
提示:
n == nums.length
1 <= n <= 105
1 <= nums[i] <= n
nums 中的每個元素出現 一次 或 兩次
來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/find-all-duplicates-in-an-array
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。
解題思路:
一、
1.遍歷陣列,找到數字i,將數字i-1作為位置索引找到另一個數字,並將該數字設定為相反數
2.如果i-1上的數字已經為負數了,則數字i就是出現兩次的數
注:
取絕對值:nums[i]可能已經變為負數了,index還需要指向其他未遍歷過的數,故需要加絕對值
二、
先從小到大排序,再進行迴圈判斷前一項與後一項的值,如果相等則表示兩數字重複
小知識:
1.Math.abs(x)
函式返回指定數字 “x“ 的絕對值
2.List<Integer> list = new ArrayList<>(),List是一個介面,而ArrayList 是一個類。 ArrayList 繼承並實現了List。此時它是一個List物件,有些ArrayList有但是List沒有的屬性和方法,它就不能再用了,只能呼叫List接口裡面的內建函式。