Skip to content

Commit ee9962f

Browse files
committed
New Problem Solution - "Maximum Absolute Sum of Any Subarray"
1 parent 36da317 commit ee9962f

File tree

2 files changed

+97
-0
lines changed

2 files changed

+97
-0
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ LeetCode
1212
|1754|[Largest Merge Of Two Strings](https://leetcode.com/problems/largest-merge-of-two-strings/) | [C++](./algorithms/cpp/largestMergeOfTwoStrings/LargestMergeOfTwoStrings.cpp)|Medium|
1313
|1753|[Maximum Score From Removing Stones](https://leetcode.com/problems/maximum-score-from-removing-stones/) | [C++](./algorithms/cpp/maximumScoreFromRemovingStones/MaximumScoreFromRemovingStones.cpp)|Medium|
1414
|1752|[Check if Array Is Sorted and Rotated](https://leetcode.com/problems/check-if-array-is-sorted-and-rotated/) | [C++](./algorithms/cpp/checkIfArrayIsSortedAndRotated/CheckIfArrayIsSortedAndRotated.cpp)|Easy|
15+
|1749|[Maximum Absolute Sum of Any Subarray](https://leetcode.com/problems/maximum-absolute-sum-of-any-subarray/) | [C++](./algorithms/cpp/maximumAbsoluteSumOfAnySubarray/MaximumAbsoluteSumOfAnySubarray.cpp)|Medium|
1516
|1748|[Sum of Unique Elements](https://leetcode.com/problems/sum-of-unique-elements/) | [C++](./algorithms/cpp/sumOfUniqueElements/SumOfUniqueElements.cpp)|Easy|
1617
|1605|[Find Valid Matrix Given Row and Column Sums](https://leetcode.com/problems/find-valid-matrix-given-row-and-column-sums/) | [C++](./algorithms/cpp/FindValidMatrixGivenRowAndColumnSums/FindValidMatrixGivenRowAndColumnSums.cpp)|Medium|
1718
|1573|[Number of Ways to Split a String](https://leetcode.com/problems/number-of-ways-to-split-a-string/) | [C++](./algorithms/cpp/NumberOfWaysToSplitString/NumberOfWaysToSplitString.cpp)|Medium|
Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
// Source : https://leetcode.com/problems/maximum-absolute-sum-of-any-subarray/
2+
// Author : Hao Chen
3+
// Date : 2021-02-12
4+
5+
/*****************************************************************************************************
6+
*
7+
* You are given an integer array nums. The absolute sum of a subarray [numsl, numsl+1, ..., numsr-1,
8+
* numsr] is abs(numsl + numsl+1 + ... + numsr-1 + numsr).
9+
*
10+
* Return the maximum absolute sum of any (possibly empty) subarray of nums.
11+
*
12+
* Note that abs(x) is defined as follows:
13+
*
14+
* If x is a negative integer, then abs(x) = -x.
15+
* If x is a non-negative integer, then abs(x) = x.
16+
*
17+
* Example 1:
18+
*
19+
* Input: nums = [1,-3,2,3,-4]
20+
* Output: 5
21+
* Explanation: The subarray [2,3] has absolute sum = abs(2+3) = abs(5) = 5.
22+
*
23+
* Example 2:
24+
*
25+
* Input: nums = [2,-5,1,-4,3,-2]
26+
* Output: 8
27+
* Explanation: The subarray [-5,1,-4] has absolute sum = abs(-5+1-4) = abs(-8) = 8.
28+
*
29+
* Constraints:
30+
*
31+
* 1 <= nums.length <= 105
32+
* -104 <= nums[i] <= 104
33+
******************************************************************************************************/
34+
35+
class Solution {
36+
public:
37+
int maxAbsoluteSum(vector<int>& nums) {
38+
return maxAbsoluteSum02(nums); //56ms
39+
return maxAbsoluteSum01(nums); //56ms
40+
}
41+
42+
43+
44+
int maxAbsoluteSum01(vector<int>& nums) {
45+
return std::max(maxSumArray(nums), std::abs(minSumArray(nums)) );
46+
}
47+
48+
//https://en.wikipedia.org/wiki/Maximum_subarray_problem
49+
int maxSumArray(vector<int>& nums) {
50+
int max = nums[0];
51+
int sum = nums[0];
52+
for (int i = 1; i < nums.size(); i++) {
53+
if (sum < 0 ) sum = nums[i];
54+
else sum += nums[i];
55+
if (max < sum) max = sum;
56+
}
57+
return max;
58+
}
59+
60+
int minSumArray(vector<int>& nums) {
61+
int min = nums[0];
62+
int sum = nums[0];
63+
for (int i = 1; i < nums.size(); i++) {
64+
if (sum > 0 ) sum = nums[i];
65+
else sum += nums[i];
66+
if (min > sum) min = sum;
67+
}
68+
return min;
69+
}
70+
71+
// Becasue maxSumArray() & minSumArray() are two similar,
72+
// we can merge them together to save one loop
73+
int maxAbsoluteSum02(vector<int>& nums) {
74+
int max = nums[0];
75+
int max_sum = nums[0];
76+
77+
int min = nums[0];
78+
int min_sum = nums[0];
79+
80+
for (int i = 1; i < nums.size(); i++) {
81+
82+
if (max_sum < 0 ) max_sum = nums[i];
83+
else max_sum += nums[i];
84+
if (max < max_sum) max = max_sum;
85+
86+
87+
if (min_sum > 0 ) min_sum = nums[i];
88+
else min_sum += nums[i];
89+
if (min > min_sum) min = min_sum;
90+
91+
}
92+
93+
return std::max(max, abs(min));
94+
}
95+
96+
};

0 commit comments

Comments
 (0)