题解 | #环形数组的连续子数组最大和#

环形数组的连续子数组最大和

https://www.nowcoder.com/practice/53a9f1ba687440cc9c641c2b042a59d7

import java.util.*;
public class Main{
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int[] arr = new int[n];
        int[] dp1= new int[n];
        int[] dp2 = new int[n];
        for(int i=0;i<n;i++) {
            arr[i] = sc.nextInt();
        }
        // dp[i]:以i结尾最大和 dp[i] = Math.max(dp[i-1]+arr[i],arr[i]);
        // 循环 -  dp[i%n] = Math.max(dp[(i-1)%n]+arr[i%n],arr[i%n]) 不行无法确定结束位置
        // 然后
        /*
        最大连续子数组和最小连续子数组 
        一定是相连的两部分。否则中间不相连的部分属于?
        求得如果最大连续和和最小连续和相加小于总和。说明数组两边的端点是正值,没有符合循环数组要求,通过最小连续和求
        */
        dp1[0]=arr[0];
        dp2[0]=arr[0];
        int sum, max_len,min_len;
        sum=max_len =min_len= arr[0];
        for(int i=1;i<n;i++) {
            dp1[i] = (int)Math.max(dp1[i-1]+arr[i], arr[i]);
            dp2[i] = (int)Math.min(dp2[i-1]+arr[i], arr[i]);
            max_len = Math.max(max_len, dp1[i]);
            min_len = Math.min(min_len, dp2[i]);
            sum += arr[i];
        }
        if(max_len>=0 && max_len + min_len < sum) max_len = sum - min_len;
        System.out.println(max_len);
    }
}
全部评论

相关推荐

最近和朋友聊天,她说了句让我震惊的话:"我发现我连周末点外卖都开始'最优解'了,一定要赶在高峰期前下单,不然就觉得自己亏了。"这不就是典型的"班味入侵"吗?工作思维已经渗透到生活的方方面面。
小型域名服务器:啊?我一直都这样啊?我还以为是我爱贪小便宜呢?每次去实验室都得接一杯免费的开水回去,出门都得规划一下最短路径,在宿舍就吃南边的食堂,在实验室就吃北边的食堂,快递只有顺路的时候才取。
点赞 评论 收藏
分享
点赞 评论 收藏
分享
去B座二楼砸水泥地:不过也可以理解,这种应该没参加过秋招
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务