1. 程式人生 > 實用技巧 >Java程式設計:找到所有陣列中消失的數字(LeetCode:448)

Java程式設計:找到所有陣列中消失的數字(LeetCode:448)

給定一個範圍在 1 ≤ a[i] ≤ n (n = 陣列大小 ) 的 整型陣列,陣列中的元素一些出現了兩次,另一些只出現一次。

找到所有在 [1, n] 範圍之間沒有出現在陣列中的數字。

您能在不使用額外空間且時間複雜度為O(n)的情況下完成這個任務嗎? 你可以假定返回的陣列不算在額外空間內。

示例:

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

輸出:
[5,6]

來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/find-all-numbers-disappeared-in-an-array
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。

分析:

根據題目特點,可以把陣列中的元素與索引建立一一對應的關係。因為索引是確定的0到n-1,一個也不缺,而陣列的元素不確定,少了哪個也不知道。
既然兩者是一一對應的關係,那麼我們對陣列中的每個元素對應的索引做個標記;
然後再對索引進行一次遍歷,那麼不存的元素就不會對它對應的索引進行比較,由此可查找出這些不存在的元素。

思路:

1、遍歷每個元素,對索引進行標記
將對應索引位置的值變為負數;
2、遍歷下索引,看看哪些索引位置上的數不是負數的。
位置上不是負數的索引,對應的元素就是不存在的。

class Solution {
public List<Integer> findDisappearedNumbers(int[] nums)
//用來存放結果
List<Integer> res = new ArrayList<>();
//1. 遍歷下陣列的元素,對對應的索引位置的元素作標記
int len = nums.length;
for(int i = 0; i < len; i++){
int num = Math.abs(nums[i]); //由於陣列的元素有可能被*-1,所以取絕對值
int index = num - 1;
if(nums[index] > 0){
nums[index] *= -1;
}
}
// 尋找沒有標記的索引位置
for(int i = 0; i < len; i++){
if(nums[i] > 0){
int num = i + 1; //將索引轉化為對應的元素
res.add(num);
}
}
return res;
}
}