Leetcode--448. 找到所有数组中消失的数字
給定一個范圍在??1 ≤ a[i] ≤ n (?n = 數組大小 ) 的 整型數組,數組中的元素一些出現了兩次,另一些只出現一次。
找到所有在 [1, n] 范圍之間沒有出現在數組中的數字。
您能在不使用額外空間且時間復雜度為O(n)的情況下完成這個任務嗎? 你可以假定返回的數組不算在額外空間內。
示例:
輸入:
[4,3,2,7,8,2,3,1]
輸出:
[5,6]
思路:
歸位法,將各數字放于他應有的次序,之后遍歷數組,每個位置上的數字與原本應有的數字不對應,即數字i+1不存在
例如:2 3? 5? 1? 2
第一次遍歷:2應該放在第二個位置,-> 3 2 5 1 2
還在i=0位置處,發現3也不在應該的位置? -> 5? 2? 3? 1? 2
哎?5也不在? ?->2? 2? 3? 1? 5
雖然第一個2不應該放在i=0處,但i=1處已經有2,所以不交換,進行第二次遍歷
第二次遍歷:第二個2已經歸位
第三次遍歷:3已經歸位
第四次遍歷:1不在本來的位置? ->1? 2? 3? 2? 5
第五次遍歷:5已經歸位
之后遍歷數組,發現i=3處本來應該是4,現在沒有,4就是消失的數字
提交的代碼:
class?Solution?{
????public?List<Integer>?findDisappearedNumbers(int[]?nums)?{
????????List<Integer>?list?=?new?ArrayList<Integer>();
????????????for(int?i=0;i<nums.length;i++)
????????????{
????????????????while(nums[i]!=nums[nums[i]-1])? //不可寫為if,因為交換之后,i處可能還不是本來應該有的數字,具體看上面的例子
????????????????{
????????????????????int?t?=?nums[nums[i]-1];
????????????????????nums[nums[i]-1]?=?nums[i];
????????????????????nums[i]?=?t;
????????????????}
????????????}
????????????for(int?i=0;i<nums.length;i++)
????????????{
????????????????if(nums[i]!=(i+1))
????????????????{
????????????????????list.add(i+1);
????????????????}
????????????}
????????????return?list;
????}
}
總結
以上是生活随笔為你收集整理的Leetcode--448. 找到所有数组中消失的数字的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python-函数定义
- 下一篇: 【剑指offer】面试题61:扑克牌中的