Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
6c0f738
Create maximum_circular_subarray.cpp
sumanbmondal Oct 12, 2022
52552e3
Delete maximum_circular_subarray.cpp
sumanbmondal Oct 12, 2022
c1f1888
Create maximum_circular_subarray.cpp
sumanbmondal Oct 12, 2022
6a2f1bc
Update maximum_circular_subarray.cpp
sumanbmondal Oct 13, 2022
a0a17ac
Merge branch 'master' into master
sumanbmondal Dec 30, 2022
e16f39b
updating DIRECTORY.md
Dec 30, 2022
4d8fb50
Update maximum_circular_subarray.cpp
sumanbmondal Dec 30, 2022
ed65ca0
Update maximum_circular_subarray.cpp
sumanbmondal Dec 30, 2022
988b2ad
Update maximum_circular_subarray.cpp
sumanbmondal Dec 30, 2022
ba15ee6
Update maximum_circular_subarray.cpp
sumanbmondal Dec 30, 2022
c2cddfe
Update maximum_circular_subarray.cpp
sumanbmondal Jan 1, 2023
f00e9b2
Update dynamic_programming/maximum_circular_subarray.cpp
sumanbmondal Jan 2, 2023
b3a9ac4
Update maximum_circular_subarray.cpp
sumanbmondal Jan 2, 2023
658fed4
Update dynamic_programming/maximum_circular_subarray.cpp
sumanbmondal Jan 2, 2023
441d678
Update dynamic_programming/maximum_circular_subarray.cpp
sumanbmondal Jan 2, 2023
696aa96
Update dynamic_programming/maximum_circular_subarray.cpp
sumanbmondal Jan 2, 2023
78643d8
Update dynamic_programming/maximum_circular_subarray.cpp
sumanbmondal Jan 2, 2023
b26f54d
Update dynamic_programming/maximum_circular_subarray.cpp
sumanbmondal Jan 2, 2023
e16efd8
Merge branch 'master' into master
sumanbmondal Jan 11, 2023
ddf6da4
Update dynamic_programming/maximum_circular_subarray.cpp
sumanbmondal Jan 18, 2023
3b8debe
Update maximum_circular_subarray.cpp
sumanbmondal Jan 18, 2023
d02d745
chore: apply suggestions from code review
Panquesito7 Jan 26, 2023
4398a81
Merge branch 'master' into master
sumanbmondal Feb 1, 2023
a8a2e48
Merge branch 'master' into master
sumanbmondal Feb 5, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions DIRECTORY.md
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,7 @@
* [Longest Increasing Subsequence (Nlogn)](https://github.com/TheAlgorithms/C-Plus-Plus/blob/HEAD/dynamic_programming/longest_increasing_subsequence_(nlogn).cpp)
* [Longest Palindromic Subsequence](https://github.com/TheAlgorithms/C-Plus-Plus/blob/HEAD/dynamic_programming/longest_palindromic_subsequence.cpp)
* [Matrix Chain Multiplication](https://github.com/TheAlgorithms/C-Plus-Plus/blob/HEAD/dynamic_programming/matrix_chain_multiplication.cpp)
* [Maximum Circular Subarray](https://github.com/TheAlgorithms/C-Plus-Plus/blob/HEAD/dynamic_programming/maximum_circular_subarray.cpp)
* [Minimum Edit Distance](https://github.com/TheAlgorithms/C-Plus-Plus/blob/HEAD/dynamic_programming/minimum_edit_distance.cpp)
* [Palindrome Partitioning](https://github.com/TheAlgorithms/C-Plus-Plus/blob/HEAD/dynamic_programming/palindrome_partitioning.cpp)
* [Partition Problem](https://github.com/TheAlgorithms/C-Plus-Plus/blob/HEAD/dynamic_programming/partition_problem.cpp)
Expand Down
90 changes: 90 additions & 0 deletions dynamic_programming/maximum_circular_subarray.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
/**
* @file
* @brief C++ program for maximum contiguous circular sum problem using [Kadane's Algorithm](https://en.wikipedia.org/wiki/Maximum_subarray_problem)
* @details
* The idea is to modify Kadane’s algorithm to find a minimum contiguous subarray sum and the maximum contiguous subarray sum,
* then check for the maximum value between the max_value and the value left after subtracting min_value from the total sum.
* For more information, check [Geeks For Geeks](https://www.geeksforgeeks.org/maximum-contiguous-circular-sum/) explanation page.
*/

#include <cassert> /// for assert
#include <iostream> /// for IO operations
#include <vector> /// for std::vector


/**
* @namespace dynamic_programming
* @brief Dynamic Programming algorithms
*/
namespace dynamic_programming {
/**
* @brief returns the maximum contiguous circular sum of an array
*
* @param arr is the array/vector
* @return int which is the maximum sum
*/
int maxCircularSum(std::vector<int>& arr)
{
// Edge Case
if (arr.size() == 1)
return arr[0];

// Sum variable which stores total sum of the array.
int sum = 0;
for (int i = 0; i < arr.size(); i++) {
sum += arr[i];
}

// Every variable stores first value of the array.
int current_max = arr[0], max_so_far = arr[0], current_min = arr[0], min_so_far = arr[0];

// Concept of Kadane's Algorithm
for (int i = 1; i < arr.size(); i++) {
// Kadane's Algorithm to find Maximum subarray sum.
current_max = std::max(current_max + arr[i], arr[i]);
max_so_far = std::max(max_so_far, current_max);

// Kadane's Algorithm to find Minimum subarray sum.
current_min = std::min(current_min + arr[i], arr[i]);
min_so_far = std::min(min_so_far, current_min);
}

if (min_so_far == sum)
return max_so_far;

// Return the maximum value
return std::max(max_so_far, sum - min_so_far);
}
} // namespace dynamic_programming

/**
* @brief Self-test implementation
* @returns void
*/
static void test() {
// Description of the test
// Input: arr[] = {8, -8, 9, -9, 10, -11, 12}
// Output: 22
// Explanation: Subarray 12, 8, -8, 9, -9, 10 gives the maximum sum, that is 22.

int n = 7; // size of the array
std::vector<int> arr = {8, -8, 9, -9, 10, -11, 12};
assert(dynamic_programming::maxCircularSum(arr) == 22); // this ensures that the algorithm works as expected

arr = {8, -8, 10, -9, 10, -11, 12};
assert(dynamic_programming::maxCircularSum(arr) == 23);

std::cout << "All tests have successfully passed!\n";
}


/**
* @brief Main function
* @param argc commandline argument count (ignored)
* @param argv commandline array of arguments (ignored)
* @returns 0 on exit
*/
int main(int argc, char *argv[]) {
test(); // run self-test implementations
return 0;
}