新加坡Shoppe一面

606 阅读1分钟

最大子序和 LeetCode-53

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

输入:[-2,1,-3,4,-1,2,1,10,-1]

输出:[4,-1,2,1,10]

分析:相较于输出子序列最大和,本题需要使用两个指针记录当前和值的开始start和终止end的下标值,将最大和值的下标值存放在maxStart和maxEnd中。

    public class Test {
            public static void main(String[] args){
                int[] num = new int[]{-2,1,-3,4,-1,2,1,10,-1};
                int[] res = maxSubArray(num);
                for(int i=0;i<res.length;i++){
                    System.out.print(res[i] + " ");
                }
            }
            public static int[] maxSubArray(int[] nums) {
                int[] dp = new int[nums.length];
                dp[0] = nums[0];
                int max = nums[0];
                int start = 0;
                int end = 0;
                int maxStart = 0;
                int maxEnd = 0;
                for(int i=1;i<nums.length;i++){
                    if(dp[i-1]<0){
                        dp[i] = nums[i];
                        start = i;
                    }
                    else{
                        dp[i] = dp[i-1] + nums[i];
                    }
                    end++;
                    if(dp[i]>max){
                        max = dp[i];
                        maxStart = start;
                        maxEnd = end;
                    }
                }
                return Arrays.copyOfRange(nums, maxStart, maxEnd+1);
            }
    }

基本计算器2 LeetCode-227