leetcode 53. Maximum Subarray(分治,递归)

2024-05-15 02:38

本文主要是介绍leetcode 53. Maximum Subarray(分治,递归),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

找到中间位置,所求子串不是在中间位置的左边,就是右边,还有中间位置两边。中间位置左边右边的和最大的子串可以递归地求得,再求中间位置往左挨个加的最大和以及中间位置往右挨个数的最大和,这两个和就是子串跨越中间位置时的最大和;
这三个最大和中的最大值就是所求最大值。

这道题好像在剑指offer见过额

package leetcode53MaximumSubarray;import java.util.Arrays;public class Solution {public int maxSubArray(int[] nums) {int res=0,i;int len = nums.length;int middle = len/2;if(len == 2){if(nums[0]>=0&&nums[1]>=0)return nums[0]+nums[1];return nums[0]>nums[1]?nums[0]:nums[1];}if(len == 1){return nums[0];}int maxSubLeft,maxSubRight,maxSubMiddle;//System.out.println(0+middle-1);maxSubLeft = maxSubArray(Arrays.copyOfRange(nums, 0, middle));maxSubRight = maxSubArray(Arrays.copyOfRange(nums, middle,len ));int maxMiddleLeft = Integer.MIN_VALUE;int temp = 0;for(i=middle-1;i>=0;i--){temp+=nums[i];if(temp>maxMiddleLeft)maxMiddleLeft=temp;}int maxMiddleRight = Integer.MIN_VALUE;temp = 0;for(i=middle;i<=len-1;i++){temp+=nums[i];if(temp>maxMiddleRight)maxMiddleRight=temp;}int maxMiddle = maxMiddleLeft + maxMiddleRight;if(maxMiddle>=maxSubLeft && maxMiddle>=maxSubRight)res = maxMiddle;if(maxSubLeft>=maxMiddle && maxSubLeft>=maxSubRight)res = maxSubLeft;if(maxSubRight>=maxMiddle && maxSubRight>=maxSubLeft)res = maxSubRight;return res;}public static void main(String args[]){int[] nums = {1,2,-1};//int[] nums = {-2,1,-3};int res = new Solution().maxSubArray(nums);System.out.println(res);}
}


这篇关于leetcode 53. Maximum Subarray(分治,递归)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/990575

相关文章

mysql递归查询语法WITH RECURSIVE的使用

《mysql递归查询语法WITHRECURSIVE的使用》本文主要介绍了mysql递归查询语法WITHRECURSIVE的使用,WITHRECURSIVE用于执行递归查询,特别适合处理层级结构或递归... 目录基本语法结构:关键部分解析:递归查询的工作流程:示例:员工与经理的层级关系解释:示例:树形结构的数

SpringBoot项目中报错The field screenShot exceeds its maximum permitted size of 1048576 bytes.的问题及解决

《SpringBoot项目中报错ThefieldscreenShotexceedsitsmaximumpermittedsizeof1048576bytes.的问题及解决》这篇文章... 目录项目场景问题描述原因分析解决方案总结项目场景javascript提示:项目相关背景:项目场景:基于Spring

C语言函数递归实际应用举例详解

《C语言函数递归实际应用举例详解》程序调用自身的编程技巧称为递归,递归做为一种算法在程序设计语言中广泛应用,:本文主要介绍C语言函数递归实际应用举例的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录前言一、递归的概念与思想二、递归的限制条件 三、递归的实际应用举例(一)求 n 的阶乘(二)顺序打印

Jackson库进行JSON 序列化时遇到了无限递归(Infinite Recursion)的问题及解决方案

《Jackson库进行JSON序列化时遇到了无限递归(InfiniteRecursion)的问题及解决方案》使用Jackson库进行JSON序列化时遇到了无限递归(InfiniteRecursi... 目录解决方案‌1. 使用 @jsonIgnore 忽略一个方向的引用2. 使用 @JsonManagedR

Rust中的BoxT之堆上的数据与递归类型详解

《Rust中的BoxT之堆上的数据与递归类型详解》本文介绍了Rust中的BoxT类型,包括其在堆与栈之间的内存分配,性能优势,以及如何利用BoxT来实现递归类型和处理大小未知类型,通过BoxT,Rus... 目录1. Box<T> 的基础知识1.1 堆与栈的分工1.2 性能优势2.1 递归类型的问题2.2

哈希leetcode-1

目录 1前言 2.例题  2.1两数之和 2.2判断是否互为字符重排 2.3存在重复元素1 2.4存在重复元素2 2.5字母异位词分组 1前言 哈希表主要是适合于快速查找某个元素(O(1)) 当我们要频繁的查找某个元素,第一哈希表O(1),第二,二分O(log n) 一般可以分为语言自带的容器哈希和用数组模拟的简易哈希。 最简单的比如数组模拟字符存储,只要开26个c

Codeforces Round #240 (Div. 2) E分治算法探究1

Codeforces Round #240 (Div. 2) E  http://codeforces.com/contest/415/problem/E 2^n个数,每次操作将其分成2^q份,对于每一份内部的数进行翻转(逆序),每次操作完后输出操作后新序列的逆序对数。 图一:  划分子问题。 图二: 分而治之,=>  合并 。 图三: 回溯:

leetcode-24Swap Nodes in Pairs

带头结点。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/public class Solution {public ListNode swapPairs(L

leetcode-23Merge k Sorted Lists

带头结点。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/public class Solution {public ListNode mergeKLists

C++ | Leetcode C++题解之第393题UTF-8编码验证

题目: 题解: class Solution {public:static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num &