`

递归---求子数组的最大和

阅读更多
题目:输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为O(n)。

例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2,因此输出为该子数组的和18。

因为时间复杂度为O(n), 以为着我们只能有for循环,不能有嵌套for循环;===》 我们只能从语义上去分析这个题目的破绽。

可以把一个规模为N的问题转化为规模为N-1的问题。所以这个从A[0]到A[n-1]的最大和子数组问题分解成:
1.       所求子数组中包含A[0]。如果不包含A[1],则A[0]自己满足条件,此时Max(A[0]……A[n-1])=A[0]。如果包含A[1],则Max(A[0]……A[n-1])=A[0]+Max(A[1]……A[n-1])。
2.       所求子数组中不包含A[0]。Max(A[0]……A[n-1])=Max(A[1]……A[n-1])。
最终结果取以上三者的最大值即可,即Max(A[0]……A[n-1])=max( A[0], A[0]+Max(A[1]……A[n-1]), Max(A[1]……A[n-1]))。

这样使得分类变多,但是元素变少了


所以这就好像踢皮球,最终把球踢给了A[n-2]和A[n-1]

如果只有这两个数: max(A[n-2],A[n-1])=max(A[n-2] , A[n-2]+A[n-1])
如果只有三个数:max(A[n-3],A[n-2],A[n-1]) = max(A[n-3],A[n-3]+max(A[n-2],A[n-1]),max(A[n-2],A[n-1]));
.....
Max(A[0]……A[n-1])=max( A[0], A[0]+Max(A[1]……A[n-1]), Max(A[1]……A[n-1]))。


public void getMax(int[] arr){
   int max=0;
   int temp =0;
   for(int i=arr.length;i-2>=0;i--){
       if(i=arr.length-1){
          max = arr[i-2]>arr[i-2]+arr[i-1]?arr[i-2]:arr[i-2]+arr[i-1];
       }else {
          temp = arr[i-2]>arr[i-2]+max?arr[i-2]:arr[i-2]+max;
          max = temp>max?temp:max;
       }     
   }
}




分享到:
评论

相关推荐

    求子数组最大和

    这个问题的目标是给定一个整数数组,找出这个数组中的一个连续子数组,使得其元素之和最大。这个问题的一个著名解决方案是Kadane's Algorithm(卡丹算法),它具有线性时间复杂度,即O(n),其中n是数组的长度。 ...

    求一组数组的两个最大值和两个最小值 分治法

    3. **求子数组的最大值与最小值**: - 对于每个子数组 `C1` 和 `C2`,分别找出两个最大值和两个最小值。这里可以通过排序子数组来实现。排序后,数组的第一个元素是最小值,最后一个元素是最大值。 4. **合并结果**...

    求子集c++算法,经典

    ### 求子集C++算法详解 ...本文通过分析提供的C++代码,详细解释了递归求子集算法的工作原理、实现细节以及时间空间复杂度等关键概念。希望本文能帮助读者更好地理解和掌握求子集问题的相关知识。

    回溯法求解子集和问题

    例如,如果数组是[1, 2, 3],我们就可以用0和1来代表每个元素的选取状态:0表示不选,1表示选中。 以下是用Python实现的回溯法求解子集和问题的伪代码: 1. 定义一个函数`backtrack(current_sum, current_subset, ...

    Google微软-华为腾讯-面试笔试数据结构和算法编程题目和部分答案

    这其中包括了二元查找树转换为排序双向链表、设计包含min函数的栈、求子数组的最大和、在二元树中找出和为某一值的所有路径、查找最小的k个元素等题目。这些题目都是常见的数据结构和算法面试题目,旨在考察面试者的...

    [珍藏版]微软等数据结构+算法面试100题全部出炉[100题V0.1最终完美版]

    #### 2.1 求子数组的最大和 **题目概述**:给定一个包含正数和负数的整型数组,找出该数组中任意连续子数组的最大和。 **解题思路**: - 使用动态规划的方法解决此问题。 - 定义一个变量`maxSum`记录当前最大子数组...

    c# 面试题 很全面

    3. **求子数组的最大和**: - 最大子数组和问题,也称为“Kadane's Algorithm”。这个问题可以通过动态规划解决,时间复杂度为O(n)。 - 从数组的第一个元素开始,维护两个变量:`current_sum`表示当前子数组的和,...

    求子集问题--一个ACM程序竞赛题

    求子集问题--一个ACM程序竞赛题 本文将详细讲解求子集问题,这是一个ACM程序竞赛题。...本文讲解了求子集问题的解决方法,包括递推思想、栈和递归实现、算法评价、递归程序的实现和时间复杂度等知识点。

    各大公司算法面试题

    - 对于求子数组的最大和问题,我们可以使用动态规划的思想,定义一个状态`dp[i]`表示以第`i`个元素结尾的子数组的最大和。对于每一个`i`,`dp[i]`的值可以通过前一个状态`dp[i-1]`来计算,即`dp[i] = max(dp[i-1]+...

    数据结构100题

    求子数组的最大和 - **背景介绍**: - 数组是一个基本的数据结构,用于存储一系列有序的元素。 - 子数组是由数组中的连续部分组成的序列。 - **题目解析**: - 给定一个包含正数和负数的整数数组,要求找到...

    算法面试题总结_嵌入式-常用知识&面试题库_大厂面试真题.doc

    3. 求子数组的最大和:本题目考察了数组和算法的知识,要求求出所有子数组的和的最大值。解决方法是使用动态规划算法,维护一个数组,记录每个子数组的和,最后输出最大值。 4. 在二元树中找出和为某一值的所有路径...

    面试题-微软数据结构 

    ### 第3题: 求子数组的最大和 **题目描述**: 给定一个整数数组,求出所有子数组中的最大和。时间复杂度需为O(n)。 **解决方案**: 1. **动态规划方法**:使用一个变量`current_sum`来跟踪当前子数组的和,另一个...

    微软等数据结构+算法面试100题首次完整亮相

    根据给定的信息,本文将详细解析“微软等数据结构+算法面试100题首次完整亮相”的关键知识点,包括但不限于二元查找树转化为排序的双向链表、设计包含min函数的栈、求子数组的最大和以及在二元树中找出和为某一值的...

    leetcode数组下标大于间距-leetcode-hot100:leetcode-hot100-python

    时间复杂度寻找两数之差等于定值,用在求子数组和为 k 或其他类似题目上。 最长回文子串。动态规划法、中心扩张法。马拉车不用记。 LRU 缓存机制。?? 反转链表。链表基础题。递归或者遍历。对于 python 有一行代码...

    [汇总II][最新整理]微软等公司数据结构%2B算法面试100题[第1-80题].pdf

    3. **求子数组最大和** 这是著名的“Kadane's Algorithm”。算法的核心思想是动态规划,通过遍历数组一次,维护当前子数组的最大和以及全局最大和。如果当前元素大于当前子数组的和加上当前元素,那么更新子数组的...

    微软等公司数据结构+算法面试100题[第1-80题]

    - **问题描述**: 给定一个包含正数和负数的数组,要求找到一个子数组使得其元素之和最大。 - **解决方案**: 使用动态规划的方法解决。定义一个变量`max_sum`来记录迄今为止的最大和,以及一个变量`current_sum`来...

    July整理的100题微软数据结构和算法面试题

    3. **求子数组最大和**: 使用Kadane's算法,遍历数组一次,同时维护当前子数组的和与最大子数组的和。如果当前元素比前一个元素大,就累加;否则,重新从当前元素开始计算子数组的和。 4. **二元树找和为特定值的...

Global site tag (gtag.js) - Google Analytics