最大和连续递增子数组
给定一个由 n 个不同正整数组成的数组。问题是在 O(n) 时间复杂度中找到连续递增子数组的最大和。
例子 :
Input : arr[] = {2, 1, 4, 7, 3, 6}
Output : 12
Contiguous Increasing subarray {1, 4, 7} = 12
Input : arr[] = {38, 7, 8, 10, 12}
Output : 38
一个简单的解决方案是生成所有子数组并计算它们的总和。最后返回总和最大的子数组。该解决方案的时间复杂度为 O(n 2 )。
一个有效的解决方案是基于所有元素都是积极的这一事实。所以我们考虑最长递增子数组并比较它们的总和。增加子数组不能重叠,所以我们的时间复杂度变成O(n)。
算法:
Let arr be the array of size n
Let result be the required sum
int largestSum(arr, n)
result = INT_MIN // Initialize result
i = 0
while i < n
// Find sum of longest increasing subarray
// starting with i
curr_sum = arr[i];
while i+1 < n && arr[i] < arr[i+1]
curr_sum += arr[i+1];
i++;
// If current sum is greater than current
// result.
if result < curr_sum
result = curr_sum;
i++;
return result
下面是上述算法的实现。
C++
// C++ implementation of largest sum
// contiguous increasing subarray
#include
using namespace std;
// Returns sum of longest
// increasing subarray.
int largestSum(int arr[], int n)
{
// Initialize result
int result = INT_MIN;
// Note that i is incremented
// by inner loop also, so overall
// time complexity is O(n)
for (int i = 0; i < n; i++)
{
// Find sum of longest
// increasing subarray
// starting from arr[i]
int curr_sum = arr[i];
while (i + 1 < n &&
arr[i + 1] > arr[i])
{
curr_sum += arr[i + 1];
i++;
}
// Update result if required
if (curr_sum > result)
result = curr_sum;
}
// required largest sum
return result;
}
// Driver Code
int main()
{
int arr[] = {1, 1, 4, 7, 3, 6};
int n = sizeof(arr) / sizeof(arr[0]);
cout << "Largest sum = "
<< largestSum(arr, n);
return 0;
}
Java
// Java implementation of largest sum
// contiguous increasing subarray
class GFG
{
// Returns sum of longest
// increasing subarray.
static int largestSum(int arr[], int n)
{
// Initialize result
int result = -9999999;
// Note that i is incremented
// by inner loop also, so overall
// time complexity is O(n)
for (int i = 0; i < n; i++)
{
// Find sum of longest
// increasing subarray
// starting from arr[i]
int curr_sum = arr[i];
while (i + 1 < n &&
arr[i + 1] > arr[i])
{
curr_sum += arr[i + 1];
i++;
}
// Update result if required
if (curr_sum > result)
result = curr_sum;
}
// required largest sum
return result;
}
// Driver Code
public static void main (String[] args)
{
int arr[] = {1, 1, 4, 7, 3, 6};
int n = arr.length;
System.out.println("Largest sum = " +
largestSum(arr, n));
}
}
Python3
# Python3 implementation of largest
# sum contiguous increasing subarray
# Returns sum of longest
# increasing subarray.
def largestSum(arr, n):
# Initialize result
result = -2147483648
# Note that i is incremented
# by inner loop also, so overall
# time complexity is O(n)
for i in range(n):
# Find sum of longest increasing
# subarray starting from arr[i]
curr_sum = arr[i]
while (i + 1 < n and
arr[i + 1] > arr[i]):
curr_sum += arr[i + 1]
i += 1
# Update result if required
if (curr_sum > result):
result = curr_sum
# required largest sum
return result
# Driver Code
arr = [1, 1, 4, 7, 3, 6]
n = len(arr)
print("Largest sum = ", largestSum(arr, n))
# This code is contributed by Anant Agarwal.
C#
// C# implementation of largest sum
// contiguous increasing subarray
using System;
class GFG
{
// Returns sum of longest
// increasing subarray.
static int largestSum(int []arr,
int n)
{
// Initialize result
int result = -9999999;
// Note that i is incremented by
// inner loop also, so overall
// time complexity is O(n)
for (int i = 0; i < n; i++)
{
// Find sum of longest increasing
// subarray starting from arr[i]
int curr_sum = arr[i];
while (i + 1 < n &&
arr[i + 1] > arr[i])
{
curr_sum += arr[i + 1];
i++;
}
// Update result if required
if (curr_sum > result)
result = curr_sum;
}
// required largest sum
return result;
}
// Driver code
public static void Main ()
{
int []arr = {1, 1, 4, 7, 3, 6};
int n = arr.Length;
Console.Write("Largest sum = " +
largestSum(arr, n));
}
}
// This code is contributed
// by Nitin Mittal.
PHP
$arr[$i])
{
$curr_sum += $arr[$i + 1];
$i++;
}
// Update result if required
if ($curr_sum > $result)
$result = $curr_sum;
}
// required largest sum
return $result;
}
// Driver Code
{
$arr = array(1, 1, 4, 7, 3, 6);
$n = sizeof($arr) / sizeof($arr[0]);
echo "Largest sum = " ,
largestSum($arr, $n);
return 0;
}
// This code is contributed by nitin mittal.
?>
Javascript
输出 :
Largest sum = 12