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 小时前
电子战抗干扰技术:当“不被干扰”成为一种系统
算法·通信·mimo·isac
笑容掩饰我的失落5 小时前
区块链从小白到精通(八):从零实现一个标准 ERC-20 代币(完整可运行代码)
算法·区块链·php·智能合约·哈希算法
Severus_black5 小时前
【C++初阶】Stack、Queue算法题大练兵!
c语言·c++·算法·stl
2601_967979128 小时前
机器学习必修课:经典算法与Python实战
python·算法·机器学习·实战·课程
程序猿打工仔8 小时前
计算机基础(C语言)考编、专技岗
c语言·开发语言·算法
通信小呆呆8 小时前
电子战干扰技术:从“蛮力压制”到“精准欺骗”,再到“认知博弈”
算法·通信·isac
老师我太想进步了20269 小时前
【数据结构-6】算法美学之单链表(1)
数据结构·算法
希望我万事顺遂9 小时前
力扣hot100-滑动窗口最大值
数据结构·算法·leetcode
꧁细听勿语情꧂10 小时前
二叉树余题,排序、直接插入排序、希尔排序
c语言·开发语言·数据结构·算法
是main不是漫10 小时前
【双指针|LeetCode1089 复写零】巧用逆向思路,破解原地覆盖陷阱
数据结构·算法·leetcode