深信服手撕算法题—连续子数组的最大和

连续子数组的最大和

题目描述如下:在这里插入图片描述
第一次我做的思路是用两个for循环遍历,写完以后面试官说你这么写是有问题的,会超时。由于面试时间比较紧张,就叫我私底下再好好想想。
最好的做法是用动态规划算法 时间复杂度为0(N)

public int maxSubArray(int[] nums) {
    int[]dp = new int[nums.length]; //动态规划列表 dp,
    dp[0] = nums[0]; 
    int res = nums[0];//全局最大值
    for(int i = 1;i<nums.length;i++){
        dp[i] = Math.max(nums[i],nums[i]+dp[i-1]);//dp[i] 代表以元素 nums[i]为结尾的连续子数组最大和
        										 //如果dp[i-1]<0,则不加;如果dp[i-1]>0,则加上该值,进行更新						
        res = Math.max(res,dp[i]);				//更新全局最大值
    }        
        return res;
    }

也可以只用一个res变量解决该问题:

public int maxSubArray(int[] nums) {
    int res = nums[0];//全局最大值
    for(int i = 1;i<nums.length;i++){
    	nums[i] += Math.max(0,nums[i-1]);			
        res = Math.max(res,nums[i]);				
    }        
        return res;
    }

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值