LeetCode:最大子数组和

方法一(卡丹算法-动态规划):

java 复制代码
class Solution {
    public int maxSubArray(int[] nums) {
        int maxSum = nums[0];
        int currentSum = 0;

        for(int i = 0; i < nums.length; i++){
            //累加求和
            currentSum += nums[i];
            if(currentSum > maxSum){
                maxSum = currentSum;
            }
            //当前和小于0,抛弃前面累积的和,置为0
            if(currentSum < 0){
                currentSum = 0;
            }
        }
        return maxSum;
    }
}

方法二(分治法):

java 复制代码
class Solution {
    public int maxSubArray(int[] nums) {
        return divideAndConquer(nums, 0, nums.length - 1);
    }
    //递归分治算法
    private int divideAndConquer(int[] nums, int left, int right){
        //递归尽头,只剩一个元素
        if(left == right){
            return nums[left];
        }
        int mid = left + (right - left)/2;

        int leftMax = divideAndConquer(nums, left, mid);
        int rightMax = divideAndConquer(nums, mid + 1, right);

        int crossMax = crossSum(nums, left, right, mid);
        return Math.max(Math.max(leftMax, rightMax), crossMax);
    }
    //计算跨界最大值
    private int crossSum(int[] nums, int left, int right, int mid){
        //左边最大值
        int leftHalfMax = Integer.MIN_VALUE;
        int currentLeftSum = 0;
        for(int i = mid; i >= left; i--){
            currentLeftSum += nums[i];
            leftHalfMax = Math.max(leftHalfMax,currentLeftSum);
        }
        //右边最大值
        int rightHalfMax = Integer.MIN_VALUE;
        int currentRightSum = 0;
        for(int i = mid + 1; i <=right; i++){
            currentRightSum += nums[i];
            rightHalfMax = Math.max(rightHalfMax,currentRightSum);
        }
        return leftHalfMax + rightHalfMax;
    }
}

第一种方法将数组压缩成了单一的一个变量currentSum,使用到了贪心策略

相关推荐
战族狼魂9 小时前
高频面试题精选:分治与AI Agent架构
人工智能·算法·大模型·大语言模型
李剑一9 小时前
你用过网易的将军令嘛?它底层实现账号保护的原理相当简单粗暴
算法
Scott9999HH9 小时前
告别流量波动玄学!从法拉第电磁定律到底层 C/C++ 流量累积算法,深度解密工业级电磁流量计选型与开发
c语言·c++·算法
中达瑞和-高光谱·多光谱9 小时前
1nm到8nm光谱分辨率,你的应用该选哪款光谱相机?
算法·高光谱·高光谱相机
ChaoZiLL10 小时前
我的数据结构4-栈和队列
数据结构
香辣牛肉饭10 小时前
【算法】动态规划 最长公共子序列(LCS)
经验分享·笔记·算法·动态规划
miller-tsunami10 小时前
顺序表相关知识点
数据结构·顺序表
旖-旎11 小时前
LeetCode 279:完全平方数(完全背包)—— 题解
c++·算法·leetcode·动态规划·背包问题
.徐十三.11 小时前
一篇文章看到最短路径——Dijkstra算法
算法