【leetcode之旅】 數組 - 關於數組【簡單】部分的總結

通過這麼久的堅持,終於把數組中的【簡單】部分的題目做完了,做了這麼多,也該來一次小小的總結。

通過數組的練習,瞭解了這一類題的常用思路和方法

1.使用多重循環一步步遍歷求解

2.將數組存入Map中,然後利用map中的方法進行解答

3.雙指針法,定義兩個索引,對數組進行遍歷

4.有時從頭往後遍歷不能解決問題,那麼可以嘗試從後往前進行遍歷

5.在【66.加一問題】中將每位數通過相除(/)判斷是否進位,通過取餘(%)給每位數對應的值,

在遇到進位問題時,可以考慮使用這種方法

6.分治算法來解決問題,通過將一個大的問題分成很多個小塊,然後每個小塊負責各自的功能

7.在遇到【53.最大子序和】這類問題時,可以通過邊累加邊判斷,在 求和之後的值 和 求和之前的值  之間取較大/小的值

8.在遇到搜索問題時,請首先考慮二分查找,如果不行,再考慮普通的搜索方式

9.遇到移除元素時,不一定要真正的刪除,可以將其替換掉

10.大家可能覺得將【楊輝三角】【楊輝打印II】出來可能有點難度,可以換個角度思考問題,不需要第一步就將楊輝三角的結構和數據都對應上你可以先將楊輝三角初始化,將結構構建出來,然後再將對應的值進行替換。

對於構建結構,可以使用List<List<Integer>>進行構建

對於數據替換,可以先初始化爲1,然後通過上一層之和,求出下一層的值,然後對其進行修改賦值。

11.對於盈利問題時【121.買股票的最佳時機】【122.買賣股票的最佳時機II】,

對於只能買賣一次的情況:可以先進行判斷是否繼續,繼續下去是盈利還是虧損,記錄每次的利潤將其和目前求得的利潤 取最大值。

對於可以買賣多次的情況: 判斷下一次的值是否比這次的大,如果大,直接相減,將差值進行累加。

12.在進行查找時,我們可以對已經查找到的值做一個標記,使其表示已存在,在【448.找出所有數組消失的數】中,將已經存在的值標記爲負數,然後將1-n不爲負數的值輸出

13.【求第三大的數】,或者求第二大的數,模板如下:

for (int i = 0; i < nums.length; i++) {
   if (nums[i] > max){
       thirdMax = secondMax;
       secondMax = max;
       max = nums[i];
    }else if (nums[i] > secondMax && nums[i] < max){
       thirdMax = secondMax;
       secondMax = nums[i];
    }else if (nums[i] > thirdMax && nums[i] < secondMax){
       thirdMax = nums[i];
    }
}

將賦值最大值max之前先將之前的max賦值給第二大的值secondMax

賦值第二大的值secondMax之前先將之前的secondMax賦值給第三大的值

14.數組移動問題:

向前移動:舉例:【283.移動零


/**
 * 前移
 * @param nums
 * @param index
 */
public static void move(int[] nums,int index){
    for (int i = index + 1; i < nums.length; i++) {
        nums[i - 1] = nums[i];
    }
}

向後移動:

從後面開始遍歷,nums[i] = nums[i - 1]

15. 利用異或求解(^),一個數連續異或兩個相同的數,得到的結果爲其本身,例如:1 ^ 2 ^ 2 = 1,案例:【268.缺少數字

16. 利用%可以防止重複移動【189. 旋轉數組

17. Set集合在數組去重方面,會有奇效

18.注意map.put()方法是有返回值的,如果key值不存在,則返回null,如果存在,則返回上一個key值【219. 存在重複元素II

19. 在【169.求衆數】的時候,很多人想到的是將其出現的個數計算出來,其實不需要,只需給每個值進行統計,當某個值相同時則count++,否則count--,當count=0時,對下一個值進行統計(注意:這種方法適用於數組中一定存在衆數的情況)。

20. 從兩邊搜索比每次從頭開始的速度要快很多

22. 【566.重塑數組】中,爲了防止數組越界,利用int類型相除,小於必爲0,取餘小於必爲本身的方法,對索引值進行了限定

public static int[][] matrixReshape(int[][] nums, int r, int c) {
    int n = nums.length,m = nums[0].length;
    if (r * c != n*m){
        return nums;
    }
    int[][] res = new int[r][c];
    for (int i = 0; i < r * c; i++) {
        res[i/c][i%c] = nums[i/m][i%m];
    }
    return res;
}

23. 可以利用map中 jdk1.8的新特性map.getOrDefault(),統計數組中每個值出現的個數

Map的新方法getOrDefault(Object,V)允許調用者在代碼語句中規定獲得在map中符合提供的鍵的值,否則在沒有找到提供的鍵的匹配項的時候返回一個“默認值”。

24. 可以多多利用三元運算符

25. 【697.求數組的度】中需要統計數組的度(即出現次數最多的值開始索引與結束時索引差的長度),以及隨時更新重複數的索引,以及保存第一次出現改值的索引,使用了Map<Integer,int[]>來存儲

26. 【 695.島嶼的最大面積】中使用遞歸求島嶼的面積,當計算了一個值,就將其置爲0,遞歸的算法就是判斷其周圍有沒有1,如果有繼續遞歸,如果沒有,則直接返回0

27. 多多利用公式,使其更容易理解【888.公平的糖果交換

28.多多利用中間值和最終值進行比較,【849.到最近的人的最大距離

29.看清題型,並覺得最終的輸出類型以及使用的數據結構

30. 在【746.使用最小花費爬樓梯】時,有時數組需要進行擴容然後進行判斷,在原數組無法選擇最後走出的路徑時

31.最後一點總結,不要鑽牛角尖,這樣會浪費你的很多時間!!!

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章