子数组相关题目:前缀和技巧

本文介绍了前缀和的概念,并通过解析LeetCode53-Maximum Subarray, LintCode44-Minimun Subarray, LintCode138-Subarray Sum和LintCode139-Subarray Sum Closest这四个题目,展示了如何利用前缀和解决求最大子数组和、最小子数组和、和为0的子数组以及和最接近0的子数组等问题。文章详细阐述了思路并提供了代码实现。" 118119541,10551941,使用Visio绘制网络拓扑结构图,"['网络拓扑', '软件工具', '网络设计']
摘要由CSDN通过智能技术生成

前缀和介绍

  • 假设有数组AA.length = n

  • 则可新建一前缀和数组preSumArray其长度为n+1

  • 前缀和数组定义如下:

    • preSumArray[0] = 0
    • preSumArray[1] = A[0]
    • preSumArray[2] = A[0] +A[1]
    • ............
    • preSumArray[i] = A[0] + A[1] + ........ + A[i-1]
    • .........................
    • preSumArray[n] = A[0] + A[1] + ........ + A[n-1]
  • 前缀和数组有如下性质

    • sum(i~j) = preSumArray[j+1] - preSumArray[i]
    • preSumArray[j] - preSumArray[i] = Sum(i~(j - 1))
  • 这个也很容易证明嘛:

    • preSumArray[j+1] = A[0] + A[1] + ..+ A[i-1] + ... + A[j]
    • preSumArray[i] = A[0] + A[1]+ .... + A[i-1]
    • 二者之差等于:
    • A[i] + A[i+1] + .... + A[j] = sum(i~j)
  • 显然,构造前缀和数组的时间和空间复杂度均为O(n)

LeetCode53-Maximum Subarray

题意

  • 给定数组,求解此数组中连续子数组之和最大的,返回这个最大值

思路

  • 先求解该数组的前缀和数组
  • 然后遍历前缀和数组
  • 分别维护一个最大值和最小值,因为最大减最小的和最大嘛,这样遍历完成后得到一段连续数组和的最大值

代码

  public int maxSubArray(int[] nums) {
   

        if (nums == null || nums.length == 0){
   
            return 0;
        }
        //0. calc the preSumArray
        int n = nums.length;
        int[] preSumArray = new int[n+1];
        preSumArray[0] = 0;
        int sum = 0;
        for (int i = 0; i < n; i++) {
   
            sum += nums[i];
            preSumArray[i+1] = sum;
        }
        //1. find the max  sum of the SubArray in the nums
        //1.1 最大和的子数组一定等于 最大值减去最小值
        int maxSum = Integer.MIN_VALUE;
        int minSum = 0;
        //1.2 遍历preSumArray
        for (int i = 1; i < preSumArray.length; i++) {
   
            maxSum = Math.max(maxSum, preSumArray[i] - minSum);
            minSum = Math.min(minSum, preSumArray[i]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值