LeetCode Easy: 35-58
紀錄解題當下的思路與收穫的知識點

\35. Search Insert Position

  • 二分查找
    • 核心思路是"下一輪的搜索區間"
    • 然後逐步縮小區間
public int searchInsert(int[] nums, int target) {
    // 右邊界最大的數有可能就是答案(最衰的情況下),他的index就是長度
    int len = nums.length, left = 0, right = len;
    // 開始迫近
    while (left < right) {
        // 每輪都重新定義中間數,注意小數點會被捨去
        int mid = left + (right - left) / 2;
        // 如果目標更大
        if (nums[mid] < target) {
            // 成為新的左標,下一輪搜尋[mid + 1...right]
            left = mid + 1; // 因為小數點會被捨去,所以這邊+1
        } else {
            // 成為新的右標,下一輪搜尋[left...mid]
            right = mid;
        }
        // 直到nums[mid] = target
    }
    return left;
}

\53. Maximum Subarray

  • 動態規劃 Dynamic programming,核心思想是"大事化小,小事化了"
  • 拆分出局部的問題,從小的部分算出解並且儲存起來(記憶化)
  • 一個儲存的結果就是一個狀態,而狀態可能是很多種所以稱為動態,要做的事就是找出最佳解(規劃),所以叫做動態規劃
public int maxSubArray(int[] nums) {
    /**
     * Input: nums = [-2,1,-3,4,-1,2,1,-5,4]
     * Output: 6
     * Explanation: [4,-1,2,1] has the largest sum = 6.
     * 找出子數組(連續的)最大和
     */
    int n = nums.length;
    // 動態用來儲存最大值的數組,長度等於原數組,因為到時候要一個一個比過去
    int[] dp = new int[n];
    dp[0] = nums[0];
    // 先假設第一個數自己就是最大值
    int max = nums[0];
    // 從第二個數開始比對
    for (int i = 1; i < n; i++) {
        // 判斷"動態數組的前一個數"加"原數組當前數",哪個更大,原數組更大就成為動態數組的新成員
        dp[i] = Math.max(dp[i - 1] + nums[i], nums[i]);
        // 動態數組每輪更新的結果是累加的和,直到下一個數是負的才停
        // 更新最終要返回的max
        max = Math.max(max, dp[i]);
    }
    return max;
}

\58. Length of Last Word

  • 沒甚麼特別的,就是遍歷字串
public int lengthOfLastWord(String s) {
    /**
     * Input: s = "Hello World"
     * Output: 5
     * Explanation: The last word is "World" with length 5.
     * 輸入sting可能包含空格,找出最後一個單字的長度
     */
    // 從尾遍歷
    int len = s.length();
    int end = len - 1;
    // 如果找到空格就停
    for (; end >= 0 && s.charAt(end) == ' '; end--) {
    }
    // 單字的長度,直到空格又停
    int wordLength = 0;
    for (; end >= 0 && s.charAt(end) != ' '; end--) {
        wordLength++;
    }
    return wordLength;

}

上次修改於 2022-02-05