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。
題目分析
- 設置數組dp[i]爲以nums[i]結尾的元素的最大和,dp[0] = nums[0];
- 設置res爲此數組的最大和,初始值爲:nums[0];
- 令dp[i] = nums[i],判斷dp[i-1]是否大於0 ,若是大於0 ,dp[i] = dp[i] + dp[i-1];
- 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
題目分析
- 拿禮物的方式是每次向左或者向下移動一格,設置grid[i][j]爲當前路徑最大和;
- 判斷i-1是否大於0,j-1是否大於0,都大於的話,那麼上一個路徑爲Math.max(grid[i-1][j],grid[i][j-1]);
- 若是i-1大於0,那麼上一個路徑爲grid[i-1][j];
- 若是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];
};