题解 | #连续子数组的最大和(二)#

连续子数组的最大和(二)

http://www.nowcoder.com/practice/11662ff51a714bbd8de809a89c481e21

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param array int整型一维数组 
     * @return int整型一维数组
     */
    public int[] FindGreatestSumOfSubArray (int[] array) {
        if(array.length == 1) {
            return array ;
        }
        int tail[] = new int[array.length] ;//tail[i]记录以i元素结尾的连续数组最大和
        int len[] = new int[array.length] ;//len[i]记录以i元素结尾的最大和连续数组的长度
        //初始化
        tail[0] = array[0] ;
        len[0] = 1 ;
        //计算
        for(int i = 1 ; i < array.length ; i ++) {
            //注意:>=而不是>,即:若当前元素与前一个连续数组整合的值等于当前元素时,也要把前一个连续数组算入新的连续数组
            if(tail[i-1]+array[i] >= array[i]) {
                tail[i] =  tail[i-1]+array[i];
                len[i] = len[i-1]+1 ;
            } else {//小于的话,就当前元素单独构成一个连续数组
                tail[i] =  array[i];
                len[i] = 1 ;
            } 
        }
        int maxTail = 0 ;//最大和的连续数组的尾部索引
        int maxLen = 0 ;//最大和的连续数组的长度
        for(int i = 0 ; i < tail.length; i ++) {
            //大于的话直接取其长度;等于的话还要比较长度是否大一些
            if(tail[i] > tail[maxTail] || tail[i] == tail[maxTail] && len[i] >= maxLen){
                maxTail = i ;
                maxLen = len[i] ;
            }
        }
        int[] res = new int[maxLen] ;
        int arrayS = maxTail - maxLen + 1 ;
        for(int i = 0 ; i < res.length ; i ++,arrayS++) {
            res[i] = array[arrayS] ;
        }
        return res ;
    }
}

一个菜鸟的算法刷题记录 文章被收录于专栏

分享一个菜鸟的成长记录

全部评论

相关推荐

小红书 后端选手 n*16*1.18+签字费期权
点赞 评论 收藏
分享
10-09 22:05
666 C++
找到工作就狠狠玩CSGO:报联合国演讲,报电子烟设计与制造
点赞 评论 收藏
分享
头像
11-21 11:39
四川大学 Java
是红鸢啊:忘了还没结束,还有字节的5k 违约金
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务