{"id":26772,"date":"2017-12-24T15:29:17","date_gmt":"2017-12-24T09:59:17","guid":{"rendered":"https:\/\/www.wikitechy.com\/technology\/?p=26772"},"modified":"2017-12-24T15:34:05","modified_gmt":"2017-12-24T10:04:05","slug":"c-programming-largest-sum-contiguous-subarray","status":"publish","type":"post","link":"https:\/\/www.wikitechy.com\/technology\/c-programming-largest-sum-contiguous-subarray\/","title":{"rendered":"C++ Programming &#8211; Largest Sum Contiguous Subarray"},"content":{"rendered":"<p>Write an efficient C++ program to find the sum of contiguous subarray within a one-dimensional array of numbers which has the largest sum.<\/p>\n<p><img fetchpriority=\"high\" decoding=\"async\" class=\"alignleft size-full wp-image-26804\" src=\"https:\/\/www.wikitechy.com\/technology\/wp-content\/uploads\/2017\/06\/kadane-Algorithm.png\" alt=\"kadane Algorithm\" width=\"564\" height=\"345\" srcset=\"https:\/\/www.wikitechy.com\/technology\/wp-content\/uploads\/2017\/06\/kadane-Algorithm.png 564w, https:\/\/www.wikitechy.com\/technology\/wp-content\/uploads\/2017\/06\/kadane-Algorithm-300x184.png 300w\" sizes=\"(max-width: 564px) 100vw, 564px\" \/><\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p><strong>Kadane\u2019s Algorithm:<\/strong><\/p>\n<pre>Initialize:\r\n    max_so_far = 0\r\n    max_ending_here = 0\r\n\r\nLoop for each element of the array\r\n  (a) max_ending_here = max_ending_here + a[i]\r\n  (b) if(max_ending_here &lt; 0)\r\n            max_ending_here = 0\r\n  (c) if(max_so_far &lt; max_ending_here)\r\n            max_so_far = max_ending_here\r\nreturn max_so_far\r\n<\/pre>\n[ad type=&#8221;banner&#8221;]\n<p><strong>Explanation:<\/strong><br \/>\nSimple idea of the Kadane&#8217;s algorithm is to look for all positive contiguous segments of the array (max_ending_here is used for this). And keep track of maximum sum contiguous segment among all positive segments (max_so_far is used for this). Each time we get a positive sum compare it with max_so_far and update max_so_far if it is greater than max_so_far<\/p>\n<pre>    Lets take the example:\r\n    {-2, -3, 4, -1, -2, 1, 5, -3}\r\n\r\n    max_so_far = max_ending_here = 0\r\n\r\n    for i=0,  a[0] =  -2\r\n    max_ending_here = max_ending_here + (-2)\r\n    Set max_ending_here = 0 because max_ending_here &lt; 0\r\n\r\n    for i=1,  a[1] =  -3\r\n    max_ending_here = max_ending_here + (-3)\r\n    Set max_ending_here = 0 because max_ending_here &lt; 0\r\n\r\n    for i=2,  a[2] =  4\r\n    max_ending_here = max_ending_here + (4)\r\n    max_ending_here = 4\r\n    max_so_far is updated to 4 because max_ending_here greater \r\n    than max_so_far which was 0 till now\r\n\r\n    for i=3,  a[3] =  -1\r\n    max_ending_here = max_ending_here + (-1)\r\n    max_ending_here = 3\r\n\r\n    for i=4,  a[4] =  -2\r\n    max_ending_here = max_ending_here + (-2)\r\n    max_ending_here = 1\r\n\r\n    for i=5,  a[5] =  1\r\n    max_ending_here = max_ending_here + (1)\r\n    max_ending_here = 2\r\n\r\n    for i=6,  a[6] =  5\r\n    max_ending_here = max_ending_here + (5)\r\n    max_ending_here = 7\r\n    max_so_far is updated to 7 because max_ending_here is \r\n    greater than max_so_far\r\n\r\n    for i=7,  a[7] =  -3\r\n    max_ending_here = max_ending_here + (-3)\r\n    max_ending_here = 4\r\n<\/pre>\n<p><strong>Program:<\/strong><\/p>\n<div class=\"responsive-tabs-wrapper\">\n<div class=\"responsive-tabs responsive-tabs--enabled\">\n<div id=\"tablist1-panel1\" class=\"tabcontent responsive-tabs__panel responsive-tabs__panel--active\">\n<div class=\"code-embed-wrapper\"> <div class=\"code-embed-infos\"> <span class=\"code-embed-name\">C++<\/span> <\/div> <pre class=\"language-cpp code-embed-pre line-numbers\"  data-start=\"1\" data-line-offset=\"0\"><code class=\"language-cpp code-embed-code\">\/\/ C++ program to print largest contiguous array sum<br\/>#include&lt;iostream&gt;<br\/>#include&lt;climits&gt;<br\/>using namespace std;<br\/> <br\/>int maxSubArraySum(int a[], int size)<br\/>{<br\/>    int max_so_far = INT_MIN, max_ending_here = 0;<br\/> <br\/>    for (int i = 0; i &lt; size; i++)<br\/>    {<br\/>        max_ending_here = max_ending_here + a[i];<br\/>        if (max_so_far &lt; max_ending_here)<br\/>            max_so_far = max_ending_here;<br\/> <br\/>        if (max_ending_here &lt; 0)<br\/>            max_ending_here = 0;<br\/>    }<br\/>    return max_so_far;<br\/>}<br\/> <br\/>\/*Driver program to test maxSubArraySum*\/<br\/>int main()<br\/>{<br\/>    int a[] = {-2, -3, 4, -1, -2, 1, 5, -3};<br\/>    int n = sizeof(a)\/sizeof(a[0]);<br\/>    int max_sum = maxSubArraySum(a, n);<br\/>    cout &lt;&lt; &quot;Maximum contiguous sum is &quot; &lt;&lt; max_sum;<br\/>    return 0;<br\/>}<\/code><\/pre> <\/div>\n<p><strong>Output :<\/strong><\/p>\n<pre>Maximum contiguous sum is 7<\/pre>\n[ad type=&#8221;banner&#8221;]\n<p>Above program can be optimized further, if we compare max_so_far with max_ending_here only if max_ending_here is greater than 0.<\/p>\n<div class=\"code-embed-wrapper\"> <div class=\"code-embed-infos\"> <span class=\"code-embed-name\">C++<\/span> <\/div> <pre class=\"language-cpp code-embed-pre line-numbers\"  data-start=\"1\" data-line-offset=\"0\"><code class=\"language-cpp code-embed-code\">int maxSubArraySum(int a[], int size)<br\/>{<br\/>   int max_so_far = 0, max_ending_here = 0;<br\/>   for (int i = 0; i &lt; size; i++)<br\/>   {<br\/>       max_ending_here = max_ending_here + a[i];<br\/>       if (max_ending_here &lt; 0)<br\/>           max_ending_here = 0;<br\/> <br\/>       \/* Do not compare for all elements. Compare only   <br\/>          when  max_ending_here &gt; 0 *\/<br\/>       else if (max_so_far &lt; max_ending_here)<br\/>           max_so_far = max_ending_here;<br\/>   }<br\/>   return max_so_far;<br\/>}<\/code><\/pre> <\/div>\n<p><strong>Time Complexity: <\/strong>O(n)<br \/>\n<strong>Algorithmic Paradigm: <\/strong>Dynamic Programming<\/p>\n<p>The implementation handles the case when all numbers in array are negative.<\/p>\n<div class=\"code-embed-wrapper\"> <div class=\"code-embed-infos\"> <span class=\"code-embed-name\">C++<\/span> <\/div> <pre class=\"language-cpp code-embed-pre line-numbers\"  data-start=\"1\" data-line-offset=\"0\"><code class=\"language-cpp code-embed-code\">#include&lt;iostream&gt;<br\/>using namespace std;<br\/> <br\/>int maxSubArraySum(int a[], int size)<br\/>{<br\/>   int max_so_far = a[0];<br\/>   int curr_max = a[0];<br\/> <br\/>   for (int i = 1; i &lt; size; i++)<br\/>   {<br\/>        curr_max = max(a[i], curr_max+a[i]);<br\/>        max_so_far = max(max_so_far, curr_max);<br\/>   }<br\/>   return max_so_far;<br\/>}<br\/> <br\/>\/* Driver program to test maxSubArraySum *\/<br\/>int main()<br\/>{<br\/>   int a[] =  {-2, -3, 4, -1, -2, 1, 5, -3};<br\/>   int n = sizeof(a)\/sizeof(a[0]);<br\/>   int max_sum = maxSubArraySum(a, n);<br\/>   cout &lt;&lt; &quot;Maximum contiguous sum is &quot; &lt;&lt; max_sum;<br\/>   return 0;<br\/>}<\/code><\/pre> <\/div>\n<p><strong>Output :<\/strong><\/p>\n<pre>Maximum contiguous sum is 7<\/pre>\n[ad type=&#8221;banner&#8221;]\n<p>To print the subarray with the maximum sum, we maintain indices whenever we get the maximum sum.<\/p>\n<div class=\"code-embed-wrapper\"> <div class=\"code-embed-infos\"> <span class=\"code-embed-name\">C++<\/span> <\/div> <pre class=\"language-cpp code-embed-pre line-numbers\"  data-start=\"1\" data-line-offset=\"0\"><code class=\"language-cpp code-embed-code\">\/\/ C++ program to print largest contiguous array sum<br\/>#include&lt;iostream&gt;<br\/>#include&lt;climits&gt;<br\/>using namespace std;<br\/> <br\/>int maxSubArraySum(int a[], int size)<br\/>{<br\/>    int max_so_far = INT_MIN, max_ending_here = 0,<br\/>       start =0, end = 0, s=0;<br\/> <br\/>    for (int i=0; i&lt; size; i++ )<br\/>    {<br\/>        max_ending_here += a[i];<br\/> <br\/>        if (max_so_far &lt; max_ending_here)<br\/>        {<br\/>            max_so_far = max_ending_here;<br\/>            start = s;<br\/>            end = i;<br\/>        }<br\/> <br\/>        if (max_ending_here &lt; 0)<br\/>        {<br\/>            max_ending_here = 0;<br\/>            s = i+1;<br\/>        }<br\/>    }<br\/>    cout &lt;&lt; &quot;Maximum contiguous sum is &quot;<br\/>        &lt;&lt; max_so_far &lt;&lt; endl;<br\/>    cout &lt;&lt; &quot;Starting index &quot;&lt;&lt; start<br\/>        &lt;&lt; endl &lt;&lt; &quot;Ending index &quot;&lt;&lt; end &lt;&lt; endl;<br\/>}<br\/> <br\/>\/*Driver program to test maxSubArraySum*\/<br\/>int main()<br\/>{<br\/>    int a[] = {-2, -3, 4, -1, -2, 1, 5, -3};<br\/>    int n = sizeof(a)\/sizeof(a[0]);<br\/>    int max_sum = maxSubArraySum(a, n);<br\/>    return 0;<br\/>}<\/code><\/pre> <\/div>\n<p><strong>Output :<\/strong><\/p>\n<pre>Maximum contiguous sum is 7\r\nStarting index 2\r\nEnding index 6<\/pre>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>C++ Programming &#8211; Largest Sum Contiguous Subarray &#8211; Dynamic Programming Write a program to find the sum of contiguous subarray within one-dimensional array<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[83515,1,70145],"tags":[79942,72845,72844,77101,79935,79940,79936,79929,79930,79938,77932,79933,79944,79943,72852,72855,79954,78229,72853,72851],"class_list":["post-26772","post","type-post","status-publish","format-standard","hentry","category-c-programming-3","category-coding","category-dynamic-programming","tag-contiguous-sequence","tag-definition-of-dynamic-programming","tag-dynamic-programming-software","tag-max-c","tag-max-subarray","tag-max-subarray-problem","tag-maximum-product-subarray","tag-maximum-subarray","tag-maximum-subarray-problem","tag-maximum-subarray-sum","tag-maximum-subsequence-sum","tag-maximum-sum-subarray","tag-non-contiguous","tag-php-array-sum","tag-problems-on-dynamic-programming","tag-simple-dynamic-programming-example","tag-sum-c","tag-sum-sum","tag-types-of-dynamic-programming","tag-youtube-dynamic-programming"],"_links":{"self":[{"href":"https:\/\/www.wikitechy.com\/technology\/wp-json\/wp\/v2\/posts\/26772","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.wikitechy.com\/technology\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.wikitechy.com\/technology\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.wikitechy.com\/technology\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.wikitechy.com\/technology\/wp-json\/wp\/v2\/comments?post=26772"}],"version-history":[{"count":0,"href":"https:\/\/www.wikitechy.com\/technology\/wp-json\/wp\/v2\/posts\/26772\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.wikitechy.com\/technology\/wp-json\/wp\/v2\/media?parent=26772"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.wikitechy.com\/technology\/wp-json\/wp\/v2\/categories?post=26772"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.wikitechy.com\/technology\/wp-json\/wp\/v2\/tags?post=26772"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}