目录
每日一句
爬上山顶并不是为了让全世界看到你,而是让你看到全世界
作者简介
🏡个人主页:XiaoChen_Android
📚学习专栏:力扣专栏
🕒发布日期:2022/8/19
『LeetCode|每日一题』 连续数列
1.每日一题
2.解题思路 (方法一)
2.1 思路分析
此题其实就是动态规划中的最大子段和,第一种方法空间复杂度为O(1),第二种方法空间复杂度为O(n)
S1:对于此题,我们只要考虑当前元素nums[i]是否要加入到前一段nums(0,i - 1)中;
S2:第一种情况,sum + nums[i] <= nums[i],sum为前一段字段和,此时说明sum是小于等于0的,前一段我们不要,所以此时sum应赋值为nums[i];
S3:第二种情况,sum + nums[i] > nums[i],此时说明sum大于0,前一段和对我们有好处(可以增加字段和),所以字段和应更新为nums[i] + sum;
S4:如果算出来的sum比刚开始的maxsum大,那么此时的最大字段和应为sum
2.2 核心代码
for(int i = 1 ; i < nums.length ; i ++){
if(sum + nums[i] <= nums[i]){
sum = nums[i];
}else {
sum = sum + nums[i];
}
if(sum > maxsum){
maxsum = sum;
}
}
2.3 全部代码
class Solution {
public int maxSubArray(int[] nums) {
if(nums.length == 1) return nums[0];
int maxsum = nums[0];
int sum = nums[0];
for(int i = 1 ; i < nums.length ; i ++){
if(sum + nums[i] <= nums[i]){
sum = nums[i];
}else {
sum = sum + nums[i];
}
if(sum > maxsum){
maxsum = sum;
}
}
return maxsum;
}
}
2.4 运行结果
3.解题思路(方法二)
3.1 思路分析
S1:定义一个新数组来存从开始到该位置的字段和,定义一个变量来存最大字段和,首先新数组b[0] = nums[0]且maxsum = nums[0];
S2:从第二个元素开始遍历如果到前一个元素的字段和大于零,那么此时b[i]应该为前面所有元素的字段和加上当前位置的元素,即b[i] = b[i - 1] + nums[i];
S3:如果前面所有位置的字段和小于0,那么此时b[i]应该为当前元素值,即b[i] = nums[i];
S4:最后只需要判断maxsum和最大字段和的大小,取其中大的即可
3.2 核心代码
private static int dtgh(int n , int[] nums){
int[] b = new int[n];
b[0] = nums[0];
int maxsum = b[0];
for(int i = 1 ; i < n ; i ++){
if(b[i - 1] > 0){
b[i] = b[i - 1] + nums[i];
}else {
b[i] = nums[i];
}
if(b[i] > maxsum){
maxsum = b[i];
}
}
return maxsum;
}
3.3 全部代码
class Solution {
public int maxSubArray(int[] nums) {
if(nums.length == 1) return nums[0];
int ans = 0;
int n = nums.length;
ans = dtgh(n , nums);
return ans;
}
private static int dtgh(int n , int[] nums){
int[] b = new int[n];
b[0] = nums[0];
int maxsum = b[0];
for(int i = 1 ; i < n ; i ++){
if(b[i - 1] > 0){
b[i] = b[i - 1] + nums[i];
}else {
b[i] = nums[i];
}
if(b[i] > maxsum){
maxsum = b[i];
}
}
return maxsum;
}
}
3.4 运行结果
🍁 类似题目推荐:
如果文章对你有帮助就支持一下噢,新手尝试,不好的地方请各位大佬多多指教!