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,使用到了贪心策略

相关推荐
不爱吃炸鸡柳4 小时前
数据结构精讲:树 → 二叉树 → 堆 从入门到实战
开发语言·数据结构
Aurorar0rua5 小时前
CS50 x 2024 Notes C - 05
java·c语言·数据结构
6Hzlia6 小时前
【Hot 100 刷题计划】 LeetCode 739. 每日温度 | C++ 逆序单调栈
c++·算法·leetcode
良木生香6 小时前
【C++初阶】:STL——String从入门到应用完全指南(1)
c语言·开发语言·数据结构·c++·算法
XWalnut7 小时前
LeetCode刷题 day16
数据结构·算法·leetcode·链表·动态规划
寒秋花开曾相惜7 小时前
(学习笔记)4.1 Y86-64指令集体系结构(4.1.4 Y86-64异常&4.1.5 Y86-64程序)
开发语言·jvm·数据结构·笔记·学习
foundbug9998 小时前
基于混合整数规划的电池容量优化 - MATLAB实现
数据结构·算法·matlab
自我意识的多元宇宙9 小时前
树、森林——树与二叉树的应用(哈夫曼树的构造)
数据结构
memcpy010 小时前
LeetCode 2452. 距离字典两次编辑以内的单词【暴力;字典树】中等
算法·leetcode·职场和发展