<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[improve time complexity of algo find_continuous_subsequences]]></title><description><![CDATA[<p>Hi, i have an array (vector&lt;int&gt; = {-1, -3, 4, 5, -2, -4, 6}) and want to print all continuous subsequences in the array which sum of 0. im wondering how you can make it faster than my version, which is O(n^2)!?</p>
<p>the array:</p>
<pre><code>-1, -3, 4, 5, -2, -4, 6
</code></pre>
<p>the sequences which sum up to 0:</p>
<pre><code>sum(-1 -3 4) = 0
sum(6 -4 -2) = 0
sum(-3 4 5 -2 -4) = 0
</code></pre>
<p>my algo:</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;string&gt;
#include &lt;limits&gt;
#include &lt;vector&gt;
#include &lt;algorithm&gt;
using namespace std;

vector&lt;int&gt; add_numbers_in_range(vector&lt;int&gt; &amp;vec, int start, int end) {
	vector&lt;int&gt; v;

	for(int i = start; i &lt;= end; i++) {
		v.push_back(vec[i]);
	}	

	return v;
}

vector&lt;vector&lt;int&gt;&gt; find_continuous_subsequences(vector&lt;int&gt; &amp;vec, int sum) {
	pair&lt;int,int&gt; max_sum_range;
	int current_sum = 0;
	vector&lt;vector&lt;int&gt;&gt; v;

	for(int i = 0; i &lt; vec.size(); i++) {
		int current_sum = 0;

		for(int j = i; j &lt; vec.size(); j++) {
			current_sum += vec[j];

			if(current_sum == sum) {
				v.push_back(add_numbers_in_range(vec, i, j));
			}
		}
	}

	return v;
}

int main() {
	// your code goes here

	vector&lt;int&gt; vec = {-1, -3, 4, 5, -2, -4, 6};
	vector&lt;vector&lt;int&gt;&gt; nums = find_continuous_subsequences(vec, 0);

	for(int i = 0; i &lt; nums.size(); i++) {
		for(int j = 0; j &lt; nums[i].size(); j++) {
			cout &lt;&lt; nums[i][j] &lt;&lt; ' ';
		}
		cout &lt;&lt; '\n';
	}

	return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/322084/improve-time-complexity-of-algo-find_continuous_subsequences</link><generator>RSS for Node</generator><lastBuildDate>Sat, 18 Jul 2026 10:09:17 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/322084.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 05 Dec 2013 21:52:06 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to improve time complexity of algo find_continuous_subsequences on Thu, 05 Dec 2013 21:52:06 GMT]]></title><description><![CDATA[<p>Hi, i have an array (vector&lt;int&gt; = {-1, -3, 4, 5, -2, -4, 6}) and want to print all continuous subsequences in the array which sum of 0. im wondering how you can make it faster than my version, which is O(n^2)!?</p>
<p>the array:</p>
<pre><code>-1, -3, 4, 5, -2, -4, 6
</code></pre>
<p>the sequences which sum up to 0:</p>
<pre><code>sum(-1 -3 4) = 0
sum(6 -4 -2) = 0
sum(-3 4 5 -2 -4) = 0
</code></pre>
<p>my algo:</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;string&gt;
#include &lt;limits&gt;
#include &lt;vector&gt;
#include &lt;algorithm&gt;
using namespace std;

vector&lt;int&gt; add_numbers_in_range(vector&lt;int&gt; &amp;vec, int start, int end) {
	vector&lt;int&gt; v;

	for(int i = start; i &lt;= end; i++) {
		v.push_back(vec[i]);
	}	

	return v;
}

vector&lt;vector&lt;int&gt;&gt; find_continuous_subsequences(vector&lt;int&gt; &amp;vec, int sum) {
	pair&lt;int,int&gt; max_sum_range;
	int current_sum = 0;
	vector&lt;vector&lt;int&gt;&gt; v;

	for(int i = 0; i &lt; vec.size(); i++) {
		int current_sum = 0;

		for(int j = i; j &lt; vec.size(); j++) {
			current_sum += vec[j];

			if(current_sum == sum) {
				v.push_back(add_numbers_in_range(vec, i, j));
			}
		}
	}

	return v;
}

int main() {
	// your code goes here

	vector&lt;int&gt; vec = {-1, -3, 4, 5, -2, -4, 6};
	vector&lt;vector&lt;int&gt;&gt; nums = find_continuous_subsequences(vec, 0);

	for(int i = 0; i &lt; nums.size(); i++) {
		for(int j = 0; j &lt; nums[i].size(); j++) {
			cout &lt;&lt; nums[i][j] &lt;&lt; ' ';
		}
		cout &lt;&lt; '\n';
	}

	return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2370082</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2370082</guid><dc:creator><![CDATA[algoman1]]></dc:creator><pubDate>Thu, 05 Dec 2013 21:52:06 GMT</pubDate></item><item><title><![CDATA[Reply to improve time complexity of algo find_continuous_subsequences on Thu, 05 Dec 2013 22:41:46 GMT]]></title><description><![CDATA[<p>a little but:</p>
<pre><code>if(current_sum == sum) {
</code></pre>
<p>whould be:</p>
<pre><code>if(current_sum == sum &amp;&amp; j &gt; i) {
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2370097</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2370097</guid><dc:creator><![CDATA[algoman1]]></dc:creator><pubDate>Thu, 05 Dec 2013 22:41:46 GMT</pubDate></item><item><title><![CDATA[Reply to improve time complexity of algo find_continuous_subsequences on Thu, 05 Dec 2013 23:04:55 GMT]]></title><description><![CDATA[<p>O(n^2) is tight.</p>
<p>consider the string</p>
<pre><code>1 -1 1 -1 1 -1 1 -1 1 -1 1 -1
</code></pre>
<p>or even simpler</p>
<pre><code>0 0 0 0 0 0 0 ...
</code></pre>
<p>in both cases there are O(n^2) matches. Btw: as you create the concrete substring of all these substrings your algorithm is O(n^3). O(n^2) is only for the start/end indices of the range.</p>
<p>//edit if you expect a very low number of matches in a big string of numbers you might get better.</p>
<p>consider the running sum of all elements prefixed with 0:</p>
<pre><code>-1, -3, 4, 5, -2, -4, 6
</code></pre>
<p>=&gt;</p>
<pre><code>int sum[] ={0, -1, -4, 0, 5, 3, 1, 5}
</code></pre>
<p>than it holds:<br />
[i,j) is a range with sum 0 iff sum[i]==sum[j];</p>
<p>and finding equal elements is n log(n) using sorting.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2370101</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2370101</guid><dc:creator><![CDATA[otze]]></dc:creator><pubDate>Thu, 05 Dec 2013 23:04:55 GMT</pubDate></item><item><title><![CDATA[Reply to improve time complexity of algo find_continuous_subsequences on Fri, 06 Dec 2013 04:44:46 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/5202">@otze</a>: i see, whats your idea to improve it?</p>
<p>what is sum[i] and sum [j] ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2370110</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2370110</guid><dc:creator><![CDATA[algoman1]]></dc:creator><pubDate>Fri, 06 Dec 2013 04:44:46 GMT</pubDate></item><item><title><![CDATA[Reply to improve time complexity of algo find_continuous_subsequences on Fri, 06 Dec 2013 07:06:14 GMT]]></title><description><![CDATA[<p>otze schrieb:</p>
<blockquote>
<p>consider the running sum of all elements prefixed with 0:</p>
<pre><code>-1, -3, 4, 5, -2, -4, 6
</code></pre>
<p>=&gt;</p>
<pre><code>int sum[] ={0, -1, -4, 0, 5, 3, 1, 5}
</code></pre>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/2370120</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2370120</guid><dc:creator><![CDATA[otze]]></dc:creator><pubDate>Fri, 06 Dec 2013 07:06:14 GMT</pubDate></item><item><title><![CDATA[Reply to improve time complexity of algo find_continuous_subsequences on Fri, 06 Dec 2013 08:34:46 GMT]]></title><description><![CDATA[<p>you only have one 0 in your running sum besides the 0 at the start...so you only find 1 subsequence?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2370135</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2370135</guid><dc:creator><![CDATA[algoman1]]></dc:creator><pubDate>Fri, 06 Dec 2013 08:34:46 GMT</pubDate></item><item><title><![CDATA[Reply to improve time complexity of algo find_continuous_subsequences on Fri, 06 Dec 2013 09:10:24 GMT]]></title><description><![CDATA[<p>FTFY:</p>
<p>otze schrieb:</p>
<blockquote>
<p>int sum[] ={0, -1, -4, 0, 5, 3, <strong>-1</strong>, 5}</p>
</blockquote>
<p>algoman1 schrieb:</p>
<blockquote>
<p>you only have one 0 in your running sum besides the 0 at the start...so you only find 1 subsequence?</p>
</blockquote>
<p>Read carefully what he told you:</p>
<p>otze schrieb:</p>
<blockquote>
<p>than it holds:<br />
[i,j) is a range with sum 0 iff sum[i]==sum[j];</p>
</blockquote>
<p>You are looking for pairwise equal numbers, not only zero entries.</p>
<p>Example:<br />
-1, -3, 4, 5, -2, -4, 6<br />
=&gt; int sum[] ={0, -1, -4, 0, 5, 3, -1, 5}</p>
<p>Look at the pair of -1 with indices i=1 and j=6.<br />
Now it holds that the subsequence [1,6) = [1,5] sums up to zero.<br />
That is -3 + 4 + 5 -2 -4 = 0</p>
<p>Another example for the pair of 5s. i=4, j=7 -&gt; [4,6] sums up to zero: -2 -4 + 6 = 0</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2370144</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2370144</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Fri, 06 Dec 2013 09:10:24 GMT</pubDate></item><item><title><![CDATA[Reply to improve time complexity of algo find_continuous_subsequences on Fri, 06 Dec 2013 09:14:58 GMT]]></title><description><![CDATA[<p>that trick works for each input?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2370145</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2370145</guid><dc:creator><![CDATA[Algoman1]]></dc:creator><pubDate>Fri, 06 Dec 2013 09:14:58 GMT</pubDate></item><item><title><![CDATA[Reply to improve time complexity of algo find_continuous_subsequences on Fri, 06 Dec 2013 09:17:15 GMT]]></title><description><![CDATA[<p>Algoman1 schrieb:</p>
<blockquote>
<p>that trick works for each input?</p>
</blockquote>
<p>Yes</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2370146</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2370146</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Fri, 06 Dec 2013 09:17:15 GMT</pubDate></item></channel></rss>