Leetcode题目之最大子序和

1>题目描述

  • 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

     示例 1:
     
     输入:nums = [-2,1,-3,4,-1,2,1,-5,4]
     输出:6
     解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。
     示例 2:
     
     输入:nums = [1]
     输出:1
     示例 3:
     
     输入:nums = [0]
     输出:0
     示例 4:
     
     输入:nums = [-1]
     输出:-1
     示例 5:
     
     输入:nums = [-100000]
     输出:-100000
    

2>暴力递归

2.1、代码思路

  • 1>若数组中仅有一个元素,输出该元素即可。
  • 2>要想找到最大子序和,首先得从数组从左至右找到第一个大于0的元素。
    • 找到该元素后以该元素为下一次遍历的头元素,扫描该元素直到末尾并把最大子序和存储起来。
  • 3>若所有元素都小于等于0,则只需要输出数组中最大元素即可。

2.2、代码实现

class Solution {
    public int maxSubArray(int[] nums) {
        int max = 0;
        int sum = 0;
        boolean flag = false;
        if(nums.length == 1){
            return nums[0];
        }
        for(int i=0;i<nums.length;i++){
            if(nums[i]>0){
                flag = true;
                for(int j=i;j<nums.length;j++)
                {
                    sum+=nums[j];
                    if(sum>max){
                        max = sum;
                    }
                }
                sum = 0;
            }
                }
                if(flag == false){
                    max = nums[0];
                    for(int i=1;i<nums.length;i++){
                        if(nums[i]>max){
                            max = nums[i];
                        }
                    }
                }
                  return max;
            }
    }

3>贪心算法

3.1、代码思路

  • 1>在遍历数组过程中,若该元素前面的元素和小于等于0则舍弃,若该元素前的元素和大于0则相加。
  • 2>在过程中记录最大子序和。

3.2、代码实现

class Solution {
    public int maxSubArray(int[] nums) {
        int max = nums[0],sum = nums[0];
        for(int i=1;i<nums.length;i++){
            sum = sum>0?sum+nums[i]:nums[i];
            max = Math.max(max,sum);
        }
        return max;
            }
    }

4>动态规划

4.1、代码思路

  • 1>从左至右遍历数组,若前一个元素大于0,则与现元素相加。
  • 2>最后遍历数组,找出最大值。

4.2、代码实现

class Solution {
    public int maxSubArray(int[] nums) {
        for(int i=1;i<nums.length;i++){
            nums[i] = nums[i-1]>0?nums[i]+nums[i-1]:nums[i];
        }
        int max =nums[0];
        for(int j=1;j<nums.length;j++){
            max = nums[j]>max?nums[j]:max;
        }
        return max;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值