题目一描述:
给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
解题思路:
连续子数组:以i结尾的连续子数组的最大值dp[i]
最大值:dp[i]的最大值
解题方法:
暴力解法:
两层循环,从第一个元素开始分别和不同个数元素开始,保存最大值即可。
动态规划: dp[i]=Math.max(dp[i-1]+nums[i],nums[i])
贪心法:
分治法:
最优解:动态规划
代码:
/**
* @param {number[]} nums
* @return {number}
*/
var maxSubArray = function(nums) {
let n =nums.length
let dp = []
let ans = []
ans.push(nums[0])
dp[0] = nums[0]
if(n===1) {
return nums[0]
}
for (let i=1;i<n;i++) {
dp[i] = Math.max(dp[i-1]+nums[i],nums[i])
// 这里dp[i]代表的含义是以i结尾的最大值,所以要取最大值,需要取所有的最大值。
ans.push(dp[i])
}
return Math.max(...ans)
}
maxSubArray = function(nums) {
// 如果sum大于0,则对结果有增益的效果,如果sum小于0则没有增益的效果,ans为上一次增加的结果,
每次比较ans和sum,取最大值。
let ans = nums[0];
let sum = 0;
for(const num of nums) {
if(sum > 0) {
sum += num;
} else {
sum = num;
}
ans = Math.max(ans, sum);
}
return ans;
};
题目二描述:
以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。
解题思路:
解题方法:
代码
merge(intervals) {
let res = [];// 结果
intervals.sort((a, b) => a[0] - b[0]);// 排序
console.log(intervals);
let prev = intervals[0];// 第一个数据
for (let i = 1; i < intervals.length; i++) {
let cur = intervals[i];// 当前遍历的数据
if (prev[1] >= cur[0]) { // 有重合
prev[1] = Math.max(cur[1], prev[1]);
} else { // 不重合,prev推入res数组
res.push(prev);
prev = cur; // 更新 prev
}
}
res.push(prev);
console.log(`别人的合并之后的:${res}`);
return res;
},
注意:当考察完最后一个区间,后面没区间了,遇不到不重合区间,最后的 prev 没推入 res。
要单独补上。