bat从数组中找出相同数字并删除_找到所有数组中消失的数字
題目描述
給定一個(gè)范圍在? 1 ≤ a[i] ≤ n ( n = 數(shù)組大小 ) 的 整型數(shù)組,數(shù)組中的元素一些出現(xiàn)了兩次,另一些只出現(xiàn)一次。
找到所有在 [1, n] 范圍之間沒(méi)有出現(xiàn)在數(shù)組中的數(shù)字。
您能在不使用額外空間且時(shí)間復(fù)雜度為O(n)的情況下完成這個(gè)任務(wù)嗎? 你可以假定返回的數(shù)組不算在額外空間內(nèi)。
示例:
輸入:[4,3,2,7,8,2,3,1]
輸出:[5,6]
題解
注意題目要求不能使用額外空間,這就是題目的難點(diǎn)所在。
這道題的描述部分包含了一個(gè)非常重要的信息,1 ≤ a[i] ≤ n,即每個(gè)數(shù)字本身都對(duì)應(yīng)一個(gè)i-1的數(shù)組下標(biāo)。我們可以利用數(shù)組內(nèi)容本身跟數(shù)字下標(biāo)的關(guān)聯(lián)找出缺失的數(shù)字。
掃描兩遍數(shù)組:
- 第一遍,將所有數(shù)字做標(biāo)記
- 第二遍,根據(jù)標(biāo)記信息找出缺失的數(shù)字。
下面來(lái)看詳細(xì)分析
假設(shè)有數(shù)組[1,2,3,4,5,6]
這個(gè)數(shù)組是有序的,而且也沒(méi)有缺失數(shù)字,范圍是[1,6]
仔細(xì)看,數(shù)組中的每個(gè)元素,其實(shí)和數(shù)組下標(biāo)是有一一對(duì)應(yīng)關(guān)系的
這里的對(duì)應(yīng)關(guān)系就是:
- 數(shù)組值1對(duì)應(yīng)下標(biāo)0
- 數(shù)組值2對(duì)應(yīng)下標(biāo)1
- 數(shù)組值3對(duì)應(yīng)下標(biāo)2
- 數(shù)組值4對(duì)應(yīng)下標(biāo)3
- 數(shù)組值5對(duì)應(yīng)下標(biāo)4
- 數(shù)組值6對(duì)應(yīng)下標(biāo)5
也就是數(shù)組下標(biāo)+1正好等于?數(shù)組中的值
如果是一個(gè)亂序的數(shù)組會(huì)怎樣呢?
假設(shè)數(shù)組是[5,4,6,3,1,2],范圍是[1,6],也沒(méi)有缺失數(shù)字
這里仍然有一一對(duì)應(yīng)關(guān)系:
- 數(shù)組值5對(duì)應(yīng)下標(biāo)4
- 數(shù)組值4對(duì)應(yīng)下標(biāo)3
- 數(shù)組值6對(duì)應(yīng)下標(biāo)5
- 數(shù)組值3對(duì)應(yīng)下標(biāo)2
- 數(shù)組值1對(duì)應(yīng)下標(biāo)0
- 數(shù)組值2對(duì)應(yīng)下標(biāo)1
沒(méi)有缺失數(shù)字的情況下,不管是有序的、還是亂序的,都跟下標(biāo)有一一對(duì)應(yīng)關(guān)系。
現(xiàn)在我們來(lái)分析一個(gè)缺失數(shù)字的例子
假設(shè)有數(shù)組[1,2,3,4,6,6]缺少數(shù)字5
我們用值和下標(biāo)對(duì)應(yīng)的這么一層關(guān)系,將數(shù)組重寫一遍
- 第一個(gè)值是1,對(duì)應(yīng)下標(biāo)是0,將arr[0]設(shè)置為-arr[0],即-1
- 第二個(gè)值是2,對(duì)應(yīng)下標(biāo)是1,將arr[1]設(shè)置為-arr[1],即-2
- 第三個(gè)值是3,對(duì)應(yīng)下標(biāo)是2,將arr[2]設(shè)置為-arr[2],即-3
- 第四個(gè)值是4,對(duì)應(yīng)下標(biāo)是3,將arr[3]設(shè)置為-arr[3],即-4
- 第五個(gè)值是6,對(duì)應(yīng)下標(biāo)是5,將arr[5]設(shè)置為-arr[5],即-6
- 第六個(gè)值是6,對(duì)應(yīng)下標(biāo)是5,將arr[5]設(shè)置為-arr[5],即-6
第五個(gè)、第六個(gè)值相同,他們修改的是同一個(gè)下標(biāo),都將arr[5]改了一次
但是arr[4]這個(gè)位置沒(méi)動(dòng)過(guò)
重寫了一遍數(shù)組之后,數(shù)組就變成了這個(gè)樣子:
由于下標(biāo)4應(yīng)該對(duì)應(yīng)數(shù)字5,現(xiàn)在缺少了這個(gè)值,所以沒(méi)人設(shè)置這個(gè)位置,于是第一遍處理完后,只有下標(biāo)4這個(gè)位置的值是正數(shù),其他位置的全部都是負(fù)數(shù)。
這就好辦了,我們遍歷一遍數(shù)組,找到大于0的數(shù),這個(gè)數(shù)是6,對(duì)應(yīng)下標(biāo)是4,所以缺失的數(shù)字是5
最后再看一個(gè)更復(fù)雜的例子
數(shù)組[4,3,2,7,8,2,3,1],缺少5,6兩個(gè)數(shù)字
我們來(lái)看下第一趟的處理過(guò)程:
- 第一個(gè)數(shù)字是4,對(duì)應(yīng)下標(biāo)3,將arr[3]設(shè)置為-7
- 第二個(gè)數(shù)字是3,對(duì)應(yīng)下標(biāo)2,將arr[2]設(shè)置為-2
- 第三個(gè)數(shù)字是2,對(duì)應(yīng)下標(biāo)1,將arr[1]設(shè)置為-3
- 第四個(gè)數(shù)字是7,對(duì)應(yīng)下標(biāo)6,將arr[6]設(shè)置為-3
- 第五個(gè)數(shù)字是8,對(duì)應(yīng)下標(biāo)7,將arr[7]設(shè)置為-1
- 第六個(gè)數(shù)字是2,對(duì)應(yīng)下標(biāo)1,將arr[1]設(shè)置為-3
- 第七個(gè)數(shù)字是3,對(duì)應(yīng)下標(biāo)2,將arr[2]設(shè)置為-2
- 第八個(gè)數(shù)字是1,對(duì)應(yīng)下標(biāo)0,將arr[0]設(shè)置為-4
第一趟處理完了之后,我們開(kāi)始第二趟掃描,也就是上圖中第二個(gè)數(shù)組
這個(gè)數(shù)組中8,2兩個(gè)元素是大于0的
8對(duì)應(yīng)下標(biāo)4,所以4+1,即缺少5這個(gè)數(shù)字
2對(duì)應(yīng)下標(biāo)5,所以5+1,即缺少6這個(gè)數(shù)字
時(shí)間復(fù)雜度:O(N)
空間復(fù)雜度:O(1)
java代碼:
class?Solution?{????public?List?findDisappearedNumbers(int[]?nums)?{
????????List?res?=?new?ArrayList();//第一遍掃描,根據(jù)數(shù)組的值找到對(duì)應(yīng)的下標(biāo),比如3對(duì)應(yīng)下標(biāo)2//將arr[2]設(shè)置成負(fù)數(shù)for(int?i=0;i????????????int?index?=?Math.abs(nums[i])-1;if(nums[index]>0)?{
????????????????nums[index]?*=?-1;
????????????}
????????}//第二遍掃描,找到所有非負(fù)數(shù),非負(fù)數(shù)所在的下標(biāo)+1,即為缺失的數(shù)字for(int?i=1;i<=nums.length;++i)?{if(nums[i-1]>0)?{
????????????????res.add(i);
????????????}
????????}return?res;
????}
}
python代碼:
class?Solution(object):????def?findDisappearedNumbers(self,?nums):
????????"""
????????:type?nums:?List[int]
????????:rtype:?List[int]
????????"""
????????res?=?[]
????????#?第一遍掃描,根據(jù)數(shù)組的值找到對(duì)應(yīng)的下標(biāo),比如3對(duì)應(yīng)下標(biāo)2
????????#?將arr[2]設(shè)置成負(fù)數(shù)
????????for?i?in?nums:
????????????index?=?abs(i)-1
????????????if?nums[index]>0:
????????????????nums[index]?*=?-1
????????#?第二遍掃描,找到所有非負(fù)數(shù),非負(fù)數(shù)所在的下標(biāo)+1,即為缺失的數(shù)字
????????for?i?in?xrange(len(nums)):
????????????if?nums[i]>0:
????????????????res.append(i+1)
????????return?res推薦閱讀??點(diǎn)擊標(biāo)題可跳轉(zhuǎn)
刪除排序數(shù)組中的重復(fù)項(xiàng)
移動(dòng)零
盛水最多的容器
看完本文有收獲?請(qǐng)轉(zhuǎn)發(fā)分享給更多人
好文章,我在看??
總結(jié)
以上是生活随笔為你收集整理的bat从数组中找出相同数字并删除_找到所有数组中消失的数字的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: python顺序结构实验设计_Pytho
- 下一篇: inner join 和 exists