918. Maximum Sum Circular Subarray
Tags:
Medium
Skills:
Kadane's algorithm
June 24, 2025
04:32 AM
No headings found
Loading content...
Related Posts
Leetcode
No headings found
Related Posts
Leetcode
Problem
Bài toán yêu càu tìm tổng lớn nhất của đoạn con liên tiếp (subarray) trong mảng số nguyên. Trong đó mảng là “vòng tròn” (circular), tức là có thể nối phần cuối với phần đàu để tạo thành đoạn liên tiếp
Approach
Có hai tường hợp chính
Nếu tất cả các phần tử đều âm, đáp án là phần tử lớn nhất (không nên lấy tổng cả mảng trừ đi tổng nhỏ nhất vì sẽ ra 0)
Các bước giải
Solution
1function maxSubarraySumCircular(nums: number[]): number {
2 let curr_max =nums[0], global_max = nums[0];
3 let curr_min = nums[0], global_min = nums[0];
4 let total_sum = nums[0]
5 for(let i =1; i< nums.length; i++ ){
6 const value =nums[i];
7 curr_max = Math.max(curr_max + value, value)
8 global_max = Math.max(global_max, curr_max)
9
10 curr_min = Math.min(curr_min + value, value)
11 global_min = Math.min(global_min, curr_min)
12
13 total_sum += value
14 }
15 if(global_max < 0) reutrn global_max
16 return Math.max(global_max, total_sum - global_min)
17};total_sum - global_min (tổng toàn mảng trừ đi tổng nhỏ nhất của một đoạn con liên tiếp) chính là tổng lớn nhất khi chọn đoạn con “quấn vòng” trong mảng circular