题目描述
给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
子数组 是数组中的一个连续部分。
示例 1:
输入:nums = [-2,1,-3,4,-1,2,1,-5,4]
输出:6
解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。
示例 2:
输入:nums = [1]
输出:1
示例 3:
输入:nums = [5,4,-1,7,8]
输出:23
提示:
- $1 <= nums.length <= 10^5$
- $-10^4 <= nums[i] <= 10^4$
进阶:如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的 分治法 求解。
解决方法
C++
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| class Solution { public: int maxSubArray(vector<int>& nums) { int n = nums.size(); if (n == 0) { return 0; } vector<int> dp(n, 0); dp[0] = nums[0]; for (int i = 1; i < n; ++i) { dp[i] = max(dp[i-1] + nums[i], nums[i]); } int maxSum = dp[0]; for (int i = 1; i < n; ++i) { maxSum = max(maxSum, dp[i]); } return maxSum; } };
|
结果
执行用时 : 80 ms, 击败 83.49% 使用 C++ 的用户
内存消耗 : 71.21 MB, 击败 6.83% 使用 C++ 的用户
Java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| class Solution { public int maxSubArray(int[] nums) { int n = nums.length; if (n == 0) { return 0; } int[] dp = new int[n]; dp[0] = nums[0]; for (int i = 1; i < n; ++i) { dp[i] = Math.max(dp[i-1] + nums[i], nums[i]); } int maxSum = dp[0]; for (int i = 1; i < n; ++i) { maxSum = Math.max(maxSum, dp[i]); } return maxSum; } }
|
结果
执行用时 : 2 ms, 击败 41.66% 使用 Java 的用户
内存消耗 : 56.18 MB, 击败 54.49% 使用 Java 的用户
Python
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| class Solution(object): def maxSubArray(self, nums): """ :type nums: List[int] :rtype: int """ n = len(nums) if n == 0: return 0 dp = [0] * n dp[0] = nums[0] for i in range(1, n): dp[i] = max(dp[i-1] + nums[i], nums[i]) maxSum = max(dp) return maxSum
|
结果
执行用时 : 113 ms, 击败 45.81% 使用 Python 的用户
内存消耗 : 23.09 MB, 击败 35.87% 使用 Python 的用户
Python3
1 2 3 4 5 6 7 8 9 10 11
| class Solution: def maxSubArray(self, nums: List[int]) -> int: n = len(nums) if n == 0: return 0 dp = [0] * n dp[0] = nums[0] for i in range(1, n): dp[i] = max(dp[i-1] + nums[i], nums[i]) maxSum = max(dp) return maxSum
|
结果
执行用时 : 125 ms, 击败 71.45% 使用 Python3 的用户
内存消耗 : 30.97 MB, 击败 57.69% 使用 Python3 的用户
C
1 2 3 4 5 6 7 8 9 10 11 12
| int maxSubArray(int* nums, int numsSize) { if (numsSize == 0) { return 0; } int maxSum = nums[0]; int currentSum = nums[0]; for (int i = 1; i < numsSize; ++i) { currentSum = (currentSum > 0) ? currentSum + nums[i] : nums[i]; maxSum = (currentSum > maxSum) ? currentSum : maxSum; } return maxSum; }
|
结果
执行用时 : 75 ms, 击败 98.24% 使用 C 的用户
内存消耗 : 11.72 MB, 击败 98.27% 使用 C 的用户
C#
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| public class Solution { public int MaxSubArray(int[] nums) { int n = nums.Length; if (n == 0) { return 0; } int maxSum = nums[0]; int currentSum = nums[0]; for (int i = 1; i < n; ++i) { currentSum = (currentSum > 0) ? currentSum + nums[i] : nums[i]; maxSum = (currentSum > maxSum) ? currentSum : maxSum; } return maxSum; } }
|
结果
执行用时 : 247 ms, 击败 16.12% 使用 C# 的用户
内存消耗 : 60.21 MB, 击败 5.16% 使用 C# 的用户
JavaScript
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
|
var maxSubArray = function(nums) { if (nums.length === 0) { return 0; } let maxSum = nums[0]; let currentSum = nums[0]; for (let i = 1; i < nums.length; ++i) { currentSum = (currentSum > 0) ? currentSum + nums[i] : nums[i]; maxSum = (currentSum > maxSum) ? currentSum : maxSum; } return maxSum; };
|
结果
执行用时 : 85 ms, 击败 36.15% 使用 JavaScript 的用户
内存消耗 : 57.37 MB, 击败 22.97% 使用 JavaScript 的用户
TypeScript
1 2 3 4 5 6 7 8 9 10 11 12 13
| function maxSubArray(nums: number[]): number { const n: number = nums.length; if (n === 0) { return 0; } let maxSum: number = nums[0]; let currentSum: number = nums[0]; for (let i = 1; i < n; ++i) { currentSum = (currentSum > 0) ? currentSum + nums[i] : nums[i]; maxSum = (currentSum > maxSum) ? currentSum : maxSum; } return maxSum; }
|
结果
执行用时 : 83 ms, 击败 66.83% 使用 TypeScript 的用户
内存消耗 : 59.46 MB, 击败 23.34% 使用 TypeScript 的用户
PHP
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| class Solution {
function maxSubArray($nums) { $n = count($nums); if ($n === 0) { return 0; } $maxSum = $nums[0]; $currentSum = $nums[0]; for ($i = 1; $i < $n; ++$i) { $currentSum = ($currentSum > 0) ? $currentSum + $nums[$i] : $nums[$i]; $maxSum = ($currentSum > $maxSum) ? $currentSum : $maxSum; } return $maxSum; } }
|
结果
执行用时 : 186 ms, 击败 92.16% 使用 PHP 的用户
内存消耗 : 27.15 MB, 击败 80.39% 使用 PHP 的用户
Swift
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| class Solution { func maxSubArray(_ nums: [Int]) -> Int { let n = nums.count if n == 0 { return 0 } var maxSum = nums[0] var currentSum = nums[0] for i in 1..<n { currentSum = (currentSum > 0) ? currentSum + nums[i] : nums[i] maxSum = max(currentSum, maxSum) } return maxSum } }
|
结果
执行用时 : 304 ms, 击败 89.96% 使用 Swift 的用户
内存消耗 : 19.52 MB, 击败 40.17% 使用 Swift 的用户
Kotlin
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| class Solution { fun maxSubArray(nums: IntArray): Int { val n = nums.size if (n == 0) { return 0 } var maxSum = nums[0] var currentSum = nums[0] for (i in 1 until n) { currentSum = if (currentSum > 0) currentSum + nums[i] else nums[i] maxSum = maxOf(currentSum, maxSum) } return maxSum } }
|
结果
执行用时 : 478 ms, 击败 27.67% 使用 Kotlin 的用户
内存消耗 : 58.28 MB, 击败 18.87% 使用 Kotlin 的用户
Dart
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| class Solution { int maxSubArray(List<int> nums) { int n = nums.length; if (n == 0) { return 0; } int maxSum = nums[0]; int currentSum = nums[0]; for (int i = 1; i < n; ++i) { currentSum = (currentSum > 0) ? currentSum + nums[i] : nums[i]; maxSum = (currentSum > maxSum) ? currentSum : maxSum; } return maxSum; } }
|
结果
执行用时 : 368 ms, 击败 42.86% 使用 Dart 的用户
内存消耗 : 175.44 MB, 击败 92.86% 使用 Dart 的用户
Go
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| func maxSubArray(nums []int) int { n := len(nums) if n == 0 { return 0 } maxSum := nums[0] currentSum := nums[0] for i := 1; i < n; i++ { if currentSum > 0 { currentSum += nums[i] } else { currentSum = nums[i] } maxSum = max(maxSum, currentSum) } return maxSum }
|
结果
执行用时 : 79 ms, 击败 83.53% 使用 Go 的用户
内存消耗 : 7.84 MB, 击败 82.57% 使用 Go 的用户
Ruby
1 2 3 4 5 6 7 8 9 10 11 12 13
|
def max_sub_array(nums) n = nums.length return 0 if n == 0 max_sum = nums[0] current_sum = nums[0] (1...n).each do |i| current_sum = current_sum > 0 ? current_sum + nums[i] : nums[i] max_sum = [max_sum, current_sum].max end max_sum end
|
结果
执行用时 : 120 ms, 击败 100.00% 使用 Ruby 的用户
内存消耗 : 214.20 MB, 击败 13.33% 使用 Ruby 的用户
Scala
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| object Solution { def maxSubArray(nums: Array[Int]): Int = { val n = nums.length if (n == 0) { return 0 } var maxSum = nums(0) var currentSum = nums(0) for (i <- 1 until n) { currentSum = if (currentSum > 0) currentSum + nums(i) else nums(i) maxSum = math.max(maxSum, currentSum) } maxSum } }
|
结果
执行用时 : 828 ms, 击败 30.77% 使用 Scala 的用户
内存消耗 : 74.23 MB, 击败 46.15% 使用 Scala 的用户
Rust
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| impl Solution { pub fn max_sub_array(nums: Vec<i32>) -> i32 { let n = nums.len(); if n == 0 { return 0; } let mut max_sum = nums[0]; let mut current_sum = nums[0]; for i in 1..n { current_sum = if current_sum > 0 { current_sum + nums[i] } else { nums[i] }; max_sum = max_sum.max(current_sum); } max_sum } }
|
结果
执行用时 : 9 ms, 击败 64.43% 使用 Rust 的用户
内存消耗 : 3.03 MB, 击败 98.04% 使用 Rust 的用户
Racket
暂时未解决
结果
执行用时 : ms, 击败 % 使用 Racket 的用户
内存消耗 : MB, 击败 % 使用 Racket 的用户
Erlang
暂时未解决
结果
执行用时 : ms, 击败 % 使用 Erlang 的用户
内存消耗 : MB, 击败 % 使用 Erlang 的用户
Elixir
暂时未解决
结果
执行用时 : ms, 击败 % 使用 Elixir 的用户
内存消耗 : MB, 击败 % 使用 Elixir 的用户