[LeetCode系列]最大连续子列递归求解分析

本文部分参考Discuss: LeetCode.

步骤1. 选择数组的中间元素. 最大子序列有两种可能: 包含此元素/不包含.

步骤2.

  步骤2.1 如果最大子序列不包含中间元素, 就对左右子序列进行步骤1.

  步骤2.2 如果最大子序列包含, 则结果很简单, 就是左子列的最大后缀子列(即包含左子列最后一个元素--中间元素)加上右子列的最大前缀子列(即包含右子列第一个元素--中间元素)

步骤3. 返回三者中的最大值(左子列最大值, 右子列最大值, 二者拼接最大值).

 1 class Solution {
 2 public:
 3     int maxSubArray(int A[], int n) {
 4         // IMPORTANT: Please reset any member data you declared, as
 5         // the same Solution instance will be reused for each test case.
 6         if(n==0) return 0;
 7         return maxSubArrayHelperFunction(A,0,n-1);
 8     }
 9
10     int maxSubArrayHelperFunction(int A[], int left, int right) {
11         if(right == left) return A[left];
12         int middle = (left+right)/2;
13         int leftans = maxSubArrayHelperFunction(A, left, middle);
14         int rightans = maxSubArrayHelperFunction(A, middle+1, right);
15         int leftmax = A[middle];
16         int rightmax = A[middle+1];
17         int temp = 0;
18         for(int i=middle;i>=left;i--) {
19             temp += A[i];
20             if(temp > leftmax) leftmax = temp;
21         }
22         temp = 0;
23         for(int i=middle+1;i<=right;i++) {
24             temp += A[i];
25             if(temp > rightmax) rightmax = temp;
26         }
27         return max(max(leftans, rightans),leftmax+rightmax);
28     }
29 };

[LeetCode系列]最大连续子列递归求解分析

时间: 2024-11-05 03:42:31

[LeetCode系列]最大连续子列递归求解分析的相关文章

hdu1003 最大连续子列和(动态规划★★★☆☆)

解题思路: 利用动态规划方法求解最大子列和,对应输入数据a[i],会有数据dp[i].数组dp中的每个元素dp[i],表示以a[i]结尾的最大连续子列和.遍历dp数组,可以找出子列和最大值. if (dp[i-1] >=0){ dp[i] = dp[i-1] + a[i]; } else{ dp[i] = a[i] } #include <iostream> #include <stdio.h> #include <stdlib.h> using namespac

[LeetCode系列]卡特兰数(Catalan Number) 在求解独特二叉搜寻树(Unique Binary Search Tree)中的应用分析

本文原题: LeetCode. 给定 n, 求解独特二叉搜寻树 (binary search trees) 的个数. 什么是二叉搜寻树? 二叉查找树(Binary Search Tree),或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值: 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值: 它的左.右子树也分别为二叉排序树. 举个栗子,给定 n = 3, 共有 5 个. 1 3 3 2 1 \ / / / \ 3 2 1 1

hdoj 1231 最大连续子列和

最大连续子序列 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 31021    Accepted Submission(s): 13922 Problem Description给定K个整数的序列{ N1, N2, ..., NK },其任意连续子序列可表示为{ Ni, Ni+1, ..., Nj },其中 1 <= i <= j &

最大连续子列和

#include <iostream> #include <string> #include <cstring> #include <cmath> #include <algorithm> #include <cstdio> using namespace std; #define N 20010 int a[N]; int main() { int n; while(cin>>n){ for(int i=0;i<n

LeetCode 最短无序连续子数组

题目链接:https://leetcode-cn.com/problems/shortest-unsorted-continuous-subarray/ 题目大意: 略. 分析: 如果排序区间为 [L, R], 那么 nums[L] 一定大于区间内的最小值,而 nums[R] 一定大于区间内的最大值, 按照这个特性分别求出左右端点即可. 代码如下: 1 const int inf = 0x7fffffff; 2 3 class Solution { 4 public: 5 int findUns

[LeetCode系列] 二叉树最大深度求解问题(C++递归解法)

问: 给定二叉树, 如何计算二叉树最大深度? 算法描述如下: 如果当前节点为空, 返回0(代表此节点下方最大节点数为0) 如果当前节点不为空, 返回(其左子树和右子树下方最大节点数中的最大值+1) 上述算法的精髓在于递归调用中的终止条件. 代码如下: 1 /** 2 * Definition for binary tree 3 * struct TreeNode { 4 * int val; 5 * TreeNode *left; 6 * TreeNode *right; 7 * TreeNod

[LeetCode系列]N皇后问题递归解法 -- 位操作方式

N皇后问题: 给定8*8棋盘, 放置n个皇后, 使其互相不能攻击(即2个皇后不能放在同一行/列/正反对角线上), 求解共有多少种放置方式? 这个问题的解答网上有不少, 但是位操作解法的我看到的不多. 下面贴出代码和图解, 也就不赘述了. 1 class Solution { 2 public: 3 /* 使用位操作实现的回溯算法. 按行扫描, 检测可以放置的列. 4 * 'limit' - 都是 '1'. 代表着所有列都被占据了 5 * 'h' - 是目前所有皇后列在行上的垂直投影. 如果 h=

[LeetCode系列]爬梯问题的递归解法转换为迭代解法

有一个n阶的梯子, 你每次只能爬1阶或2阶, 请问共有多少种登顶的爬法?(正好爬完n阶, 不能多也不能少) 本题最优解是直接套用菲波那切数列即可(因为菲波那切数列的第n个元素正好等于第n-1个元素和第n-2个元素的和, 与本题的要求完全相同). 递归解法: 1 int climbStairs(int n) { 2 if (n < 3) return n; 3 return climbStairs(n-1) + climbStairs(n-2); 4 } 思路很清晰, 递归到当前阶数小于3阶时返回

[LeetCode] Shortest Unsorted Continuous Subarray 最短无序连续子数组

Given an integer array, you need to find one continuous subarray that if you only sort this subarray in ascending order, then the whole array will be sorted in ascending order, too. You need to find the shortest such subarray and output its length. E