刷題89—動態規劃(六)

134.連續子數組的最大和

題目鏈接
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/lian-xu-zi-shu-zu-de-zui-da-he-lcof
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。

題目描述
輸入一個整型數組,數組裏有正數也有負數。數組中的一個或連續多個整數組成一個子數組。求所有子數組的和的最大值。

要求時間複雜度爲O(n)。

示例1:

輸入: nums = [-2,1,-3,4,-1,2,1,-5,4]
輸出: 6
解釋: 連續子數組 [4,-1,2,1] 的和最大,爲 6。

題目分析

  1. 設置數組dp[i]爲以nums[i]結尾的元素的最大和,dp[0] = nums[0];
  2. 設置res爲此數組的最大和,初始值爲:nums[0];
  3. 令dp[i] = nums[i],判斷dp[i-1]是否大於0 ,若是大於0 ,dp[i] = dp[i] + dp[i-1];
  4. res = Math.max(res,dp[i]),返回res。
/**
 * @param {number[]} nums
 * @return {number}
 */
var maxSubArray = function(nums) {
    let n = nums.length;
    let dp = [];
    let res = nums[0];
    dp[0] = nums[0];
 
    for(let i=1; i<n; i++){
        dp[i] = nums[i];
        if(dp[i-1] > 0) dp[i] += dp[i-1];
        res = Math.max(res,dp[i]);
    }
    return res;
};

135.禮物的最大價值

題目鏈接
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/li-wu-de-zui-da-jie-zhi-lcof
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。

題目描述
在一個 m*n 的棋盤的每一格都放有一個禮物,每個禮物都有一定的價值(價值大於 0)。你可以從棋盤的左上角開始拿格子裏的禮物,並每次向右或者向下移動一格、直到到達棋盤的右下角。給定一個棋盤及其上面的禮物的價值,請計算你最多能拿到多少價值的禮物?

示例 1:

輸入:
[
[1,3,1],
[1,5,1],
[4,2,1]
]
輸出: 12
解釋: 路徑 1→3→5→2→1 可以拿到最多價值的禮物

提示:

0 < grid.length <= 200
0 < grid[0].length <= 200

題目分析

  1. 拿禮物的方式是每次向左或者向下移動一格,設置grid[i][j]爲當前路徑最大和;
  2. 判斷i-1是否大於0,j-1是否大於0,都大於的話,那麼上一個路徑爲Math.max(grid[i-1][j],grid[i][j-1]);
  3. 若是i-1大於0,那麼上一個路徑爲grid[i-1][j];
  4. 若是j-1大於0,那麼上一個路徑爲grid[i][j-1];
/**
 * @param {number[][]} grid
 * @return {number}
 */
var maxValue = function(grid) {
    let n = grid.length;
    let m = grid[0].length;
    for(let i=0; i<n; i++){
        for(let j=0; j<m; j++){
            if(i-1 >= 0 && j-1 >= 0){
                grid[i][j] += Math.max(grid[i-1][j],grid[i][j-1]);
            }else if(i-1 >= 0){
                grid[i][j] += grid[i-1][j];
            }else if(j-1 >= 0){
                grid[i][j] += grid[i][j-1];
            }
        }
    }
    return grid[n-1][m-1];
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章