週末我們做個總結吧
❞陣列是非常基礎的資料結構,在面試中,考察陣列的題目一般在思維上都不難,主要是考察對**的掌控能力
也就是說,想法很簡單,但實現起來 可能就不是那麼回事了。
首先要知道陣列在記憶體中的儲存方式,這樣才能真正理解陣列相關的面試題
「陣列是存放在連續記憶體空間上的相同型別資料的集合。」
陣列可以方便的通過下表索引的方式獲取到下表下對應的資料。
舉乙個字元陣列的例子,如圖所示:
需要兩點注意的是
正是「因為陣列的在記憶體空間的位址是連續的,所以我們在刪除或者增添元素的時候,就難免要移動其他元素的位址。」
例如刪除下表為3的元素,需要對下表為3的元素後面的所有元素都要做移動操作,如圖所示:
而且大家如果使用c++的話,要注意vector 和 array的區別,vector的底層實現是array,嚴格來講vector是容器,不是陣列。
「陣列的元素是不能刪的,只能覆蓋。」
那麼二維陣列直接上圖,大家應該就知道怎麼回事了
「那麼二維陣列在記憶體的空間位址是連續的麼?」
我們來舉乙個例子,例如:int rating = new int[3][4];
, 這個二維資料在記憶體空間可不是乙個3*4
的連續位址空間
看了下圖,就應該明白了:
所以「二維資料在記憶體中不是3*4
的連續位址空間,而是四條連續的位址空間組成!」
在面試中,陣列是必考的基礎資料結構。
其實資料的題目在思想上一般比較簡單的,但是如果想高效,並不容易。
我們之前一共講解了四道經典陣列題目,每一道題目都代表乙個型別,一種思想。
陣列:每次遇到二分法,都是一看就會,一寫就廢
這道題目呢,考察的資料的基本操作,思路很簡單,但是在通過率在簡單題裡並不高,不要輕敵。
可以使用暴力解法,通過這道題目,如果要求更優的演算法,建議試一試用二分法,來解決這道題目
暴力解法時間複雜度:o(n)
二分法時間複雜度:o(logn)
在這道題目中我們講到了「迴圈不變數原則」,只有在迴圈中堅持對區間的定義,才能清楚的把握迴圈中的各種細節。
「二分法是演算法面試中的常考題,建議通過這道題目,鍛鍊自己手撕二分的能力」。
雙指標法(快慢指標法):「通過乙個快指標和慢指標在乙個for迴圈下完成兩個for迴圈的工作。」
暴力解法時間複雜度:o(n^2)
雙指標時間複雜度:o(n)
這道題目迷惑了不少同學,糾結於陣列中的元素為什麼不能刪除,主要是因為以下兩點:
雙指標法(快慢指標法)在陣列和鍊錶的操作中是非常常見的,很多考察陣列和鍊錶操作的面試題,都使用雙指標法。
本題介紹了陣列操作中的另乙個重要思想:滑動視窗。
暴力解法時間複雜度:o(n^2)
滑動視窗時間複雜度:o(n)
本題中,主要要理解滑動視窗如何移動 視窗起始位置,達到動態更新視窗大小的,從而得出長度最小的符合條件的長度。
「滑動視窗的精妙之處在於根據當前子串行和大小的情況,不斷調節子串行的起始位置。從而將o(n^2)的暴力解法降為o(n)。」
如果沒有接觸過這一類的方法,很難想到類似的解題思路,滑動視窗方法還是很巧妙的。
模擬類的題目在陣列中很常見,不涉及到什麼演算法,就是單純的模擬,十分考察大家對**的掌控能力。
在這道題目中,我們再一次介紹到了「迴圈不變數原則」,其實這也是寫程式中的重要原則。
相信大家又遇到過這種情況:感覺題目的邊界調節超多,一波接著一波的判斷,找邊界,踩了東牆補西牆,好不容易執行通過了,**寫的十分冗餘,毫無章法,其實「真正解決題目的**都是簡潔的,或者有原則性的」,大家可以在這道題目中體會到這一點。
「如果感覺有所收穫,希望大家多多支援,打卡**,點讚在看 都是對我最大的鼓勵!」
最後,大家週末愉快!
-------end-------
我將演算法學習相關的資料已經整理到了github :裡面還有leetcode刷題攻略、各個型別經典題目刷題順序、思維導圖看一看一定會有所收穫!
趕緊給「**隨想錄」加乙個星標吧,方便第一時間閱讀文章。往期
精彩回顧陣列:這個迴圈可以轉懵很多人!陣列:滑動視窗拯救了你陣列:就移除個元素很難麼?陣列:每次遇到二分法,都是一看就會,一寫就廢
「**隨想錄」期待你的關注!
每天8:35準時推送一道經典演算法題目,推送的每道題目都不是孤立的,而是由淺入深,環環相扣,幫你梳理演算法知識脈絡,輕鬆學演算法!
PHP 二維陣列刪除空陣列 二維陣列根據指定值排序
去除二維陣列的重複項 去除二維陣列的重複項 param arr 陣列 param key 按照哪個鍵值 return array public function array unset tt arr,key else return res 二維陣列按某個鍵值進行排序 二維陣列按某個鍵值進行排序 pa...
陣列 二維陣列
一組相同型別的資料組合,是一種引用型別。陣列名稱不是固定的,與其存放的資料的型別有關。如 存放int型別的資料,陣列名稱 int 存放字串資料,陣列名稱 string 存放scanner型別的資料,陣列名稱 scanner陣列中的每個資料,都是這個陣列的元素。1 宣告 元素型別 變數名 元素型別 變...
陣列 二維陣列
陣列,從名字很簡單看出就是數字組合,一堆數 一堆元素 在一起。然後看一下怎麼定義,怎麼初始化。陣列的動態初始化 初始化之後每個元素的儲存內容為其對應資料型別的預設值。資料型別 陣列名 new 陣列型別 大小 int arr new int 5 資料型別 陣列名 new 陣列型別 大小 int arr...