diff --git a/go/0918-maximum-sum-circular-subarray.go b/go/0918-maximum-sum-circular-subarray.go new file mode 100644 index 000000000..97385bd03 --- /dev/null +++ b/go/0918-maximum-sum-circular-subarray.go @@ -0,0 +1,40 @@ +package main + +func main() { + +} + +func maxSubarraySumCircular(nums []int) int { + globalMax, globalMin := nums[0], nums[0] + currentMax, currentMin := 0, 0 + total := 0 + + for _, num := range nums { + currentMax = max(num, currentMax+num) + currentMin = min(num, currentMin+num) + total += num + globalMax = max(globalMax, currentMax) + globalMin = min(globalMin, currentMin) + } + + if globalMax > 0 { + return max(globalMax, total-globalMin) + } else { + return globalMax + } + +} + +func max(a, b int) int { + if a > b { + return a + } + return b +} + +func min(a, b int) int { + if a < b { + return a + } + return b +} diff --git a/javascript/0918-maximum-sum-circular-subarray.js b/javascript/0918-maximum-sum-circular-subarray.js new file mode 100644 index 000000000..5b92c6fbd --- /dev/null +++ b/javascript/0918-maximum-sum-circular-subarray.js @@ -0,0 +1,19 @@ +/** + * @param {number[]} nums + * @return {number} + */ +var maxSubarraySumCircular = function (nums) { + let [globalMax, globalMin] = [nums[0], nums[0]]; + let [currentMax, currentMin] = [0, 0]; + let total = 0; + + for (num of nums) { + currentMax = Math.max(num, currentMax + num); + currentMin = Math.min(num, currentMin + num); + total += num; + globalMax = Math.max(globalMax, currentMax); + globalMin = Math.min(globalMin, currentMin); + } + + return globalMax > 0 ? Math.max(globalMax, total - globalMin) : globalMax; +}; diff --git a/rust/0918-maximum-sum-circular-subarray.rs b/rust/0918-maximum-sum-circular-subarray.rs new file mode 100644 index 000000000..e4109510b --- /dev/null +++ b/rust/0918-maximum-sum-circular-subarray.rs @@ -0,0 +1,21 @@ +impl Solution { + pub fn max_subarray_sum_circular(nums: Vec) -> i32 { + let (mut global_max, mut global_min) = (nums[0], nums[0]); + let (mut current_max, mut current_min) = (0, 0); + let mut total = 0; + + for num in nums { + current_max = i32::max(num, current_max + num); + current_min = i32::min(num, current_min + num); + total += num; + global_max = i32::max(global_max, current_max); + global_min = i32::min(global_min, current_min); + } + + if global_max > 0 { + return i32::max(global_max, total - global_min); + } else { + return global_max; + } + } +} \ No newline at end of file diff --git a/typescript/0918-maximum-sum-circular-subarray.ts b/typescript/0918-maximum-sum-circular-subarray.ts new file mode 100644 index 000000000..ff597be90 --- /dev/null +++ b/typescript/0918-maximum-sum-circular-subarray.ts @@ -0,0 +1,15 @@ +function maxSubarraySumCircular(nums: number[]): number { + let [globalMax, globalMin] = [nums[0], nums[0]]; + let [currentMax, currentMin] = [0, 0]; + let total = 0; + + for (let num of nums) { + currentMax = Math.max(num, currentMax + num); + currentMin = Math.min(num, currentMin + num); + total += num; + globalMax = Math.max(globalMax, currentMax); + globalMin = Math.min(globalMin, currentMin); + } + + return globalMax > 0 ? Math.max(globalMax, total - globalMin) : globalMax; +}