日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

bat从数组中找出相同数字并删除_找到所有数组中消失的数字

發(fā)布時(shí)間:2023/12/4 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 bat从数组中找出相同数字并删除_找到所有数组中消失的数字 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

題目描述

給定一個(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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。