數組(並不只是數組)

2021-02-08 光影鍵盤俠

不少小夥伴看到Array這個標題,應該會想「這也太基礎了吧」,其實這確實是算法中最常見的一種了,這種類型的題目變化比較多,容易結合其他的知識點一起考察,比如字符串、two pointers等這些內容,因為數組這種數據結構是最常用的了,所以才會變化多端、結合複雜的算法一起考察,所以還是需要多加注意。


outline

Sorted Array

Two Pointers

Two sum, 3Sum, 4Sum

Partition Array


1. Sorted Array

有序的數組Sun君認為還是比較有意思的,因為能想到的套路就只有那麼多,其實還是考察你對有序數的一個掌握程度吧。多的不說,先來一個熱身的題目:

Merge Two Sorted Array

合併兩個排序的整數數組A和B變成一個新的數組。

樣例

給出A=[1,2,3,4],B=[2,4,5,6],返回 [1,2,2,3,4,4,5,6]


這裡就不用多說了,因為vector的大小是一開始設定好的,所以我們需要開闢一個新的數組來存儲兩個的和,這裡就從最後一個位置開始,代碼如下:

當然了,面試的時候應該不會考這麼簡單的題。相關的題目還有一些,比如將一個小數組歸併到大數組裡面:這個題就不需要再開闢新的數組了,因為A的空間足夠存放B,所以就直接從後面往前比較遍歷就好。比較簡單就不加代碼了。

接下來是一個面經題:

Intersection of Two Arrays

返回兩個數組的交

樣例

nums1 = [1, 2, 2, 1], nums2 = [2, 2], 返回 [2].


這道題目有很多種做法,比如hash map,排序+合併等,這裡我就用排序+合併的方法來做一下。代碼如下:

這個題目主要是注意代碼簡潔,其他也沒什麼多說的。

到這裡你一定會覺得很簡單,那麼下面一個題還是值得好好分析的:

Median of Two Sorted Arrays

兩個排序的數組A和B分別含有m和n個數,找到兩個排序數組的中位數,要求時間複雜度應為O(log (m+n))。

樣例

給出數組A = [1,2,3,4,5,6] B = [2,3,4,5],中位數3.5

給出數組A = [1,2,3] B = [4,5],中位數 3


當然這道題也可以先排序,然後再找中位數,不過這樣的做法是O(nlogn)的,不滿足題目的要求。看到 O(log L) 這樣的複雜度,而且還是有序數組,能想到哪個算法嗎?沒錯,就是二分查找!

要找中位數,就是要找第 k 大的數(k = (L / 2 + 1),其中L 是上面提到的合併後新數組的長度,當 L 是偶數時,要求第 (L / 2) 大和第 (L / 2 + 1) 大的兩個數)。當我們捨棄掉一部分,假設捨棄部分的長度為 length,那麼接下來就是在剩下的數組裡求第 (k - length) 大的數。逐層縮小範圍,直到兩數組其中一個走完,或者要求的是第 1 大的元素,就可以直接返回結果了。

那如何「選擇」要捨棄哪部分呢?既然是要找合併後的數組 C 的第 k 大元素,即 C[k-1],那如果我們從 A 和 B 中分別取前 k/2 個元素,其中必然有一部分是是在數組 C 的前 k 個數裡。設 mid = k / 2,當 A[mid - 1] < B[mid - 1] 時,可以斷定 A 的前 mid 個元素是在 C 的前 k 個數裡(此處可用反證法得證),那麼我們則捨棄 A 的前 mid 個元素。反之則捨棄 B 的前 mid 個元素。現在數組 A 或者 B 已經捨棄掉 k/2 個元素,縮小查找範圍了,那接下來可以按照同樣的方法繼續選擇嗎?當然!現在剩下總共 (L - mid) 個元素,且 A 和 B 依舊有序,要找的是第 (k - mid) 大的元素,所以我們可以按照上面的方法繼續遞歸選擇下去,直到找到目標元素。代碼如下:

2. Two Pointers

說到兩個指針系列,那麼最最最重要的題目應該想到的就是Two Sum了,相信應該沒有同學不會吧?題目大意就是給你一個數組,然後找到兩個數之和等於一個target。這個題目的話,不管用hashmap的方法還是排序以後再操作的方法,都是很不錯的思路,就看面試的時候面試官如何要求了。下面是Two Sum用hashmap的實現方法:

那麼我們就直接來說3Sum這個題目吧。

3Sum

給出一個有n個整數的數組S,在S中找到三個整數a, b, c,找到所有使得a + b + c = 0的三元組。

注意:

在三元組(a, b, c),要求a <= b <= c。

結果不能包含重複的三元組。


有了Two Sum作為鋪墊,3Sum也不會很難了,首先想到hashmap的方法,也是可以做的,不過這裡還是要重點說一下排序以後的方法。

我們要找三個數的和為0,想想可不可以把這個題目轉化為找兩個數,加起來的和等於數組中某個數的取負?這樣就比較好做了,那麼我們可以先對數組進行排序,然後找到一個確定的數,以它的取負作為target,然後在它之後尋找兩個數的和等於這個target,這裡就可以用到兩個指針的方法。代碼如下:

有了3Sum,那麼肯定就有4Sum,這個就不難了。找到i和j,然後在之後進行同樣的two pointer方法,代碼如下:


那麼之後的KSum我覺得大家可以自己想想,然後可以給公眾號留言和Sun君討論。

說完了Sum系列,該說一個比較重要的部分了,也是面試非常非常非常容易考到的問題,就是partition array,不管你是在做快速排序、快速選擇等,都需要用到這個內容。就是把數組變成兩個部分,請大家一定要背誦並默寫,題目如下:

Partition Array

給出一個整數數組 nums 和一個整數 k。劃分數組(即移動數組 nums 中的元素),使得:

所有小於k的元素移到左邊

所有大於等於k的元素移到右邊

返回數組劃分的位置,即數組中第一個位置 i,滿足 nums[i] 大於等於 k。


這個就是使用了當初學習快速排序的思想,多的就不介紹了,如果還是沒有掌握的小夥伴可以自行學習一下。代碼如下:

總結

雖說只是簡簡單單的數組,但還是蘊含了巨大的能量。需要大家多去思考,結合別的數據結構和算法來思考。

相關焦點

  • EXCEL數組及數組運算的簡單講解
    對於Excel中的「數組」,可以理解為有著行、列標識並有著尺寸特徵的集合。一個單元格的數據就可以是一個數組,即單元素數組;單行數據或者單列數據,是一維數組;多行多列數據是多維數組。其特點是:1. 所有的數組,都能在一定連續單元格區域表示出來。
  • Java基礎——數組例題&二維數組
    數組例題:例題1:申請String字符串數組,並拿出裡面的數據。先申請一個String字符串,然後最裡面輸入要存儲的值,使用for循環申請變量i,i小於String數組的長度(.Length),然後列印String數組的第i個值就可以取出裡面的數組。
  • JavaScript數組 - 概念
    數組的概念及作用 我們來學習數組之前,先來複習一下數據類型數據類型:基本數據類型:數字、字符串、布爾值特殊數據類型:null、undefined符合數據類型:數組為什麼我們要來使用數組?換句話說,數組就是用來存儲大量數據的數組的概念:字面意思上是一組數據,一組(一般情況下相同類型)的數據(不一定都是數字)注意:數組是一種數據類型,與普通的數據類型聲明方式差不多,區別在於數組需要用到單獨的變量來存儲一系列的值數組的定義 1.使用new運算符創建數組參數:使我們數組中要存儲的數據
  • NumPy數組中的廣播機制及結構化數組
    廣播機制廣播機制這一操作實現了對兩個或以上數組進行運算或用函數處理,即使這些數組形狀並不完全相同。並不是所有的維度都要彼此兼容才符合廣播機制的要求,但它們必須要滿足一定的條件。前面講過,在NumPy中,如何通過用表示數組各個維度長度的元素(也就是數組的型)把數組轉換成多維數組。因此,若兩個數組的各維度兼容,也就是兩個數組的每一維等長,或其中一個數組為一維,那麼廣播機制就適用。如果這兩個條件都不能滿足,NumPy就會拋出異常,說這兩個數組不兼容。執行完代碼之後,我們就得到了兩個數組:4x4的數組以及一個一行四列的數組。
  • java之數組長度的獲取與數組的遍歷
    各位小夥伴們大家好,這次小編要介紹的是java中數組長度的獲取與數組的遍歷,首先小編要介紹的是,數組長度的獲取,如何獲取一個數組的長度呢?獲取數組長度的格式:數組名稱.length。之後,將會出現一個int數字來代表數組的長度。
  • 像數組又不是數組:JS函數的參數列表到底是什麼?
    3 和數組一樣,用中括號將內容包含起來。究竟是不是數組?結合我們之前所學關於數組的知識點,剛好把它們串起來,從三個角度來驗證下arguments是不是數組。結果報錯,arguments並不像正常的數組一樣,有push函數2 正面確認下,用我們之前判斷數組的方法來判斷一下:結果為false,直接說明arguments不是數組。
  • EXCEL中數組專題之八:數組及數組公式的制約性與集合性(一)
    在前面的幾篇關於數組的專題中,我先後講了數組的基本概念,基本的應用,並結合實際的應用把提高篇的內容也講解給了各位朋友,相信很多朋友對數組的應用已經有了較為深入地認識,在為什麼要採用數組公式的兩篇文章中我用了很大的力氣給大家講解了數組的實際應用,這對於大家的應用是十分有用的。
  • 「C語言指針」指針數組?數組指針?
    今天帶著大家來簡單過一下數組指針和指針數組,這兩兄弟像是兩座大山,重重地壓在很多小白的心頭上。其實沒什麼可糾結的,只要按照最樸素的語言規律。後面是什麼決定這整個東西最終是什麼。類似於肉夾饃,說得再多它終究只是饃的一種,而不可能是肉(淚目)。
  • 你真的了解JS中的數組嗎?——數組API的總結
    在JS中,數組是一個非常重要的知識點,不管是在面試還是在日常工作中,都非常需要;而該文章,不去深究數據的定義方法等,而只是總結相應的API並簡單的介紹相應方法的應用;如下圖所示,是我本篇文章介紹的相應的數組方法。
  • 數組:總結篇
    ❝周末我們做個總結吧❞數組理論基礎數組是非常基礎的數據結構,在面試中,考察數組的題目一般在思維上都不難,主要是考察對代碼的掌控能力也就是說,想法很簡單,但實現起來 可能就不是那麼回事了。首先要知道數組在內存中的存儲方式,這樣才能真正理解數組相關的面試題「數組是存放在連續內存空間上的相同類型數據的集合。」數組可以方便的通過下表索引的方式獲取到下表下對應的數據。
  • JavaScript數組 - 屬性
    數組的屬性數組的長度:arr.length 訪問數組元素的個數注意:length屬性,不是只讀的,是可以設置的舉個小例子:運行的效果:我們做這樣一個操作運行效果如下這就是數組的屬性數組的遍歷在學習數組遍歷之前,我們先來回顧一下剛剛所提的數組的訪問,數組元素的訪問和賦值,都是通過數組的下標來完成的。
  • 數組越界及其避免方法,C語言數組越界詳解
    所謂的數組越界,簡單地講就是指數組下標變量的取值超過了初始定義時的大小,導致對數組元素的訪問出現在數組的範圍之外,這類錯誤也是 C 語言程序中最常見的錯誤之一。在 C 語言中,數組必須是靜態的。換而言之,數組的大小必須在程序運行前就確定下來。
  • EXCEL中數組的應用專題之一:數組公式是如何輸入的
    在EXCEL的應用中,數組是經常用到的一個知識點,在實際工作中,巧妙的利用數組可以在實際的工作中可以得心應手,配合必要的函數和公式,可以讓你的工作變得簡單高效。數組公式就是可以同時進行多重計算並返回一種或多種結果的公式。比一般的公式要複雜些,理解上要和普通的公式加以區別。
  • 【LeetCode】數組--旋轉數組(189)
    寫在前面關注較早的讀者可能知道現階段的LeetCode刷題將按照某一個特定的專題進行,之前的【貪心算法】已經結束,雖然只有三個題卻包含了簡單,中等,困難這三個維度,今天介紹的是第二個專題【數組
  • 【算法】找出數組中和最大的子數組
    光說概念沒什麼用,下面上例子(這是《算法導論》Java版中的講到的,借用一下),我就不結合日常,直接說問題:給定一個數組,找出數組中和最大的子數組(子數組表示在原數組中連續的一些元素)。看到這個問題,是不是第一感覺就是暴力解題:兩個for循環,一個個組合計算。
  • PHP 沒有真正的數組!
    使用PHP數組的幾個建議下面是我在使用PHP數組時總結的一些心得:時刻小心$ary[0]每當你看到數組索引為0時,就應該知道這段代碼很可能在將PHP數組當作傳統數組處理。通常這種假設是不安全的,特別是當數組是從其他地方傳遞過來的情況下。0也許並不是數組中的第一個鍵,甚至可能根本不存在(例如在執行了array_filter()之後)。
  • Excel VBA如何定義數組,這裡有最全的數組定義方法
    Dim + 數組名定義數組用Dim關鍵字,後面的一些參數,沒有也可以,表示任意大小或任意類型的數組。Dim Arr(0 to 10)這樣就定義了一個由最小下標為0,最大下標為10的一維數組,也就是Arr數組裡面包含了從0~10的11個變量。
  • 如何把一個固定數組的值傳遞給另外一個數組
    大家好,今日我們繼續講解VBA數組與字典解決方案,今日講解的是第34講:數組的傳遞。在應用數組的時候,我們往往需要要把數組的值由一個數組傳遞給另外一個數組,就如同變量的傳遞一樣:A=B 』把B值賦給AC=A 』把A值賦給C如上例,就完成了把值的傳遞的過程,分別把B的值傳遞給了A;把A的值傳遞了B,那麼數組是否也可以呢?
  • JavaScript數組 - 其他方法
    數組的其他方法1.concat();格式:數組.concat( 數組2 );功能:將兩個數組合併成一個新數組,源數組不會被改變返回值:我們合併好的數組參數:我們要合併的數組舉個小例子:運行結果如下:arr輸出結果是兩數組合起來的arr1和arr2裡面的元素不變2.slice();格式:數組.slice( start,end );功能:基於當前數組獲取指定區域元素並創建一個新數組,源數組不改變。
  • VBA基礎-數組知識
    ➜VBA數組的形式    VBA數組是以變量形式存放的一個空間,它也有行有列,也可以是三維空間。數組中的元素按次序存儲在數組中,通過索引號進行區分。 ➜數組分類  數組按類型可以分為三種   a.一般分為:常量數組,靜態數組,動態數組b.如按維度為:1維,2維,3維......60 維➊常量數組&