You are given an integer array nums
. You must perform exactly one operation where you can replace one element nums[i]
with nums[i] * nums[i]
.
Return the maximum possible subarray sum after exactly one operation. The subarray must be non-empty.
Example 1:
Input: nums = [2,-1,-4,-3] Output: 17 Explanation: You can perform the operation on index 2 (0-indexed) to make nums = [2,-1,16,-3]. Now, the maximum subarray sum is 2 + -1 + 16 = 17.
Example 2:
Input: nums = [1,-1,1,1,-1,-1,1] Output: 4 Explanation: You can perform the operation on index 1 (0-indexed) to make nums = [1,1,1,1,-1,-1,1]. Now, the maximum subarray sum is 1 + 1 + 1 + 1 = 4.
Constraints:
1 <= nums.length <= 105
-104 <= nums[i] <= 104
class Solution:
def maxSumAfterOperation(self, nums: List[int]) -> int:
f = g = 0
ans = -inf
for x in nums:
ff = max(f, 0) + x
gg = max(max(f, 0) + x * x, g + x)
f, g = ff, gg
ans = max(ans, f, g)
return ans
class Solution {
public int maxSumAfterOperation(int[] nums) {
int f = 0, g = 0;
int ans = Integer.MIN_VALUE;
for (int x : nums) {
int ff = Math.max(f, 0) + x;
int gg = Math.max(Math.max(f, 0) + x * x, g + x);
f = ff;
g = gg;
ans = Math.max(ans, Math.max(f, g));
}
return ans;
}
}
class Solution {
public:
int maxSumAfterOperation(vector<int>& nums) {
int f = 0, g = 0;
int ans = INT_MIN;
for (int x : nums) {
int ff = max(f, 0) + x;
int gg = max(max(f, 0) + x * x, g + x);
f = ff;
g = gg;
ans = max({ans, f, g});
}
return ans;
}
};
func maxSumAfterOperation(nums []int) int {
var f, g int
ans := -(1 << 30)
for _, x := range nums {
ff := max(f, 0) + x
gg := max(max(f, 0)+x*x, g+x)
f, g = ff, gg
ans = max(ans, max(f, g))
}
return ans
}
func max(a, b int) int {
if a > b {
return a
}
return b
}