二维数组删除_「leetcode」数组:总结篇!(一文搞懂数组题目)
數(shù)組理論基礎(chǔ)
數(shù)組是非常基礎(chǔ)的數(shù)據(jù)結(jié)構(gòu),在面試中,考察數(shù)組的題目一般在思維上都不難,主要是考察對(duì)代碼的掌控能力
也就是說(shuō),想法很簡(jiǎn)單,但實(shí)現(xiàn)起來(lái) 可能就不是那么回事了。
首先要知道數(shù)組在內(nèi)存中的存儲(chǔ)方式,這樣才能真正理解數(shù)組相關(guān)的面試題
「數(shù)組是存放在連續(xù)內(nèi)存空間上的相同類型數(shù)據(jù)的集合。」
數(shù)組可以方便的通過(guò)下表索引的方式獲取到下表下對(duì)應(yīng)的數(shù)據(jù)。
舉一個(gè)字符數(shù)組的例子,如圖所示:
需要兩點(diǎn)注意的是
- 「數(shù)組下表都是從0開始的。」
- 「數(shù)組內(nèi)存空間的地址是連續(xù)的」
正是「因?yàn)閿?shù)組的在內(nèi)存空間的地址是連續(xù)的,所以我們?cè)趧h除或者增添元素的時(shí)候,就難免要移動(dòng)其他元素的地址。」
例如刪除下表為3的元素,需要對(duì)下表為3的元素后面的所有元素都要做移動(dòng)操作,如圖所示:
而且大家如果使用C++的話,要注意vector 和 array的區(qū)別,vector的底層實(shí)現(xiàn)是array,嚴(yán)格來(lái)講vector是容器,不是數(shù)組。
「數(shù)組的元素是不能刪的,只能覆蓋。」
那么二維數(shù)組直接上圖,大家應(yīng)該就知道怎么回事了
「那么二維數(shù)組在內(nèi)存的空間地址是連續(xù)的么?」
我們來(lái)舉一個(gè)例子,例如:int[][] rating = new int[3][4]; , 這個(gè)二維數(shù)據(jù)在內(nèi)存空間可不是一個(gè) 3*4 的連續(xù)地址空間
看了下圖,就應(yīng)該明白了:
所以「二維數(shù)據(jù)在內(nèi)存中不是 3*4 的連續(xù)地址空間,而是四條連續(xù)的地址空間組成!」
數(shù)組的經(jīng)典題目
在面試中,數(shù)組是必考的基礎(chǔ)數(shù)據(jù)結(jié)構(gòu)。
其實(shí)數(shù)據(jù)的題目在思想上一般比較簡(jiǎn)單的,但是如果想高效,并不容易。
我們之前一共講解了四道經(jīng)典數(shù)組題目,每一道題目都代表一個(gè)類型,一種思想。
二分法
數(shù)組:每次遇到二分法,都是一看就會(huì),一寫就廢
這道題目呢,考察的數(shù)據(jù)的基本操作,思路很簡(jiǎn)單,但是在通過(guò)率在簡(jiǎn)單題里并不高,不要輕敵。
可以使用暴力解法,通過(guò)這道題目,如果要求更優(yōu)的算法,建議試一試用二分法,來(lái)解決這道題目
暴力解法時(shí)間復(fù)雜度:O(n)
二分法時(shí)間復(fù)雜度:O(logn)
在這道題目中我們講到了「循環(huán)不變量原則」,只有在循環(huán)中堅(jiān)持對(duì)區(qū)間的定義,才能清楚的把握循環(huán)中的各種細(xì)節(jié)。
「二分法是算法面試中的常考題,建議通過(guò)這道題目,鍛煉自己手撕二分的能力」。
雙指針?lè)?/h2>- 數(shù)組:就移除個(gè)元素很難么?
雙指針?lè)?#xff08;快慢指針?lè)?#xff09;:「通過(guò)一個(gè)快指針和慢指針在一個(gè)for循環(huán)下完成兩個(gè)for循環(huán)的工作。」
暴力解法時(shí)間復(fù)雜度:O(n^2)
雙指針時(shí)間復(fù)雜度:O(n)
這道題目迷惑了不少同學(xué),糾結(jié)于數(shù)組中的元素為什么不能刪除,主要是因?yàn)橐韵聝牲c(diǎn):
- 數(shù)組在內(nèi)存中是連續(xù)的地址空間,不能釋放單一元素,如果要釋放,就是全釋放(程序運(yùn)行結(jié)束,回收內(nèi)存棧空間)。
- C++中vector和array的區(qū)別一定要弄清楚,vector的底層實(shí)現(xiàn)是array,所以vector展現(xiàn)出友好的一些都是因?yàn)榻?jīng)過(guò)包裝了。
雙指針?lè)?#xff08;快慢指針?lè)?#xff09;在數(shù)組和鏈表的操作中是非常常見的,很多考察數(shù)組和鏈表操作的面試題,都使用雙指針?lè)ā?/p>
滑動(dòng)窗口
- 數(shù)組:滑動(dòng)窗口拯救了你
本題介紹了數(shù)組操作中的另一個(gè)重要思想:滑動(dòng)窗口。
暴力解法時(shí)間復(fù)雜度:O(n^2)
滑動(dòng)窗口時(shí)間復(fù)雜度:O(n)
本題中,主要要理解滑動(dòng)窗口如何移動(dòng) 窗口起始位置,達(dá)到動(dòng)態(tài)更新窗口大小的,從而得出長(zhǎng)度最小的符合條件的長(zhǎng)度。
「滑動(dòng)窗口的精妙之處在于根據(jù)當(dāng)前子序列和大小的情況,不斷調(diào)節(jié)子序列的起始位置。從而將O(n^2)的暴力解法降為O(n)。」
如果沒(méi)有接觸過(guò)這一類的方法,很難想到類似的解題思路,滑動(dòng)窗口方法還是很巧妙的。
模擬行為
- 數(shù)組:這個(gè)循環(huán)可以轉(zhuǎn)懵很多人!
模擬類的題目在數(shù)組中很常見,不涉及到什么算法,就是單純的模擬,十分考察大家對(duì)代碼的掌控能力。
在這道題目中,我們?cè)僖淮谓榻B到了「循環(huán)不變量原則」,其實(shí)這也是寫程序中的重要原則。
相信大家又遇到過(guò)這種情況:感覺(jué)題目的邊界調(diào)節(jié)超多,一波接著一波的判斷,找邊界,踩了東墻補(bǔ)西墻,好不容易運(yùn)行通過(guò)了,代碼寫的十分冗余,毫無(wú)章法,其實(shí)「真正解決題目的代碼都是簡(jiǎn)潔的,或者有原則性的」,大家可以在這道題目中體會(huì)到這一點(diǎn)。
總結(jié)
從二分法到雙指針,從滑動(dòng)窗口到螺旋矩陣,相信如果大家真的認(rèn)真做了「代碼隨想錄」每日推薦的題目,定會(huì)有所收獲。
推薦的題目即使大家之前做過(guò)了,再讀一遍的文章,也會(huì)幫助你提煉出解題的精髓所在。
「如果感覺(jué)有所收獲,希望大家多多支持,打卡轉(zhuǎn)發(fā),點(diǎn)贊在看 都是對(duì)我最大的鼓勵(lì)!」
最后,大家周末愉快!
本文:
https://github.com/youngyangyang04/leetcode-master?github.com已經(jīng)收錄,里面還有l(wèi)eetcode刷題攻略、各個(gè)類型經(jīng)典題目刷題順序、思維導(dǎo)圖,可以fork到自己倉(cāng)庫(kù),有空看一看一定會(huì)有所收獲,如果對(duì)你有幫助也給一個(gè)star支持一下吧!
我的B站(里面有我講解的算法視頻已經(jīng)編程相關(guān)知識(shí)):
嗶哩嗶哩 ( ゜- ゜)つロ 乾杯~ Bilibili?space.bilibili.com我是程序員Carl,哈工大師兄,先后在騰訊和百度從事技術(shù)研發(fā)多年,利用工作之余重刷leetcode,更多精彩算法文章盡在:代碼隨想錄,關(guān)注后,回復(fù)「Java」「C++」「python」「簡(jiǎn)歷模板」等等,有我整理多年的學(xué)習(xí)資料,可以加我微信,備注「?jìng)€(gè)人簡(jiǎn)介」+「組隊(duì)刷題」,拉你進(jìn)入刷題群(無(wú)任何廣告,純個(gè)人分享),每天一道經(jīng)典題目分析,我選的每一道題目都不是孤立的,而是由淺入深一脈相承的,如果跟住節(jié)奏每篇連續(xù)著看,定會(huì)融會(huì)貫通。總結(jié)
以上是生活随笔為你收集整理的二维数组删除_「leetcode」数组:总结篇!(一文搞懂数组题目)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: MySQL计算表行数_计算MySQL表中
- 下一篇: CentOS 5.5下搭建部署独立SVN