LeetCode數組類知識點&題型總結

2021-01-14 Charlotte數據挖掘

數組知識點

我們知道常用的數據存儲方式有兩種:順序存儲和非順序存儲。順序存儲就是把數據存儲在一塊連續的空間內。數組(array)就是典型的順序存儲,而鍊表就是典型的非順序存儲。

數組通常用於存儲一系列相同類型的數據。當我們在創建數組時,會在內存中劃分出一塊連續的內存用於存儲數據,插入數據時,會將數據按順序存儲在這塊連續的內存中,讀取時通過訪問數組的索引迅速取出。數組名就是一個指針,指向這段內存的起始地址。通過數組的類型,編譯器知道在訪問下一個元素的時候需要在內存中後移多少個字節。由於數組在存儲時是順序存儲的,存儲數據的內存也是連續的,所以數組在讀取數據時比較容易,隨機訪問速度快,但是插入和刪除就比較費勁了。讀取可以直接根據索引,插入和刪除則比較耗時,插一個數據需要移動大量元素,在內存中空出一個元素的空間,然後將要增加的元素放在其中,如果想刪除一個元素,同樣需要移動大量元素去掉被移動的元素。所以如果需求是快速訪問數據,很少或者幾乎不插入和刪除元素,數組是一個不錯的選擇。

最常見的有一維數組和二維數組,稍微複雜一點的是多維數組和動態數組。在c++中,STL提供了Vector,在Java中,Collection集合中提供了ArrayList和Vector,對於Python而言,內置的List就是一個動態指針數組。當列表中沒有空間存儲新的元素時,列表會動態地改變大小以容納新的元素,每次改變大小時,會預留一部分空間以降低改變大小的頻率。

類別

1.無序數組

概念:未經過排序的數組

優點:插入快

缺點:查找慢,刪除慢

2.有序數組



  

題型總結這類題目通常會給定一個數組和一個值,讓求出這個數組中兩個/三個/K個值的和等於這個給定的值target。leetcode第一題就是two-sum,對於這類題目,首先看題目要求的時間複雜度和空間複雜度是什麼,其次看有沒有限制條件,如要求不能有重複的子數組或者要求按照升序/降序排列等。解法如下:


Leetcode中包含該類型的題目:

序號題目難度代碼1Two Sumeasypython、java、c++167Two Sum II-Input array is sortedeasypython、java、c++153Summediumpython、java、c++163Sum Closetmediumpython、java、c++2593Sum Smallermediumpython、java、c++184Summediumpython、java、c++



2.區間問題

這類題目通常會給一個包含多個子數組的數組,然後針對區間是否重合來判斷true or false。

1.按start排序
2.在前一個區間的end和後一個區間的start找交集

例題:252 meeting room[easy](https://leetcode.com/problems/meeting-rooms/)

題目理解:給定一個數組,包含每個會議的開始時間和結束時間[[s1,e1],[s2,e2],...],判斷一個人能否參加所有的會議。

test case:


Example1:

Input: [[0,30],[5,10],[15,20]]Output: falseExample2:Input: [[7,10],[2,4]]Output: true

    Java解法

class Solution{

   public boolean canAttendMeetings(Interval[] intervals){

       Arrays.sort(intervals,(x,y)->(x.start-y.start);

       //i從1開始,因為涉及到判斷前一個數組的end

       for (int i =0;i <intervals.length;i++){

           if (intervals[i-1].end > intervals[i].start){

               return false;

           }

}

return true;

    Python解法

class Solution(object):

   def canAttendMeetings(self, intervals):

       """

       :type intervals: List[Interval]

       :rtype: bool

       """

       intervals.sort(key=lambda x: x.start)

       for i in range(1, len(intervals)):

           if intervals[i].start < intervals[i-1].end:

               return False

       return True

Leetcode中包含該類型的題目:





序號題目難度代碼56Merge Intervalsmediumpython、java、c++57Insert Interval hardpython、java、c++252Meeting Roomseasypython、java、c++253Meeting Rooms IImediumpython、java、c++352Data Stream as Disjoint Intervalshardpython、java、c++



3.子數組類題目

這類題目通常會在一個包含多個子數組的數組中,求和/積,最大最小等。形式有很多種,例如求一個數組中和最小的子數組(209題),或者積最小的子數組(238題)

Input: s = 7, nums = [2,3,1,2,4,3]

Output: 2

解釋:滿足子數組和=7的最小長度數組是[4,3],所以output=2

解題思路:求的數字要大於等於這個數字target,譬如這個testcase中,[2,3,1,2,4,3],從前往後相加,前四項相加的和為8.已經大於7了,但是我們的target是7,後面的幾項也都是正整數,繼續往後走,肯定也會大於target7,所以這個時候我們把left指針往右移動一位,那麼就是相當於成為了一個滑動窗口(sliding window),這種方法在String類型的題目出現的更多。

圖1 每一個滑動窗口的變化情況


Java解法

class Solution {

   public int minSubArrayLen(int s, int[] nums) {

       int res = Integer.MAX_VALUE;//因為是求min,所以設定是Max_VALUE,然後最後的res比較就行,注意res不是0

       int left = 0,sum = 0;

       for (int i = 0;i<nums.length;i++){

           sum += nums[i];//每遍歷一次,就把前i次數字相加求和

           while (left <=  i && sum >=s){

               res = Math.min(res, i-left+1);

               sum -= nums[left++];

           }

       }

       return res == Integer.MAX_VALUE? 0:res;

Python解法

class Solution:


def minSubArrayLen(self, s, nums):

   total = left = 0

   result = len(nums) + 1

   for right, n in enumerate(nums):

       total += n

       while total >= s:

           result = min(result, right - left + 1)

           total -= nums[left]

           left += 1

   return result if result <= len(nums) else 0


Leetcode中包含該類型的題目:

序號

題目難度代碼78Subsetsmediumpython、java、c++90Subsets IImediumpython、java、c++53Maximum Subarrayeasypython、java、c++325Maximum Size Subarray Sum Equals kmediumpython、java、c++209Minimum Size Subarray Summediumpython、java、c++238Product of Array Except Selfmediumpython、java、c++152Maximum Product Subarraymediumpython、java、c++239Sliding Window Maximumhardpython、java、c++295Find Median from Data Streamhardpython、java、c++228Summary Rangesmediumpython、java、c++163Missing Rangesmediumpython、java、c++


以上的三種都屬於一維度數組的常見題型,除此之外還有二維數組、N維數組和綜合題的題型總結,可以在leetcode-book(https://github.com/huxiaoman7/leetcodebook)看後續總結。


如何按tag刷題

打開官網www.leetcode.com,選擇problems,右下有tags標籤,即可選擇按照不同題型刷題。我總結的題型裡包含了該tag下面的題和補充的一些題,可以以我github的leetcode-book上的題型順序來刷。


後續題型總結和leetcode題目list會在github上更新,本人能力有限,歡迎提留言和提issue討論~



相關焦點

  • [LeetCode] 912. Sort an Array 數組排序
    題目給定了每個數字的範圍是 [-50000, 50000],並不是特別大,這裡可以使用記數排序 Count Sort,在 LeetCode 中也有直接利用這個解法的題Sort Colors,建立一個大小為 100001 的數組 count,然後統計 nums 中每個數字出現的個數,然後再從0遍歷到 100000,對於每個遍歷到的數字i,若個數不為0,則加入 count 數組中對應個數的 i-50000
  • LeetCode刷題第三周【數組(簡單)】
    參考資料[1]Leetcode網站: https://leetcode-cn.com/[2]以上文字描述均來自 LeetCode數組模塊: https://leetcode-cn.com/tag/array/[3]刷題請點擊或見附錄:1539.
  • [LeetCode] 996. Number of Squareful Arrays 平方數組的個數
    的全排列數組是個平方數組。關於求有重複數字的全排列的講解可以參見上面的帖子,這裡就簡略的講講,首先要給原數組排序,使得重複的數字相鄰,便於跳過。在遞歸數組中,記得要跳過重複數字,然後要判斷是否是平方數組,若 out 不為空,則把前一個數字和當前數字相加,求 Double 型的平方根,這裡用了一個小 trick,對該平方根求 floor,若跟原平方根相同,則說明數字和是個完全平方數,因為若不是完全平方數的話,平方根會有小數部分,向下取整的話必定和之前不同了。
  • LeetCode145|數組中數字出現的次數II
    一,數組中數字出現的次數II1,問題描述在一個數組 nums 中除一個數字只出現一次之外,其他數字都出現了三次
  • [LeetCode] 918. Maximum Sum Circular Subarray 環形子數組的最大和
    假如沒有環形數組這一個條件,其實就跟之前那道 Maximum Subarray 一樣,解法比較直接易懂。這裡加上了環形數組的條件,難度就增加了一些,需要用到一些 trick。既然是子數組,則意味著必須是相連的數字,而由於環形數組的存在,說明可以首尾相連,這樣的話,最長子數組的範圍可以有兩種情況,一種是正常的,數組中的某一段子數組,另一種是分為兩段的,即首尾相連的,可以參見 大神 lee215 的帖子 中的示意圖。
  • leetcode刷對了麼
    「哲學是世界觀和方法論的統一,是具體科學知識的概括與總結。」 今天,逆行君就帶你從世界觀和方法論兩方面走進「leetcode」 簡單來說,leetcode是一個美國的在線編程網站,它收集了各大公司的經典算法面試題,用戶可以選擇不同的語言進行代碼的在線編寫、編譯和調試。
  • 「LeetCode算法精講」數組中的最短無序連續子數組(Python)
    題目內容給定一個整數數組,你需要尋找一個連續的子數組,如果對這個子數組進行升序排序,那麼整個數組都會變為升序排序。你找到的子數組應是最短的,請輸出它的長度。說明:輸入的數組長度範圍在 [1, 10,000]。輸入的數組可能包含重複元素 ,所以升序的意思是<=。
  • 高中數學知識點總結,函數題型的解題方法總結,收藏留作考試用
    在整個高考中最難的題型恐怕就是函數題型了,而函數題型在高考中考察的題目類型又是多元化的,通常情況下都分為一次函數、二次函數、反比例函數和複合函數等不同類型的函數,對於這些難題,千萬不要被嚇住了。其實這對各個題型在考試中哦度有他自己的解題套路是可以總結的到的,在高中數學的學習過程中,我們要善於總結規律,找到適合自己的學習方法,這樣成績才能快速提高。
  • 旋轉數組的最小數字
    原題把一個數組最開始的若干個元素搬到數組的末尾,我們稱之為數組的旋轉。輸入一個遞增排序的數組的一個旋轉,輸出旋轉數組的最小元素。例如,數組 [3,4,5,1,2] 為 [1,2,3,4,5] 的一個旋轉,該數組的最小值為 1。
  • LeetCode-66.加一(Plus One)
    加一給定一個由整數組成的非空數組所表示的非負整數,在該數的基礎上加一。最高位數字存放在數組的首位, 數組中每個元素只存儲單個數字。你可以假設除了整數 0 之外,這個整數不會以零開頭。示例 1:輸入: [1,2,3]輸出: [1,2,4]解釋: 輸入數組表示數字 123。
  • 每天一道leetcode56-合併區間
    正當班主任要繼續發話,只聽到角落默默想起來一個聲音:」K2」前言 2018.11.13號打卡明天的題目:https://leetcode-cn.com/problems/minimum-path-sum/descrip題目 每天一道leetcode56
  • 你真的了解JS中的數組嗎?——數組API的總結
    在JS中,數組是一個非常重要的知識點,不管是在面試還是在日常工作中,都非常需要;而該文章,不去深究數據的定義方法等,而只是總結相應的API並簡單的介紹相應方法的應用;如下圖所示,是我本篇文章介紹的相應的數組方法。
  • 高中數學知識點總結,圓錐曲線題型常用方法的總結
    在每年的高考中,對於圓錐曲線知識點的考察,是一個必不可少的考點,基本在全國以及地方的考試試卷中都會遇到,考試的題型也有很多種,在選擇,填空,解答題中都會考到,分值佔比相當大,也是我們同學每年考試的一個難點,好多同學就會因為圓錐曲線題型而導致失分過多。
  • [LeetCode] 976. Largest Perimeter Triangle 最大周長的三角形
    >Input: [3,2,3,4]Output: 10Example 4:Input: [3,6,2,3]Output: 8Note:3<=A.length<=100001<=A[i]<=10^6這道題給了個正整數數組
  • 鄭州大學應用經濟學統計學801經濟學基礎考研真題題型分析總結
    綜合來說,經濟類專業課這幾年的題型變化不大,主要有名詞解釋、簡答、論述、計算題等幾種題型,難度略有增加,名詞解釋類題目側重於對基礎知識點的掌握,簡答和論述題側重對知識的靈活運用。鄭大考研服務站常考題型分析總結每年考試題型有名詞解釋題、簡答題、論述題、計算題。下面簡單總結一下各種題型的答題方法、技巧和注意事項,幫助考生在掌握知識點的基礎上提高大家的應試能力。
  • 高中數學知識點總結,典型例題分析,統計與概率題型技巧總結
    概率與統計應用性問題是歷年高考命題的主要題型之一,在每年高考中必然會有一道解答大題出現,雖然他的難度不會很大,但是他會綜合的知識點也是比較多的。解答這類問題的關鍵是能閱讀、理解陳述的材料,深刻理解題意,學會文字語言向數學的符號語言的轉化,能結合所學知識解決問題。
  • 高中數學知識點總結,三角函數題型得分的秒殺解題技巧
    高中數學,三角函數題型都是初等函數,難度是相對比較簡單的一類題目,只是考察三角函數公式變換的題型相對較多。近幾年考綱要求三角函數的知識點主要是:1.能畫出y=sin x,y=cos x,y=tan x的圖象,了解三角函數的周期性.2.理解正弦函數、餘弦函數在[0,2π]上的性質(如單調性、最大值和最小值,圖象與x軸的交點定義域和值域問題等),3.理解正切函數在區間內的單調性.
  • LeetCode 例題精講 | 16 最大子數組和:子數組類問題的動態規劃技巧
    既然子數組拼接不起來,那麼我們就限制子問題計算的子數組只能位於數組尾部。這樣得到的最大和子數組,就一定可以跟下一個元素拼接起來了。Maximum Length of Repeated Subarray 最長公共子數組(Medium)給兩個整數數組 s 和 t ,返回兩個數組中公共的、長度最長的子數組的長度。
  • 數據結構與算法:05 Leetcode同步練習(一)
    題目01:兩數之和https://leetcode-cn.com/problems/two-sum/給定一個整數數組 nums 和一個目標值 target,請你在該數組中找出和為目標值的那 兩個整數,並返回他們的數組下標。
  • 餘弦定理知識點總結及典型例題
    餘弦定理的知識點及典型例題(更多資料和更詳細的例題解答和解題技巧,請關注+評論!如果對大家有幫助,歡迎轉發幫助更多學子!!!)餘弦定理和正弦定理是高中階段解三角形的理論基礎,上期分享了正弦定理的基礎知識和常見題型,本期小編和大家分享一下餘弦定理的基礎知識和基本題型及常用解題技巧。一、基礎知識二、典型例題題型一、餘弦定理的基本概念總結:(1)在解三角形的時候,我們什麼時候選擇正弦定理什麼時候選擇餘弦定理呢?