tag:blogger.com,1999:blog-34182653341988799012024-03-14T04:17:09.608+05:30Coders StopProgramming Interview Questions.Aviralhttp://www.blogger.com/profile/11920144614598355124noreply@blogger.comBlogger44125tag:blogger.com,1999:blog-3418265334198879901.post-49928320328552731322015-06-28T12:57:00.000+05:302015-06-28T22:50:41.751+05:30Count the number of subsequence divisible by 6<div dir="ltr" style="text-align: left;" trbidi="on">
<span style="font-family: Georgia, Times New Roman, serif;">You are provided a string with only digits [0 - 9], your task is to count the number of subsequences of string divisible by 6.</span><br />
<span style="font-family: Georgia, Times New Roman, serif;"><br /></span>
<span style="font-family: Georgia, Times New Roman, serif;">For e.g. The given string is 1234566</span><br />
<span style="font-family: Georgia, Times New Roman, serif;">The subsequences divisible by 6 are 12, 24, 36, 6, 6, 66</span><br />
<span style="font-family: Georgia, Times New Roman, serif;">Hence the answer should be 6</span><br />
<span style="font-family: Georgia, Times New Roman, serif;"><br />
The most obvious approach which comes is to generate all the subsequences and do a divisibility check and return the count satisfying the condition.</span><br />
<span style="font-family: Georgia, Times New Roman, serif;">But it is too expensive and overall complexity is 2^n (where n is the size of the string)</span><br />
<span style="font-family: Georgia, Times New Roman, serif;"><br />
Can we make it better?</span><br />
<span style="font-family: Georgia, Times New Roman, serif;"><br /></span>
<br />
<a name='more'></a><span style="font-family: Georgia, Times New Roman, serif;"><br /></span>
<span style="font-family: Georgia, Times New Roman, serif;">Obviously the units places has to be even i.e among 2, 4, 6, 8, 0.</span><br />
<span style="font-family: Georgia, Times New Roman, serif;">So the questions boils down finding the number of subsequences divisible by 3 and units digits as even.</span><br />
<span style="font-family: Georgia, Times New Roman, serif;"><br />So how can we find the number of subsequences divisible by 3?</span><br />
<span style="font-family: Georgia, Times New Roman, serif;">Or when does the adding of a number at units place makes it divisible by 3 ?</span><br />
<div>
<span style="font-family: Georgia, Times New Roman, serif;"><br /></span></div>
<span style="font-family: Georgia, Times New Roman, serif;">Lets assume you have a subsequence in hand </span><br />
<span style="font-family: Georgia, Times New Roman, serif;">a(1) a(2) a(3) ... a(n) % 3 = x (0 <=x <= 2) </span><br />
<span style="font-family: Georgia, Times New Roman, serif;">so what if add another digit in front of it making it</span><br />
<span style="font-family: Georgia, Times New Roman, serif;">a(1) a(2) a(3) ... a(n) a(n + 1) % 3 = y (0 <= y <= 2)</span><br />
<span style="font-family: Georgia, Times New Roman, serif;">Now if you work out few examples we would get the following table</span><br />
<div dir="ltr" style="margin-left: 0pt;">
<span id="docs-internal-guid-2efa0969-38fe-b1da-740f-222d9b1d449f"></span><br />
<div dir="ltr" style="margin-left: 0pt;">
<span id="docs-internal-guid-2efa0969-38fe-b1da-740f-222d9b1d449f"><span id="docs-internal-guid-2efa0969-3908-47c4-9007-c8f56f7ee594"><br /></span></span>
<br />
<div dir="ltr" style="margin-left: 0pt;">
<table style="border-collapse: collapse; border: none; width: 624px;"><colgroup><col width="*"></col><col width="*"></col><col width="*"></col></colgroup><tbody>
<tr style="height: 0px;"><td style="border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: center;">
<span style="font-family: Arial; font-size: 14.6666666666667px; vertical-align: baseline; white-space: pre-wrap;">x</span></div>
</td><td style="border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: center;">
<span style="font-family: Georgia; font-size: 14.6666666666667px; vertical-align: baseline; white-space: pre-wrap;">a(</span><span style="font-family: Georgia; font-size: 14.6666666666667px; vertical-align: baseline; white-space: pre-wrap;">n+1)</span><span style="font-family: Georgia; font-size: 14.6666666666667px; vertical-align: baseline; white-space: pre-wrap;">% 3 </span></div>
</td><td style="border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: center;">
<span style="font-family: Georgia; font-size: 14.6666666666667px; vertical-align: baseline; white-space: pre-wrap;">y</span></div>
</td></tr>
<tr style="height: 0px;"><td style="border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: center;">
<span style="font-family: Arial; font-size: 14.6666666666667px; vertical-align: baseline; white-space: pre-wrap;">0</span></div>
</td><td style="border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: center;">
<span style="font-family: Arial; font-size: 14.6666666666667px; vertical-align: baseline; white-space: pre-wrap;">0</span></div>
</td><td style="border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: center;">
<span style="font-family: Arial; font-size: 14.6666666666667px; vertical-align: baseline; white-space: pre-wrap;">0</span></div>
</td></tr>
<tr style="height: 0px;"><td style="border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: center;">
<span style="font-family: Arial; font-size: 14.6666666666667px; vertical-align: baseline; white-space: pre-wrap;">0</span></div>
</td><td style="border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: center;">
<span style="font-family: Arial; font-size: 14.6666666666667px; vertical-align: baseline; white-space: pre-wrap;">1</span></div>
</td><td style="border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: center;">
<span style="font-family: Arial; font-size: 14.6666666666667px; vertical-align: baseline; white-space: pre-wrap;">1</span></div>
</td></tr>
<tr style="height: 0px;"><td style="border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: center;">
<span style="font-family: Arial; font-size: 14.6666666666667px; vertical-align: baseline; white-space: pre-wrap;">0</span></div>
</td><td style="border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: center;">
<span style="font-family: Arial; font-size: 14.6666666666667px; vertical-align: baseline; white-space: pre-wrap;">2</span></div>
</td><td style="border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: center;">
<span style="font-family: Arial; font-size: 14.6666666666667px; vertical-align: baseline; white-space: pre-wrap;">2</span></div>
</td></tr>
<tr style="height: 0px;"><td style="border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: center;">
<span style="font-family: Arial; font-size: 14.6666666666667px; vertical-align: baseline; white-space: pre-wrap;">1</span></div>
</td><td style="border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: center;">
<span style="font-family: Arial; font-size: 14.6666666666667px; vertical-align: baseline; white-space: pre-wrap;">0</span></div>
</td><td style="border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: center;">
<span style="font-family: Arial;"><span style="font-size: 14.6666669845581px; line-height: 17.6000003814697px; white-space: pre-wrap;">1</span></span></div>
</td></tr>
<tr style="height: 0px;"><td style="border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: center;">
<span style="font-family: Arial; font-size: 14.6666666666667px; vertical-align: baseline; white-space: pre-wrap;">1</span></div>
</td><td style="border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: center;">
<span style="font-family: Arial; font-size: 14.6666666666667px; vertical-align: baseline; white-space: pre-wrap;">1</span></div>
</td><td style="border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: center;">
<span style="font-family: Arial;"><span style="font-size: 14.6666669845581px; line-height: 17.6000003814697px; white-space: pre-wrap;">2</span></span></div>
</td></tr>
<tr style="height: 0px;"><td style="border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: center;">
<span style="font-family: Arial; font-size: 14.6666666666667px; vertical-align: baseline; white-space: pre-wrap;">1</span></div>
</td><td style="border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: center;">
<span style="font-family: Arial; font-size: 14.6666666666667px; vertical-align: baseline; white-space: pre-wrap;">2</span></div>
</td><td style="border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: center;">
<span style="font-family: Arial; font-size: 14.6666666666667px; vertical-align: baseline; white-space: pre-wrap;">0</span></div>
</td></tr>
<tr style="height: 0px;"><td style="border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: center;">
<span style="font-family: Arial; font-size: 14.6666666666667px; vertical-align: baseline; white-space: pre-wrap;">2</span></div>
</td><td style="border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: center;">
<span style="font-family: Arial; font-size: 14.6666666666667px; vertical-align: baseline; white-space: pre-wrap;">0</span></div>
</td><td style="border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: center;">
<span style="font-family: Arial;"><span style="font-size: 14.6666669845581px; line-height: 17.6000003814697px; white-space: pre-wrap;">2</span></span></div>
</td></tr>
<tr style="height: 0px;"><td style="border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: center;">
<span style="font-family: Arial; font-size: 14.6666666666667px; vertical-align: baseline; white-space: pre-wrap;">2</span></div>
</td><td style="border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: center;">
<span style="font-family: Arial; font-size: 14.6666666666667px; vertical-align: baseline; white-space: pre-wrap;">1</span></div>
</td><td style="border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: center;">
<span style="font-family: Arial; font-size: 14.6666666666667px; vertical-align: baseline; white-space: pre-wrap;">0</span></div>
</td></tr>
<tr style="height: 0px;"><td style="border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: center;">
<span style="font-family: Arial; font-size: 14.6666666666667px; vertical-align: baseline; white-space: pre-wrap;">2</span></div>
</td><td style="border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: center;">
<span style="font-family: Arial; font-size: 14.6666666666667px; vertical-align: baseline; white-space: pre-wrap;">2</span></div>
</td><td style="border-bottom: solid #000000 1px; border-left: solid #000000 1px; border-right: solid #000000 1px; border-top: solid #000000 1px; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: center;">
<span style="font-family: Arial;"><span style="font-size: 14.6666669845581px; line-height: 17.6000003814697px; white-space: pre-wrap;">1</span></span></div>
</td></tr>
</tbody></table>
</div>
<span id="docs-internal-guid-2efa0969-38fe-b1da-740f-222d9b1d449f"><span id="docs-internal-guid-2efa0969-3908-47c4-9007-c8f56f7ee594">
</span></span></div>
<span id="docs-internal-guid-2efa0969-38fe-b1da-740f-222d9b1d449f">
</span></div>
<span style="font-family: Georgia, Times New Roman, serif;"><br /></span>
<span style="font-family: Georgia, Times New Roman, serif;">So by looking at the following table we can easily work out the code</span><br />
<span style="font-family: Georgia, 'Times New Roman', serif;"><br /></span>
<br />
<br />
<div>
<pre class="brush: cpp;">#define MOD 1000000007
long long count(char * s) {
long long len = strlen (s);
long long ones = 0, twos = 0, threes = 0, ans = 0, t_ones, t_twos, t_threes, sum = 0;
for (int i = 0; i < len; i++) {
int rm = (s[i] - '0') % 3;
switch (rm) {
case 0:
t_ones = (ones + ones) % MOD;
t_twos = (twos + twos) % MOD;
t_threes = (threes + threes) % MOD;
sum = threes + 1;
ones = t_ones, twos = t_twos, threes = t_threes;
threes++;
break;
case 1:
t_ones = (ones + threes) % MOD;
t_twos = (twos + ones) % MOD;
t_threes = (threes + twos) % MOD;
sum = twos;
ones = t_ones, twos = t_twos, threes = t_threes;
ones++;
break;
case 2:
t_ones = (ones + twos) % MOD;
t_twos = (twos + threes) % MOD;
t_threes = (threes + ones) % MOD;
sum = ones;
ones = t_ones, twos = t_twos, threes = t_threes;
twos++;
break;
}
if ((s[i] - '0') % 2 == 0)
ans = (ans + sum) % MOD;
}
return ans;
}
</pre>
<span style="font-family: Georgia, Times New Roman, serif;">Overall complexity of the algorithm is O(n)</span></div>
</div>
Aviralhttp://www.blogger.com/profile/11920144614598355124noreply@blogger.com14tag:blogger.com,1999:blog-3418265334198879901.post-61662494859456691382015-03-13T02:37:00.001+05:302015-03-21T12:46:45.025+05:30Searching words in a dictionary [Tries]<div dir="ltr" style="text-align: left;" trbidi="on">
<span style="font-family: Trebuchet MS, sans-serif;">Given a dictionary, on which the below operations are required </span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">1. Update the dictionary</span><br />
<span style="font-family: Trebuchet MS, sans-serif;">2. Find a word in a dictionary.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">What are the possible options?</span><br />
<span style="font-family: Trebuchet MS, sans-serif;">One of the most intuitive approach is to store the strings in a sorted manner.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;">Lets have a look at the complexity of the operations</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"></span><br />
<a name='more'></a><span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">If average length of the string in the dictionary is m and the number of entries in dictionary is n,</span><br />
<span style="font-family: Trebuchet MS, sans-serif;">To build the sorted set of entries is O(m * n * log n)</span><br />
<span style="font-family: Trebuchet MS, sans-serif;">and the complexity to find a word will be O(m * logn)</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">For large number of queries the algorithm is pathetically slow. </span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">How can we improve this?</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">Can we have a deterministic algorithm, with the maximum complexity being dependent on the number of characters in the word and not on the number of entries.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">Lets try to visualize how we search in the dictionary for a particular word.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;">Assuming the word to searched is 'program'</span><br />
<span style="font-family: Trebuchet MS, sans-serif;">We first search if the word exist p, then inside p if r exists and so on...</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">So irrespective of the thickness of the dictionary we just searched based on some predefined marking of the characters which helps to search in the order of the length of the string.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">Can we use the same concept in the programming?</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">If we build a tree of which each node has 26 child, each representing one of the characters, then we can uniquely identify each of the string starting from the root and following each of the characters.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;">The below figure speaks more than the thousand words,</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://i.stack.imgur.com/f9Q3u.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://i.stack.imgur.com/f9Q3u.jpg" height="147" width="320" /></a></div>
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">Dont fall into the trap that only leaf nodes are the terminal nodes, infact each node can act as a terminal node.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">So essentially the complexity to add a word or to query a word takes O(m), where m is the length of the string and is independent on the number of entries in the set!</span></div>
Aviralhttp://www.blogger.com/profile/11920144614598355124noreply@blogger.com0tag:blogger.com,1999:blog-3418265334198879901.post-24191608269098239842015-03-12T23:20:00.001+05:302015-04-08T09:58:48.215+05:30[Flipkart Interview] Compress the string<div dir="ltr" style="text-align: left;" trbidi="on">
<span style="font-family: Trebuchet MS, sans-serif;">Given a string you are provided with the possible operations.<br />We can group the adjacent substrings, for e.g ABCABCBC can be compressed as <br />2ABC1BC or 1ABCA2BC<br /><br />Among all the possible options, task is to find the resultant string with the minimum length.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">In case if there are multiple solutions return the lexicographically smallest string.<br />So for the above example the solution would be 2ABC1BC<br /><br />Another example would be<br />FLFLAFLAFLAF<br />Solution: 1FLF3LAF</span><br />
<div>
<span style="font-family: Trebuchet MS, sans-serif;"></span><br />
<a name='more'></a><span style="font-family: Trebuchet MS, sans-serif;"><br /></span></div>
<div>
<span style="font-family: Trebuchet MS, sans-serif;">Approach:<br /><br /><br />One obvious approach is to find all the possible compressions of the string and then find the one with the minimum length. <br /><br />So how do you achieve this? We need to find the repetitive substrings in sequence and perform it recursively. Well it is an awful exponential algorithm.<br /><br /><br />So how do we improve this ?</span></div>
</div>
Aviralhttp://www.blogger.com/profile/11920144614598355124noreply@blogger.com0tag:blogger.com,1999:blog-3418265334198879901.post-30291977036830574752014-03-02T20:48:00.000+05:302015-03-21T14:08:22.376+05:30Find the pivot element in the rotated sorted array<div dir="ltr" style="text-align: left;" trbidi="on">
<span style="font-family: "Trebuchet MS", sans-serif;">A sorted array is rotated around a pivot element. Find the pivot element in the rotated sorted array.</span><br />
<span style="font-family: "Trebuchet MS", sans-serif;"> </span><br />
<span style="font-family: "Trebuchet MS", sans-serif;"><b>Analysis</b> </span><br />
<span style="font-family: "Trebuchet MS",sans-serif;"><br /></span>
<span style="font-family: "Trebuchet MS",sans-serif;">Lets start with an example</span><br />
<span style="font-family: "Trebuchet MS",sans-serif;">Original array: 2, 4, 6, 8, 9, 10, 12, 15</span><br />
<span style="font-family: "Trebuchet MS",sans-serif;">Rotated array: 10, 12, 15, 2, 4, 6, 8, 9</span><br />
<span style="font-family: "Trebuchet MS",sans-serif;">Output: 3</span><br />
<br />
<br />
<a name='more'></a><br />
<br />
<span style="font-family: "Trebuchet MS",sans-serif;">One important observation is that the pivot element lies between two elements i, j iff i > j and a[i] < a[j] </span><br />
<span style="font-family: "Trebuchet MS",sans-serif;">The ith element is the pivot element iff a[i-1] > a[i] < a[i+1]</span><br />
<span style="font-family: "Trebuchet MS",sans-serif;"><br /></span>
<span style="font-family: "Trebuchet MS",sans-serif;">With the above two observations we can modify the basic binary search technique to find the pivot element</span><br />
<span style="font-family: "Trebuchet MS",sans-serif;"><br /></span>
<span style="font-family: "Trebuchet MS",sans-serif;">Below piece of code returns the pivot element</span><br />
<br />
<pre class="brush: cpp;">int pivot(int * a, int len) {
int l = 0, r = len - 1;
if(a[l] < a[r])
return 0;
while (true) {
if(l == r) return l;
int m = (l + r)/2;
if(a[m] < a[m-1] && a[m] < a[m+1])
return m;
if (a[m] > a[r])
l = m + 1;
else r = m;
}
}</pre>
<br />
<pre> </pre>
</div>
Aviralhttp://www.blogger.com/profile/11920144614598355124noreply@blogger.com0tag:blogger.com,1999:blog-3418265334198879901.post-71584944289537909192014-02-23T00:34:00.000+05:302015-03-21T12:56:47.038+05:30Remove the duplicate elements in the string<div dir="ltr" style="text-align: left;" trbidi="on">
<span style="font-family: "Trebuchet MS",sans-serif;">Given a string, inplace remove the duplicate elements form the string.</span><br />
<span style="font-family: "Trebuchet MS",sans-serif;">For e.g. the given string is "codersstop is a programming blog"</span><br />
<span style="font-family: Georgia,"Times New Roman",serif;"><span style="font-family: "Trebuchet MS",sans-serif;">Result: "coderstp iagmnbl"</span></span><br />
<br />
<b>Approach:</b><br />
<span style="font-family: "Trebuchet MS",sans-serif;"><br /></span>
<span style="font-family: "Trebuchet MS",sans-serif;">Maintain a lookup table of the 256 entries to mark the occurrence of each of the characters, and only copy the elements which are occurring for the first time.</span><br />
<span style="font-family: "Trebuchet MS",sans-serif;">Below snippet of code removes the duplicate elements from the string </span><br />
<br />
<pre class="brush: cpp;">void removeDuplicate(char * s) {
char a[256] = {0}, c = 0;
int len = strlen(s);
for(int i = 0; i < len; i++) {
if(a[s[i]] == 0) s[c++] = s[i];
a[s[i]] = 1;
}
s[c] = '\0';
}</pre>
<br />
<span style="font-family: "Trebuchet MS",sans-serif;">Overall time complexity is O(n) and space complexity O(1)</span><br />
<code><br /></code></div>
Aviralhttp://www.blogger.com/profile/11920144614598355124noreply@blogger.com0tag:blogger.com,1999:blog-3418265334198879901.post-35053874747837654842014-02-03T00:37:00.005+05:302015-03-21T12:58:05.411+05:30Minimum distance between the two nodes of tree<div dir="ltr" style="text-align: left;" trbidi="on">
<span style="font-family: Georgia,"Times New Roman",serif;">Given a binary tree(not BST) and two nodes in the tree(not necessarily leaf nodes), find the minimum distance between them.</span><br />
<br />
<span style="font-family: Georgia,"Times New Roman",serif;"><b>Approach:</b></span><br />
<br />
<span style="font-family: Georgia,"Times New Roman",serif;">The minimum distance can be computed by first finding the LCA of the two nodes, and then finding the heights of the all the three nodes(2 nodes + 1 LCA) from the root. </span><br />
<span style="font-family: Georgia,"Times New Roman",serif;">(For finding the LCA in the binary tree refer to the <a href="http://coders-stop.blogspot.in/2013/10/lca-for-binary-tree.html" target="_blank">previous post</a></span><br />
<span style="font-family: Georgia,"Times New Roman",serif;"><span style="font-family: Georgia,"Times New Roman",serif;">and finding the height of the element in the binary tree is self explanatory.</span></span><span style="font-family: Georgia,"Times New Roman",serif;">)</span><br />
<span style="font-family: Georgia,"Times New Roman",serif;"><br /></span>
<span style="font-family: Georgia,"Times New Roman",serif;"></span><br />
<a name='more'></a><br />
<span style="font-family: Georgia,"Times New Roman",serif;"><br /></span>
<span style="font-family: Georgia,"Times New Roman",serif;">Then the total distance can be computed as</span><br />
<span style="font-family: Georgia,"Times New Roman",serif;"> height(root, p) + height(root, q) - 2 * height (root, r) + 1; </span><br />
<br />
<pre class="brush: cpp;">int lca(struct tree * root, struct tree * p, struct tree * q, struct tree *& res) {
if(root == NULL || res != NULL)
return 0;
int found = 0;
if(root == p || root == q)
found = 1;
found += lca(root->left, p, q, res);
found += lca(root->right, p, q, res);
if(res == NULL && found == 2)
res = root;
return found;
}
int height(struct tree * root, struct tree * p) {
if (root == NULL)
return -1;
if(root == p)
return 0;
int r = max(height(root->left, p), height(root->right, p));
return r >= 0 ? r + 1 : r;
}
int minDist(struct tree * root, struct tree * p, struct tree * q) {
struct tree * r = NULL;
lca(root, p, q, r);
if(r == NULL)
return -1;
cout<< r->data << endl;
return height(root, p) + height(root, q) - 2 * height (root, r) + 1;
}</pre>
<br />
<span style="font-family: Georgia,"Times New Roman",serif;"><span style="font-family: Georgia,"Times New Roman",serif;"> </span> </span></div>
Aviralhttp://www.blogger.com/profile/11920144614598355124noreply@blogger.com0tag:blogger.com,1999:blog-3418265334198879901.post-20581194921218249112013-10-19T21:37:00.002+05:302015-03-21T12:58:51.668+05:30LCA for a binary tree<div dir="ltr" style="text-align: left;" trbidi="on">
Given a binary tree(not a binary search tree) find the LCA of the 2 given nodes.<br />
<br />
The lowest common ancestor(LCA) for the nodes u and <i>v</i> is defined as the lowest node w in <i>tree </i> that has both u and v as the descendants (where a node can be a descendant of itself).<br />
<br />
Approach:<br />
<br />
Lets consider the below tree<br />
<br />
<img alt="" height="160" src="data:image/png;base64,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" width="320" /> <br />
<br />
<br />
LCA of node 30, 5 is 100<br />
LCA of node 15, 50 is 50<br />
and so on <br />
<br />
<br />
<a name='more'></a><br /><br />
<br />
Its easy to visualize that the bottom up approach is the way to go.<br />
Populate
from the bottom to up the number of nodes matched with the target nodes and the first level to find both the nodes is the required LCA.<br />
<br />
The short code snippet which finds the LCA of the two nodes is given below<br />
<br />
<pre class="brush: cpp;">int lca(struct tree * root, struct tree * p, struct tree * q, struct tree *& res) {
if(root == NULL || res != NULL)
return 0;
int found = 0;
if(root == p || root == q)
found = 1;
found += lca(root->left, p, q, res);
found += lca(root->right, p, q, res);
if(res == NULL && found == 2)
res = root;
return found;
}</pre>
</div>
Aviralhttp://www.blogger.com/profile/11920144614598355124noreply@blogger.com0tag:blogger.com,1999:blog-3418265334198879901.post-72439241398696347642013-10-16T17:26:00.000+05:302015-03-21T13:03:12.335+05:30A closer look at Coin Change<div dir="ltr" style="text-align: left;" trbidi="on">
<span style="font-family: Georgia,"Times New Roman",serif;">Coin change has been a very famous computing problem which can be easily solved by Dynamic programming.</span><br />
<span style="font-family: Georgia,"Times New Roman",serif;"><br /></span>
<span style="font-family: Georgia,"Times New Roman",serif;">So what is coin change ?</span><br />
<span style="font-family: Georgia,"Times New Roman",serif;">If we want to make change for <span class="texhtml" dir="ltr"><i>N</i></span> cents, and we have infinite supply of each of <img alt="S = \{ S_1, S_2, \ldots, S_m \}" class="tex" src="http://www.algorithmist.com/images/math/8/c/9/8c90ea93b0ca92b38ac1657ec0a9daf6.png" /> valued coins, how many ways can we make the change? (The order does not matter.)</span><br />
<span style="font-family: Georgia,"Times New Roman",serif;"><br /></span>
<span style="font-family: Georgia,"Times New Roman",serif;">For example, for <span class="texhtml" dir="ltr"><i>N</i> = 4,<i>S</i> = {1,2,3}</span>, there are 7 possible solutions: <span class="texhtml" dir="ltr">{1,1,1,1},{1,1,2}, {1, 2, 1}, {2, 1, 1}, {2,2},{1,3}, {3, 1}</span>.</span><br />
<span style="font-family: Georgia,"Times New Roman",serif;"><br /></span>
<span style="font-family: Georgia,"Times New Roman",serif;">So how to compute the number of ways efficiently?</span><br />
<span style="font-family: Georgia,"Times New Roman",serif;"><br /></span>
<span style="font-family: Georgia,"Times New Roman",serif;"></span><br />
<a name='more'></a><br />
<span style="font-family: Georgia,"Times New Roman",serif;"><br /></span><span style="font-family: Georgia,"Times New Roman",serif;">Lets assume you know the number of ways to generate the sum 1, 2, 3 , can you find the number of ways to generate 4?</span><br />
<span style="font-family: Georgia,"Times New Roman",serif;"><br /></span>
<span style="font-family: Georgia,"Times New Roman",serif;">Yes, you can, indeed you have just broken the problem into the subproblems, a basic paradigm of the dynamic programming.</span><br />
<br />
<span style="font-family: Georgia,"Times New Roman",serif;">Let assume F(n) denotes the number of solutions possible.</span><br />
<span style="font-family: Georgia,"Times New Roman",serif;">So F(4) = F(3) + F(2) + F(1)</span><br />
<span style="font-family: Georgia,"Times New Roman",serif;"><br /></span>
<span style="font-family: Georgia,"Times New Roman",serif;">In general if S[i] denotes the denominations of the coins then</span><br />
<br />
<span style="font-family: Georgia,"Times New Roman",serif;"><img alt="" height="58" src="data:image/png;base64,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" width="320" /> </span><br />
<span style="font-family: Georgia,"Times New Roman",serif;"><br /></span>
<span style="font-family: Georgia,"Times New Roman",serif;">The below piece of code generates the number of combinations for a particular sum.</span><br />
<pre class="brush: cpp;">int coin_change_infinite(int s[], int n, int val) {
int * a = (int *) calloc(1, sizeof(int) * (val + 1));
int res;
sort(s, s + n);
a[0] = 1;
for(int i = 1; i <= val; i++)
for(int j = 0; s[j] <= i && j < n; j++)
a[i] += a[i - s[j]];
res = a[val];
free(a);
return res;
}</pre>
<br />
<br />
Overall running time for the algorithm is O(n*c) (n is the value for which the denominations needs to be made and c is the types of denominations available.) and space complexity is O(n)</div>
Aviralhttp://www.blogger.com/profile/11920144614598355124noreply@blogger.com2tag:blogger.com,1999:blog-3418265334198879901.post-28156612431209217092013-07-05T01:10:00.003+05:302015-03-21T13:09:36.365+05:30Largest area in a Histogram<div dir="ltr" style="text-align: left;" trbidi="on">
<div dir="ltr" style="text-align: left;" trbidi="on">
<span style="font-family: inherit;">Find the maximum area of a rectangle that fits entirely in
the Histogram.</span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: inherit;">For e.g in the below histogram the maximum area of the rectangle is 2 * 80 = 160</span><br />
<div>
<br /></div>
<div>
</div>
<div>
</div>
<div>
</div>
<div>
</div>
<div>
</div>
<div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://www.blogger.com/blogger.g?blogID=3418265334198879901" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"></a><a href="http://www.blogger.com/blogger.g?blogID=3418265334198879901" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"></a><a href="http://www.blogger.com/blogger.g?blogID=3418265334198879901" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"></a><a href="http://www.blogger.com/blogger.g?blogID=3418265334198879901" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"></a><a href="http://1.bp.blogspot.com/-waD-p7aEH1o/UdXXP-fJpVI/AAAAAAAAAHM/TWdXhoKqzmc/s285/pic.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-waD-p7aEH1o/UdXXP-fJpVI/AAAAAAAAAHM/TWdXhoKqzmc/s285/pic.png" /></a></div>
<br />
<span style="font-family: inherit;">The length of each bar will be the input, and the width of each bar is same, 1</span></div>
<div>
<span style="font-family: inherit;">Approach:</span></div>
<div>
<span style="font-family: inherit;">The naive approach can be to select one histogram at a time, find the maximum area which can be formed with this, finally return the maximum value over all the histogram.</span></div>
<div>
<span style="font-family: inherit;">Time Complexity O(n^2), Space Complexity O(1)</span></div>
<div>
<span style="font-family: inherit;">Can we do better. Lets have a look if we are computing some of the results over and over or if any of the computations are unnecessary.</span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: inherit;"></span><br />
<a name='more'></a></div>
<div>
<span style="font-family: inherit;"><br /></span></div>
<div>
<span style="font-family: inherit;">Some of the key observations are:</span><br />
<span style="font-family: inherit;">The area of the </span>neighbouring<span style="font-family: inherit;"> groups is equal to (min height of the bar in group * width of the group)</span></div>
<div>
<span style="font-family: inherit;">This means that we need to calculate the area formed by each minimum bar encountered so far, calculating the max of all such areas will give us the desired result.</span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: inherit;">So if we have the bars in the order given as </span><br />
<span style="font-family: inherit;">9, 4, 10, 12, 16, 14, 8, 5, 1</span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: inherit;">So we need to calculate the area at the points, 4, 14, 8, 5, 1</span><br />
<span style="font-family: inherit;">for the ith bar which has the height h </span><br />
<span style="font-family: inherit;">max area = (h)*(number of </span>contiguous<span style="font-family: inherit;"> bar to the left and right which has height <= h)</span></div>
<div>
<span style="font-family: inherit;">and the max of this is 8*5 = 40 (which is the max area of the rectangle completely inside the histogram)</span></div>
<div>
<span style="font-family: inherit;"><br />So what is the data structure we can employ, </span><br />
<span style="font-family: inherit;">Stack seems to be an obvious choice since we are always concerned with the element just pushed(which is the top of the stack)</span><br />
<span style="font-family: inherit;">Below is the piece of code which calculates the max area</span></div>
<pre class="brush: cpp;">int maxArea(int a[], int n ) {
stack<int><int> s;
int max = 0;
for(int i = 0; i < n;i++) {
while(!s.empty() && (a[i] <= a[s.top()])) {
int h = s.top();
s.pop();
int l = s.empty() ? 0 : s.top() + 1;
int m = (i - l) * a[h];
if(m > max) max = m;
}
s.push(i);
}
while(!s.empty()) {
int h = s.top();
s.pop();
int l = s.empty() ? 0 : s.top() + 1;
int m = (n - l) * a[h];
if(m > max) max = m;
}
return max;
}</int></pre>
</div>
<br />
<span style="font-family: inherit;">Since every bar is inserted and removed only once, time complexity O(n).</span></div>
Aviralhttp://www.blogger.com/profile/11920144614598355124noreply@blogger.com1tag:blogger.com,1999:blog-3418265334198879901.post-35382986162302247022013-06-02T17:36:00.001+05:302015-03-21T13:10:44.357+05:30[Amazon Online test] Sort an array containing 0, 1 & 2<div dir="ltr" style="text-align: left;" trbidi="on">
<div dir="ltr" style="text-align: left;" trbidi="on">
Given that an array consists of only 0s 1s and 2s sort the array in one pass.<br />
<b><br /></b>
<b>Approach: </b><br />
<br />
Lets view the problem if the constraint of one pass wouldn't have been there<br />
Scan over the array and count the number of 0, 1, and 2.<br />
Now initialise the array with the 0, 1, 2 with the number of elements, the idea is similar to the counting sort.<br />
<br />
To solve the above problem in one pass we can use the famous Dutch national flag algorithm.<br />
The basic idea is to traverse over the array and keep track of the current 0s and 2s and the read pointers(initialised with -1, n and 0). Now traverse the array and keep swapping the current element in the respective buckets of interest.<br />
<br />
<br />
<a name='more'></a><br /><br />
The implementation is given by<br />
<br /></div>
<pre class="brush: cpp;">void sort(int a[], int n)
{
int zero = -1;
int two = n;
int current = 0;
while(current < two) {
switch(a[current]) {
case 0:
swap(&a[zero++], &a[current++]);
break;
case 1:
current++;
break;
case 2:
swap(&a[current], &a[two--]);
break;
}
}
}
</pre>
<br /></div>
Aviralhttp://www.blogger.com/profile/11920144614598355124noreply@blogger.com0tag:blogger.com,1999:blog-3418265334198879901.post-86224790603830196262013-06-02T10:29:00.001+05:302015-03-21T13:12:25.613+05:30[Expedia Interview] Intersection of two link list<div dir="ltr" style="text-align: left;" trbidi="on">
<span style="font-family: Trebuchet MS, sans-serif;">Given two link lists intersecting in the following manner </span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><img alt="" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAfQAAACGCAIAAACkKe+jAAAEaUlEQVR4nO3dy3KjWBRFQf7/p1UDOxRlG/G8wHlkTtutloC94gaTnl4AlDM9/QUAGE/cAQoSd4CCxB2gIHEHKEjcAQoSd4CCxB2gIHEHKEjcAQoSd4CCxB2gIHEHKEjcAQoSd4CCxB2gIHEHKEjcAQoSd4CCxB2goNBxn6ZpmkJ/Q4CY4qZz+unprwOQSehoTnOe/lIACURv5WzfJR5gWZpKSjzAdsn6KPEAW6Qso3c1AMtyB1HiAWZVSKHEA/xSJ4Le1QC8VWufxAO86sX9TeL5xTNAK8WfdQd5vrj7dNPiQZf4ztx3eur1oEt8K+41nXV83B3ky3Nzoe9DL/FVuafw6hz3N4kvw32EN0//N4lPzb2DX2zgB+9q0nGzYJYlzJP4FNwj+MQYlkh8WO4LLDOJdd7VhOJGwBaGsZXER+Diw0bmsZvEP8I1h10s5CAH+du4yHCAnZwi8ZdyYeEwaxlD4odzPeEMgxlJ4odwDeE8sxnPu5rDXDQYxXguJPHbuVAwlgldTuJXuT4wnBXdxLuaWS4IXMSWbiXxby4CXMqintE58W1/ONzJrp7U8CDf6sfCg0zreU0SX/4HQigGFkjVxJf8URCcmYVTLPFlfgjkYmxBFXhXk/rLQ3b2Fl3GxKf7wlCP1eWQJfEpviR0YHuZBH9XE/aLQUPml0/AxIf6MsBL3FMbm/hjnybrEJMppnfyIP/pX1/9NFmHyAyyiGOJ31j2v5+m7BCcTVYz9ty9q/hAHJZZ065z97FPk3WIzD4rG3jolnXIxUpbOFN2x3bIyEQb2dvo2T8Wd0jBRHvZ+Ipm4Z86vEMK9tnI7AF84Wz+KeLiDvHZZyMbD+mrZ3Nxh/jss5GFKIs7FGOfjRw4uXstA0nZZyN/o/yp48uJF3eIzz572X48X/5jcYfg7LOXA41WdsjIRBs5GWiJh0SMs4vzafZ+BhIxy/oWorwxzX//XuUhOGusbCG+G7u8+mcSDzHZYVmrwf10+l6w8b8l8fA4CyxoV2dPZn3LRw36WcAOhlfK4bCezPqWj9r7OcAZJldEwJhKPDzI2CqI3FAHeXiEjeWWJZoSDzezrqyShlLi4R52lU+BOEo8XM2ikqnURO9q4DqGlEbhCEo8DGdCCTQJn8TDQMYTWsPYeVcDQ9hMXJ0DJ/FwkrVEJGpvEg/H2EksQjbLQR72Mo9AlGuZxMN2hhGCYO0i8bDKJB4mUodJPCwwhscI0xDe1cAsG3iGGA0n8fA/T//dBOhSEg9fPPf3EZ3beFcDHvc7qMwj9J3OPOuX05fHuf405EG/kKyH4hbQimf9ErIOPEt0BpN1IALpGUnZgSDUZwxZB0LRoLNkHQhIiU5RdiAmMTpI1oHIJGk3WQfiE6YdZB3IQp62UnYgEYVaJ+tAOjq1RNaBpNRqnqwDqWnWDGUHspOtH2QdqEG8vsk6UImEvV7+Tz1AOd1D5sAOlNS3ZbIOFNa0aLIO1Naxa8oOlNc0bbIO1CZwAAWJO0BB/wDNbAcIrQKCIQAAAABJRU5ErkJggg==" /></span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;"> check whether the two list intersect or not, if it does find the point of intersection.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;"></span><br />
<a name='more'></a><span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<b><span style="font-family: Trebuchet MS, sans-serif;">Approach:</span></b><br />
<span style="font-family: Trebuchet MS, sans-serif;">First gotcha in the problem is that such a linked list cannot exist. Since it is a singly linked list hence a node cannot have 2 next pointers.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;">So the problem reduces to the Y shaped linked list.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><img alt="" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAfQAAAC9CAIAAADKlBjNAAAFJ0lEQVR4nO3a2W3CQABFUddFQa6HatwMxTgfJGEJhG1sz7w55ytBQrLA72pCGGYA4gxbXwAA5Yk7QCBxBwgk7gCBxB0gkLgDBBJ3gEDiDhBI3AECiTtAIHEHCCTuAIHEHSCQuAMEEneAQOIOEEjcAQKJO0AgcV/DMAzD4KUG1qM4ZR32u2PJx+nnoeHSllcHdENrijrsd8Ow2+3O6z7csemFAuEkpqTDfjcM43Q8vp/O7vMs8cC6xKWgafxu+q26/1B5YAWaUs40DsOw2x/mn7off75J4oFFqUkxZ21/ou4/VB5YgoiUMo03Ev1E3ed5lnigNPko5OLcPs8vnN0vqDxQhGoUcavk3195v/1v1f9JPPAhvajXvcSrPPCQTDRA4oFXCUQzJB54njS0R+WBhxShVRIP/EMLmqfywF8SEELigXPGn0blgVncU0k8dM7ak91LvMpDPCPvgsRDb8y7IxIP/TDsHqk8xLPnfkk8BLNkVB4CGTDfJB6SmC7XVB4CWCy3STw0zVZ5QOWhRSbKUyQe2mKcvOBe4lUeamOTvEPioXLWyPskHqplhxSg8lAb86MYiYd6GB7lqTxszt5YisTDhiyNxak8rM/AWInEw5pMi1XdS7zKQ1kWxTYkHhZlS2ypZOKn8fT83f5Q+lKpzPn77T2/QdypwoeVP+x3wzAM4/T7q6mnm8azol/dAMziTlXeTfzxEGfZXbmI++wm+EPcqdFrlTfrHl3H/Xh49xfbL3GnXk8m3p/kXbqO+98HOifuNOBB5Z3ce+Tk/oC404y7iXd079HNz9y1/UTcac+9yp/yPo1Wns63ZR4Qd1p1N/F0wPfcHxJ3GrZNV6jA1rdeA7xGNGnrtrCxrW/ABniNaIypwzOsgmbIOjzPNmiArMOrLISqyTq8x06olKzDJ6yF6sg6fM5mqIisQymWQxVkHcqyHzYm67AEK2Izsg7LsSU2IOuwNItiVbIO67Ar1iPrsBrrYg2yDiuzMZYl67AJS2Mpsg4bsjfKk3XYnNVRkqxDJWyPMmQdqmKBfErWoUJ2yPtkHapljbxD1qFyNslrZB2aYJk8S9ahIfbJY7IOzbFS/iPr0Chb5TZZh6ZZLNdkHQLYLSeyDjGsl3mWdYhjw72TdYhkyf2SdQhmzz2SdYhn1X2RdeiEbffib9aVHYKZdz5Zhw4ZeTJZh26ZeiZZh84ZfBpZB2ZxTyLrwC/jTyDrwBUJaJusAzcJQatkHfiHHLRH1oGHRKElsg48SRraIOvASwSidrIOvEEm6iXrwNvEokayDnxIMuoi60ARwlELWQcKko/tyTpQnIgUMY0XZR6n554m68BCpKSIaRyGYbc/zPN82O9+f75P1oFFCUoRZ3H/PsXfPbzLOrACWSniz8n9VttlHViNuBRx9Zn7ddtlHViZxBRx/rHM8eh+6rusA+sTmiLO437xL1VZBzYhN0VcxP3il5++b3dtQI9Ep4gHn7kDrEzcAQKJO0AgcQcIJO4AgcQdIJC4AwQSd4BA4g4QSNwBAok7QCBxBwgk7gCBxB0gkLgDBBJ3gEDiDhBI3AECiTtAIHEHCCTuAIHEHSCQuAMEEneAQOIOEEjcAQKJO0AgcQcIJO4AgcQdIJC4AwQSd4BA4g4QSNwBAok7QCBxBwgk7gCBxB0gkLgDBBJ3gEDiDhBI3AECiTtAIHEHCCTuAIHEHSCQuAMEEneAQOIOEEjcAQKJO0AgcQcIJO4AgcQdIJC4AwQSd4BA4g4QSNwBAn0BGenYoouJTKIAAAAASUVORK5CYII=" /> </span><br />
<span style="font-family: Trebuchet MS, sans-serif;">Now we observe that the pointer D is common to both the list and to find if the list intersect or not it is sufficient to find if both the list have a common pointer among their start or end pointers.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;">Finding the point of intersection is now trivial and left to the reader. </span></div>
Aviralhttp://www.blogger.com/profile/11920144614598355124noreply@blogger.com1tag:blogger.com,1999:blog-3418265334198879901.post-48265123589798849752013-06-01T12:23:00.001+05:302015-03-21T13:13:19.714+05:30Cumulative Sums of elements in an array[Binary Indexed Tree]<div dir="ltr" style="text-align: left;" trbidi="on">
<span style="font-family: "Trebuchet MS",sans-serif;">Given a array and with below possible operations</span><br />
<span style="font-family: "Trebuchet MS",sans-serif;">Update: Add a value to a index a</span><br />
<span style="font-family: "Trebuchet MS",sans-serif;">Query: Get a cumulative sum from a range a to b</span><br />
<span style="font-family: "Trebuchet MS",sans-serif;"> What is the data structure you would employ and what will be the time complexity of the update and query operations.</span><br />
<span style="font-family: "Trebuchet MS",sans-serif;"><b><br /></b></span>
<span style="font-family: "Trebuchet MS",sans-serif;"><b>Approach:</b></span><br />
<span style="font-family: "Trebuchet MS",sans-serif;">The basic idea of any of the algorithm is to store/update the sum of the subparts and compute the sum in a range by adding up the relevant subparts.So for e.g a common data structure Segment tree creates a tree where the parent stores the sum of the child elements.</span><br />
<span style="font-family: "Trebuchet MS",sans-serif;"><br /></span>
<span style="font-family: "Trebuchet MS",sans-serif;"></span><br />
<a name='more'></a><span style="font-family: "Trebuchet MS",sans-serif;"><br /></span><br />
<span style="font-family: "Trebuchet MS",sans-serif;"><br /></span>
<span style="font-family: "Trebuchet MS",sans-serif;"> So each node in the tree takes care of the sum in a particular range.</span><br />
<img alt="" height="321" src="data:image/png;base64,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eGvYs31HYAgggAACCCCAgC0Cx48ff+yxxzQPR73jjjtYhGELsrqQrVu3durUKVLavWLFimPHjiXt7hA+xSKAAAKOCpBwd5SXwhEIvoCcffrCCy/IOajqbLtsRDht2rTgEwSihRs3bmzZsqXmTybFixf/8MMP09PTA9FQGoEAAggggAACCCDwXwJyhE+JEiXU88CSJUtOnToVLKcFZOlShw4d4uLiNKfisgnkhAkTmIo73QuUjwACCNgrQMLdXk9KQyBcAl999ZW88KieGsqmhP369UtJSQkXh/9bO2/evFq1amnO9WvUqPH999/7v4m0AAEEEEAAAQQQQOA/Atu2bdN8S1UOR3388cdPnDiBVMwE5J3g9u3bR0q7X3XVVZ9++unFixdjFg8VIYAAAghYESDhbkWPexEIr8CWLVtatGihmZm99dZbZbl0eGl83nKZx8uWkZqrnKS7pdP/+OMPnzeR8BFAAAEEEEAAgbALyEYlQ4YMyZMnj3o+X7NmzWXLloUdyKX2y9eodu3ayQ8emt+zKleuPGnSJNLuLnUO1SKAAAIGBEi4G8DiUgQQEIFz5869+OKLmnvIlClTZsqUKSgFQOD06dP9+/eXPdzVc33ZZbJHjx6HDx8OQDNpAgIIIIAAAgggEEIByadLVl09zZP8++uvv86m4a5/JGSBy3333Rcp7V61atXPPvvs0qVLrsdJAAgggAACkQRIuPPZQAABAwJff/31FVdcobmHzDPPPCNZWgNlcannBXbt2vXAAw9oHp9VoECBoUOHnj9/3vONIEAEEEAAAQQQQACB/wjILjHdu3fXzOTK3jKywwxS3hFYt25dmzZtNKfi8nWsevXqssM+aXfv9BeRIIAAAkoBEu58HhBAQJeAzL8jHap58803s82ILkR/XvTzzz83atRI87XWK6+8Us7FvXz5sj9bRtQIIIAAAggggECIBCQ/K+egqid1xYsXl3NTQwThq6auXbu2VatWkdLu8qbCF198QdrdV11KsAggEAoBEu6h6GYaiYAVAdlD5uWXX9bcXaRUqVIyOyffaoXXF/dKF8tmQZovN8h3tsaNG//yyy++aAhBIoAAAggggAACIRTYsWPHHXfcoU61Sxq3a9eux44dC6GJv5q8evXqu+++O1LavXbt2tOnT+dLmb/6lGgRQCDYAiTcg92/tA4BqwLffvutrGLW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PHbr1s07DZGte5WpjUqVKl28eNE74REJAggggIBzAvfff7/y8dSiRQvn6tJfcpcuXZRRvf322/rv5UoEEEDA1wLyjpFyq/TKlSt7KqMtXxPq1KmjHKLHjRvna3CCRyC6AAl3Rz4hWbLY2f6fH3/8sSNxZFeo1KuM7YYbbsjuDqf++6ZNm5TPBtlrbPny5VJZlgizlZQL3MJ0ioZyEUAgxALyuo9y0y0ZJ42eLO00nhzfqhyZp06d6nSNlI8AAggg4LrA119/rRz85dzUXbt2uR6VBCAvgcmrYMrtzuSUby8ERgwIIICA0wJyopJyZH733XedrtFo+QsXLlRGKO8hnT592mghXI+AXwRIuDvSU3rywspr3MoR33HHHcowcuTI0adPn7S0NEdQsiv0lVdeUQZTs2bNCxcukHDPjo3/jgACQRbIcjBpr169vNba33//XZ4dmaO3vBzqtQiJBwEEEEDAXgH5MbhMmTLKefvIkSPtrcJKaY899pgytjfffNNKadyLAAII+EJAkidly5bNHP3y588v26Z7MPLWrVsrh+j+/ft7MEhCQsAWARLutjBmLcQvCXflBu6yqDwj7GuvvVY2QHTEJWqh58+fr1atmpJONlIg4R77jqBGBBDwiMCxY8cKFCiQOSrmyZPnr7/+8khsyjCy/HY7d+5cDwZJSAgggAACdglkyWj/7W9/89SuBbLWPleuXJlPTzkHRU5DsavtlIMAAgh4U+Dzzz9X5lI8uEwnw2379u3KvQ1y587tneOpvNmzROVfARLujvSdXxLuGY2X30Kvv/56ZcxNmzZ1xCW7Qn/66SflSknJLg0ePNhfmNk1kf+OAAII6BV44YUXlAPg008/rffO2F63aNEiZZy33XZbbOunNgQQQACB2An8+OOPyum65E02btwYu+r11dS9e3flg2nIkCH67uMqBBBAwK8Csj9w5rgno7Ts2evZlvTr1085RLdt29azoRIYAlYESLhb0QvIvX379lWOd7KgUn51dKttWZbMSOJGjlR1KxjqRQABBNwSOHz4sGyJmzk4582bV85BciuYbOtt2LCh8jmycuXKbG/hAgQQQAAB3wmcO3dO+YKsjPyyOMaDrZDzTpQrKIsUKcI2wR7sJkJCAAG7BFavXq2cit9+++12lexEObLXTYkSJZQBL1682ImKKBMBdwVIuLvr737t3333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EbjiiivUyUfeKmFTWurPHT58uMolG1SyD0TqBz1BHSThHvfBmjFjhpq1kdmE10H4GrN169bttttu6ix8ww03+CqBgxFAAAG/AldddZU67Vx55ZV+S8jO8aNHj1atTjrppOz0nZ4igAACwQm88MIL6uzatGlTdjbT15aUza677qoCvv/++/qncyQCCCBgICA7CTdv3tybeWQTMBYLlmeUB5I6deqkztUjR440kOcUBIIQIOEehKqzMmV63XPPPdXpY7/99lu/fr2zCrJR0L///W95LMBjlHdrfPnll9noOr1EAIEIBH7++eeGDRt6c478aLpgwYII2pGQKiWpIc8eeVzyFK380pyQttNMBBBAIKYCixYtynvQ/pFHHolpW+ParLxfLA4//PC4tpR2IYBASgTy3rpxzTXXpKRjQXZj/PjxasasdevWy5cvD7JCykZAV4CEu65UJMdddNFF6twhv3Z+//33kbQk6ZVecMEFquQBBxwgr1RNeqdoPwIIxFPg0ksvVScc7pUrDpMsRVHFzj333IqncAACCCCAQBmBvn37qvNqt27duPX1GzDye3DeY7Lvvvuu30I4HgEEENAXUOecOnXq8FiSJl3Pnj3Vjzz2hNB047CgBUi4By1sXr48ZS8v+fQmDvnzSy+9ZF5cts+U92lsueWW6iwsvx5nm4TeI4BAIALyhjr1Xc3yCP/ixYsDqSlFha5du1adojfZZBO2vE/R8NIVBBAIW0De9qTe9MqnEk8OmY3B3//+d1XykEMOMSuHsxBAAIGKAnkrtU8++eSKp3BATuC7776TbQy86Vq+Ssi7Z8FBIHIBEu6RD0HxBsyePXvTTTdV7/AuvvjimLY1Ic3K2yZYeEnoJGToaCYCSRLIe55myJAhSWp9dG2944471I+8QYMGRdcWakYAAQQSLLBixYptt91WnVGHDh2a4P5E2nR5LCBvd+AJEyZE2iIqRwCB1ArkLdPmkRpfIz1w4ED1g693796+TudgBIIQIOEehKptmfKez65du+a9bZnXZdiy/uc/J5xwgqp6yimn2JdJCQgggIAnILt+qcsrZB8webwGHx0BgWrWrJk3RcufodNx4xgEEEAgT+CSSy5Rb3f32msv3v9kEyTyhLHqedBBB9mUxrkIIIBAUQH5ElG7dm1vtpE3+QHlS0C+OOS9uaSqqspXCRyMgHMBEu7O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CCCAAAIIIIBAmALLli1r27atmoweNmxYmA0Ip67x48fXrl1b7ebNN98cTtXUoiNAwl1HiWMQQAABBBBAAAEEEEAAAQQQQAABBBBAINYC/fv3V9PQXbt2TevS79tvv13taa1atcaNGxfrsclS40i4Z2m06SsCCCCAAAIIIIAAAggggAACCCCAAAJpFKiqqqpRo4aXhq5Xr960adPS2NH/6dPGjRt79uyp5tw322yz77//Pq39TVa/SLgna7xoLQIIIIAAAggggAACCCCAAAIIIIAAAgj8l0B1dXX79u3VBPSQIUPSbST75+R1uUuXLmvWrEl3rxPROxLuiRgmGokAAggggAACCCCAAAIIIIAAAggggAACxQUGDRqkZts7duy4du3a1GN9/vnnDRs2VDt+/vnnp77X8e8gCff4jxEtRAABBBBAAAEEEEAAAQQQQAABBBBAAIHiAlOmTFFfIiobmk+aNCkjWE899ZSacJc/jxo1KiN9j203SbjHdmhoGAIIIIAAAggggAACCCCAAAIIIIAAAgiUE1i/fn3nzp3VpPOAAQMyRXbBBReo3W/QoMHUqVMzJRC3zpJwj9uI0B4EEEAAAQQQQAABBBBAAAEEEEAAAQQQ0BIYOnSomm5u167dypUrtc5My0Gyec6+++6rIuy4445Lly5NS/+S1w8S7skbM1qMAAIIIIAAAggggAACCCCAAAIIIIAAAjNmzKhfv76Xa65Ro8a4ceMyyPLDDz9svvnmas79hBNO2LhxYwYp4tBlEu5xGAXagAACCCCAAAIIIIAAAggggAACCCCAAAI+BCSh3K1bNzXL3K9fPx/np+vQN954QzavVzVuu+22dHUxMb0h4Z6YoaKhCCCAAAIIIIAAAggggAACCCCAAAIIIJATeOSRR9T8cqtWrRYtWpRlnFtuuUUFkRfJvv3221kGiarvJNyjkqdeBBBAAAEEEEAAAQQQQAABBBBAAAEEEDARmDt3btOmTdX88gsvvGBSUIrOkSX/xx57bN6PEAKVoi4moysk3JMxTrQSAQQQQAABBBBAAAEEEEAAAQQQQAABBHICxx9/vJpZlv9FRgSWLFmy/fbbqzL77bffunXrwAlTgIR7mNrUhQACCCCAAAIIIIAAAggggAACCCCAAAJWArKYXc0py1J31nF7oJ988on6IlmBuvjii624OdmnAAl3n2AcjgACCCCAAAIIIIAAAggggAACCCCAAAIRCchG7bJdu5pwl83cI2pLTKt9/PHHVR/587PPPhvTtqaxWSTc0ziq9AkBBBBAAAEEEEAAAQQQQAABBBBAAIE0CvTr10/NJnfr1k32Lk9jR636dO6556pKjRo1mjZtmlWJnKwtQMJdm4oDEUAAAQQQQAABBBBAAAEEEEAAAQQQQCA6gXHjxtWoUcNLJcveKTNmzIiuOfGtec2aNXvvvbeac995552XL18e3xanqGUk3FM0mHQFAQQQQAABBBBAAAEEEEAAAQQQQACBlAqsXLmyXbt2ahJ56NChKe2rg27NmjWrRYsWKtdJJ53E0wAOZCsVQcK9khD/jgACCCCAAAIIIIAAAggggAACCCCAAAJRCwwYMEBNH3fu3Hn9+vVRNyrW9Y8dO7ZmzZoq2t133x3rFqeicSTcUzGMdAIBBBBAAAEEEEAAAQQQQAABBBBAAIH0CkyaNKlWrVpe7rh27dpTpkxJb3ed9ezGG29UE+516tR55513nJVOQcUESLgTFwgggAACCCCAAAIIIIAAAggggAACCCAQX4G1a9d27NhRTRwPGjQovs2NU8s2bNjQo0cPlW6LLbb46aef4tTGtLWFhHvaRpT+IIAAAggggAACCCCAAAIIIIAAAgggkCaBIUOGqCnj9u3bV1dXp6mDgfZl4cKF2267rQp40EEHsRtPcOYk3IOzpWQEEEAAAQQQQAABBBBAAAEEEEAAAQQQsBKYNm1avXr1vHxxjRo1qqqqrErM3skfffTRJptsoubcr7jiiuwxhNRjEu4hQVMNAggggAACCCCAAAIIIIAAAggggAACCPgSkB1RunbtqmaK+/fv76sEDs4JPProoyqj/G7x4osvghOEAAn3IFQpEwEEEEAAAQQQQAABBBBAAAEEEEAAAQRsBYYNG6amidu2bbts2TLbQrN6fr9+/VTMJk2afP3111nFCLDfJNwDxKVoBBBAAAEEEEAAAQQQQAABBBBAAAEEEDATmD17dqNGjdQc8ZgxY8yK4iwRWL16dadOnVRPeRXtypUrwXErQMLdrSelIYAAAggggAACCCCAAAIIIIAAAggggIADge7du6vZ4VNPPdVBodku4ttvv910001V1dNPPz3bJO57T8LdvSklIoAAAggggAACCCCAAAIIIIAAAggggICNwBNPPKHm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8bTTE/j8888bNmyo5tzPP//8Mj577bWXd3CfPn0yIknCPSMDTTcRQAABBBBAAAEEEEAAAQQQQAABBBCIQED2Fenatauape3fv38E7aBKFwJPPfWUOpTy51GjRhUteOzYseqRHTp0cFF/Asog4Z6AQaKJCCCAAAIIIIAAAggggAACCCCAAAIIJFRg2LBhauK1bdu22Xl/ZkKHrHyzL7jgAnVAGzRoMHXq1MJTDjjgAPUweW/qihUrUgmS1ykS7lkYZfqIAAIIIIAAAggggAACCCCAAAIIIIBABAKzZ89u1KiRmngdM2ZMBO2gSncC8v7bfffdVx3THXfccenSpWoN77zzTt5CePlf+Ut3rYhvSSTc4zs2tAwBBBBAAAEEEEAAAQQQQAABBBBAAIH4CKxbt85vY7p3764mXk899VS/JXB8DAV++OGHzTffXB3ZE044YePGjV5T88Y9d+S9994bw744bxIJd+ekFIgAAggggAACCCCAAAIIIIAAAggggEAKBa677jo1qVqxh0888YSak23RosX8+fMrnsUBiRB44403atWqpY7vbbfdlmv5Rx99VLi8Xf7mjDPOSETXLBtJwt0SkNMRQAABBBBAAAEEEEAAAQQQQAABBBDIhIDsHCLvzNTsquTWJcOuJl5LvV1Ts0AOi5vALbfcoo5v7dq13377bWnkiSeeWDThvssuu8StC0G0h4R7EKqUiQACCCCAAAIIIIAAAggggAACCCCAQNoE6tev36ZNm+XLl+t07JRTTlGzrrLHiM5ZHJMgAXnc4dhjj1VHuVWrVpJzl/ejFk24y4r4lStXJqiDZk0l4W7mxlkIIIAAAggggAACCCCAAAIIIIAAAghkSGDhwoW5LOqVV15ZsdvyZlQ15SrvTZW3p1Y8iwMSJ7BkyZLtt99eHeu8vd3zMu/vvfde4vrot8Ek3P2KcTwCCCCAAAIIIIAAAggggAACCCCAAAKZE/j0009zydO6det+9dVXZfq/bNmytm3bqpnWYcOGZc4rMx3+5JNP5NGHokvaC//yL3/5S+phSLinfojpIAIIIIAAAggggAACCCCAAAIIIIAAArYCr7zyipc/PeKII8oU179/fzXT2rVr1w0bNthWz/kxFhg5cqRmwr1v374x7oebppFwd+NIKQgggAACCCCAAAIIIIAAAggggAACCKRY4OGHH1aTqqNHjy7a2aqqqho1anhH1qtXb9q0aSlmyWbX1q1bN2XKlBEjRpx//vldunTZZJNNNBPuHTt2TL0YCffUDzEdRAABBBBAAAEEEEAAAQQQQAABBBBAwFbg2muvVZOq22677erVq/MKra6ubt++vXrYkCFDbCvm/BgIrF279uOPP3700UfPO++8ffbZR35H0cyw5x1Wu3btVatWxaBDATaBhHuAuBSNAAIIIIAAAggggAACCCCAAAIIIIBAOgT69euXlzy98cYb87o2aNAg9RhZziyJ2nR0P2u9WLNmzUcffSSPNZxzzjl77bWXbNxvlmEvPGvixInpxiThnu7xpXcIIIAAAggggAACCCCAAAIIIIAAAgg4EDjssMPykqfyqsxZs2Z5RcseI7J+2TumVq1akyZNclAxRUQhsHTp0ltvvbVly5au8uxeOffdd18UHQqvThLu4VlTEwIIIIAAAggggAACCCCAAAIIIIAAAgkV2HnnnQtzryeeeGKuO+vXr+/cubN6wIABAxLaU5rtCcj2L/fee2/btm0dpt3PPPPMdAuTcE/3+NI7BBBAAAEEEEAAAQQQQAABBBBAAAEEHAg0atSoaNb19ddfl9KHDh2q/mu7du1WrlzpoFaKiIGA7As0fPjwHXbYwUnafffdd49BnwJsAgn3AHEpGgEEEEAAAQQQQAABBBBAAAEEEEAAgRQILFmypFSyVVa+T5s2TbaX8Q6oUaPGuHHjUtBruqAK/Prrr08//bTsy2+Zdpd9hwpft5smahLuaRpN+oIAAggggAACCCCAAAIIIIAAAggggIB7gc8//7xMmnX77bdX/1Ver+q+BZQYD4GNGzf+4x//2GeffWzS7une3J+EezxClVYggAACCCCAAAIIIIAAAggggAACCCAQV4GxY8dqJlhbtWq1aNGiuPaDdjkTkK2EDjroIM2oyDvsgQcecNaO+BVEwj1+Y0KLEEAAAQQQQAABBBBAAAEEEEAAAQQQiJOAbOGtmVq94447Fi5cGKe205YABd59990ePXrIJkKa4ZE77A9/+EOAbYq6aBLuUY8A9SOAAAIIIIAAAggggAACCCCAAAIIIBBvgRtuuMFXRrVBgwY77rjjwQcffMYZZwwePFhWNP/zn//8+OOP58+fL3uSxLuvtM63gIxsr169atasqRkknTp18l1Hck4g4Z6csaKlCCCAAAIIIIAAAggggAACCCCAAAIIRCEgS5I1c6kVD5N3Zm633XYHHnjg6aef/v3330fRG+oMRODLL7+U31dkfCvGQJ06daqrqwNpRAwKJeEeg0GgCQgggAACCCCAAAIIIIAAAggggAACCMRYoHv37hWzqL4O2GmnnV577bUY95imGQrMnDmzf//+9erVKx8PH374oWEFsT+NhHvsh4gGIoAAAggggAACCCCAAAIIIIAAAgggEKnArrvu6iufXubgxo0b33777WvXro20Q1QerMC8efMuu+yyhg0bloqEhx56KNgWRFc6Cffo7KkZAQQQQAABBBBAAAEEEEAAAQQQQACBJAg0bdrUPuEur9bs06ePpGKT0GPa6EBgwYIF1157bbNmzQqD55xzznFQQSyLIOEey2GhUQgggAACCCCAAAIIIIAAAggggAACCMRDYPny5fbZdnlP5jvvvBOPDtGKUAWWLl166623tmzZUo2izp07h9qIECsj4R4iNlUhgAACCCCAAAIIIIAAAggggAACCCCQNAF5GaZNwr158+YPPPDAr7/+mrR+016XAqtWrbr33nvbtm2bi6W6deuuWbPGZQWxKYuEe2yGgoYggAACCCCAAAIIIIAAAggggAACCCAQP4Fx48aZJdxr1qx57rnnyr4i8esTLYpGQPbuHz58+A477CARNXny5GgaEXCtJNwDBqZ4BBBAAAEEEEAAAQQQQAABBBBAAAEEkizw2GOPGSTcu3btmtaMapIHMxZtl8cdnn76afkhJxatcd0IEu6uRSkPAQQQQAABBBBAAAEEEEAAAQQQQACBFAncdNNNvhLurVq1evzxxzdu3JgiA7qCgK4ACXddKY5DAAEEEEAAAQQQQAABBBBAAAEEEEAggwKyLYxmwr1OnTqXXnqpvCQzg0p0GYGcAAl3IgEBBBBAAAEEEEAAAQQQQAABBBBAAAEESgocddRROgn3Qw455IsvvsARgYwLkHDPeADQfQQQQAABBBBAAAEEEEAAAQQQQAABBMoJ7L777uUT7ltvvfULL7wAIgIIiAAJd8IAAQQQQAABBBBAAAEEEEAAAQQQQAABBEoKNG/evFTCfZNNNrnmmmtWrVoFHwII5ARIuBMJCCCAAAIIIIAAAggggAACCCCAAAIIBCWgsxmLeswjjzwSVFOMypVkeqkuHHvssd9++61RqSYniUzSMU26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" width="640" /><br />
<span style="font-family: Georgia,"Times New Roman",serif;"><b><br /></b></span>
<span style="font-family: Georgia,"Times New Roman",serif;">Once you create a static Segment tree the update and the query operation should be easy.</span><br />
<span style="font-family: Georgia,"Times New Roman",serif;"><br /></span>
<br />
<span style="font-family: Georgia,"Times New Roman",serif;">Can we avoid the extra space incurred and rather use the given array elements as the nodes to hold the sum in a range.</span><br />
<span style="font-family: Georgia,"Times New Roman",serif;">Infact a famous data structure Binary Index Tree(also known as Fenwick tree) works on the same principle and is relatively simple
to code and debug.</span><br />
<br />
<span style="font-family: Georgia,"Times New Roman",serif;">So how do one assign the parent child relationship in the tree. Since now there are no internal node to hold the sum of a range like (0,4) we can infact use the 4th index to hold the sum of (0, 4), the same is true for the </span><br />
<span style="font-family: Georgia,"Times New Roman",serif;">3 holding the sum of (3,3)</span><br />
<span style="font-family: Georgia,"Times New Roman",serif;">10 holding the sum of (9,10) </span><br />
<span style="font-family: Georgia,"Times New Roman",serif;">12 holding the sum of (9,12)</span><br />
<span style="font-family: Georgia,"Times New Roman",serif;">16 holding the sum of (0,16)</span><br />
<span style="font-family: Georgia,"Times New Roman",serif;">So to generalize each index index holds the sum of elements in range </span><br />
<span style="font-family: Georgia,"Times New Roman",serif;">((index - 2^r + 1) , index) where r is the right most bit postion set in index</span>.<br />
<br />
<span style="font-family: Georgia,"Times New Roman",serif;">I would strongly suggest to go over the above logic once more and write a pseudo code for the update query.<b></b></span><br />
<span style="font-family: Georgia,"Times New Roman",serif;"><b><br /></b></span>
<br />
<span style="font-family: Georgia,"Times New Roman",serif;">Kudos if you were successful to write the working piece of the code.<b><br /></b></span>
<br />
<span style="font-family: Georgia,"Times New Roman",serif;">So how do we add a delta to a index, we need to update all the elements which are using its value.</span><br />
<span style="font-family: Georgia,"Times New Roman",serif;">Also to extract the rightmost bit we can use </span><br />
<span style="font-family: Georgia,"Times New Roman",serif;">n & -(n) //Proof is left to reader :)</span><br />
<span style="font-family: Georgia,"Times New Roman",serif;">Below is the terse piece of code which updates the delta at a particular index</span><br />
<span style="font-family: Georgia,"Times New Roman",serif;"><b><br /></b></span>
<br />
<pre class="brush: cpp;">void update(int index ,int delta){
while (index <= N){ // N is the total number of elements in the array
A[index] += delta;
index += (index & -index);
}
}
</pre>
<span style="font-family: "Trebuchet MS",sans-serif;">To initialize the array we can intialize all the array elements to 0 and iteratively call the update function for each of the index.</span><br />
<span style="font-family: "Trebuchet MS",sans-serif;"><br /></span>
<span style="font-family: "Trebuchet MS",sans-serif;">To find the sum of elements in the range (0, index), the below function can be used</span><br />
<pre class="brush: cpp;">int query(int index){
int sum = 0;
while (index > 0){
sum += A[index];
index -= (index & -index);
}
return sum;
}
</pre>
<br />
<span style="font-family: "Trebuchet MS",sans-serif;">To find the sum in a given range (a,b), we can compute it by</span><br />
<pre class="brush: cpp;">int sum = query(b) - query(a-1);
</pre>
<br />
<span style="font-family: "Trebuchet MS",sans-serif;">Finally the time complexity of each of the update, query is O(log2(N)) </span></div>
Aviralhttp://www.blogger.com/profile/11920144614598355124noreply@blogger.com0tag:blogger.com,1999:blog-3418265334198879901.post-182137372035026102013-02-23T16:53:00.005+05:302015-03-21T13:13:50.760+05:30Fibonacci Series Part II<div dir="ltr" style="text-align: left;" trbidi="on">
<div dir="ltr" style="text-align: left;" trbidi="on">
In the <a href="http://coders-stop.blogspot.in/2013/02/fibonacci-numbers.html">last post</a> we discussed about evaluating the nth Fibonacci number in logarithmic time O(logn).<br />
<br />
Lets us look at another problem on the similar lines.<br />
Given a series<br />
F(n) = F(n-1) + 2*F(n-2) + 3*F(n-3) + F(n-4)<br />
<br />
Lets try to solve the problem in the similar fashion,<br />
<br />
The matrix multiplication looks like below,<br />
<img alt="" src="data:image/png;base64,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" /> <br />
<br />
The running time to compute the nth term of the series will be </div>
(sizeof(M) ^3) * log(n) = 64*log(n)<br />
<br />
Can we optimize it further ?<br />
<br />
Lets again go over the series once more<br />
F(n) = F(n-1) + 2*F(n-2) + 3*F(n-3) + F(n-4)<br />
F(n-1) = F(n-2) + 2*F(n-3) + 3*F(n-4) + F(n-5)<br />
F(n) - F(n-1) = F(n-1) + F(n-2) + F(n-3) - 2*F(n-4) - F(n-5)<br />
After some more rearrangement it reduces to<br />
F(n) = 2* F(n-1) + F(n-2)<br />
Some of you must have recognized it as Pell's number.<br />
<br />
So the matrix multiplication reduces to<br />
<img alt="" src="data:image/png;base64,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" /> <br />
So the final runtime reduces to O(8* log(n)) <br />
<br /></div>
Aviralhttp://www.blogger.com/profile/11920144614598355124noreply@blogger.com0tag:blogger.com,1999:blog-3418265334198879901.post-89395949212836468612013-02-23T01:58:00.003+05:302015-03-21T13:14:50.577+05:30Fibonacci numbers [Matrix exponentiation]<div dir="ltr" style="text-align: left;" trbidi="on">
<span style="font-family: Georgia,"Times New Roman",serif;">Fibonacci numbers has been a very famous sequence represented as:</span><br />
<span style="font-family: Georgia,"Times New Roman",serif;"><br /></span>
<span style="font-family: Georgia,"Times New Roman",serif;">F(n) = F(n-1) + F(n-2)</span><br />
<span style="font-family: Georgia,"Times New Roman",serif;">with F(0) = 0, F(1) =1</span><br />
<span style="font-family: Georgia,"Times New Roman",serif;">So what if you need to find the nth term of the series. Its easy to view the recursive nature of the problem.</span><br />
<span style="font-family: Georgia,"Times New Roman",serif;"><br /></span>
<span style="font-family: Georgia,"Times New Roman",serif;">The code snippet would look something like</span><br />
<br />
<pre class="brush: cpp;">int fib(int n) {
if(n<1) return 0;
if(n == 1) return 1;
return fib(n-1) + fib(n-2);
}
</pre>
<br />
<br />
<a name='more'></a><br /><br />
<span style="font-family: Georgia,"Times New Roman",serif;">Lets try to analyse the sequence of calls for calculating the F(4)</span><br />
<img alt="enter image description here" src="http://i.stack.imgur.com/CLwKE.jpg" height="225" width="640" /><br />
<br />
<span style="font-family: Georgia,"Times New Roman",serif;">Clearly
we are computing the same value over and over, and the size of
computations will grow exponentially with the increasing value of n. Can
we reuse the same value computed before ?</span><br />
<span style="font-family: Georgia,"Times New Roman",serif;"></span><br />
<span style="font-family: Georgia,"Times New Roman",serif;"><br /></span>
<span style="font-family: Georgia,"Times New Roman",serif;"><br /></span>
<span style="font-family: Georgia,"Times New Roman",serif;">Yes, infact we term this as a technique called memorization or Dynamic programming.</span><br />
<span style="font-family: Georgia,"Times New Roman",serif;">The trick is to store the values as you compute and look up the value before computing it.</span><br />
<span style="font-family: Georgia,"Times New Roman",serif;"><br /></span>
<span style="font-family: Georgia,"Times New Roman",serif;">The iterative solution to compute the nth Fibonacci is as follows</span><br />
<pre class="brush: cpp;">int fib(int n) {
if(n < 1)
return 0;
int *a = malloc(sizeof(int) * (n+1));
a[0] = 0; a[1] = 1;
for(int i = 2; i <= n; i++)
a[i] = a[i-1] + a[i-2];
return a[n];
}
</pre>
<br />
<span style="font-family: Georgia,"Times New Roman",serif;">The above implementation reduces the time complexity to O(n) with a overhead of the O(n) space.</span><br />
<span style="font-family: Georgia,"Times New Roman",serif;"><br /></span>
<br />
<span style="font-family: Georgia,"Times New Roman",serif;">Can we still do better ?</span><br />
<span style="font-family: Georgia,"Times New Roman",serif;">Is it necessary to generate all the previous Fibonacci numbers ?</span><br />
<span style="font-family: Georgia,"Times New Roman",serif;">Let's try to rearrange the formulas to generate the series</span><br />
<span style="font-family: Georgia,"Times New Roman",serif;">F(2) = F(1) + F(0)</span><br />
<span style="font-family: Georgia,"Times New Roman",serif;">F(3) = F(2) + F(1) = 2*F(1) + F(0)</span><br />
<span style="font-family: Georgia,"Times New Roman",serif;">F(4) = F(3) + F(2) = 3*F(1) + 2*F(0)</span><br />
<span style="font-family: Georgia,"Times New Roman",serif;"><br /></span>
<span style="font-family: Georgia,"Times New Roman",serif;">It appears that every term in the series can be broken down to a form of</span><br />
<span style="font-family: Georgia,"Times New Roman",serif;">F(n) = p*F(1) + q*F(0)</span><br />
<span style="font-family: Georgia,"Times New Roman",serif;"><br /></span>
<span style="font-family: Georgia,"Times New Roman",serif;">So the task boils down to find the p & q for a particular given 'n'.</span><br />
<span style="font-family: Georgia,"Times New Roman",serif;"><br /></span>
<span style="font-family: Georgia,"Times New Roman",serif;"> Its easy to realize that the subsequent terms can be generated using the matrix multiplication.</span><br />
<br />
<a href="http://www.blogger.com/blogger.g?blogID=809349266944482554" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img alt="" border="0" src="data:image/png;base64,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" style="cursor: move;" /></a><br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<span style="font-family: Georgia,"Times New Roman",serif;">So we can calculate the nth Fibonacci number as</span><br />
<img alt="" src="data:image/png;base64,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" /><br />
<br />
<span style="font-family: Georgia,"Times New Roman",serif;">Can we evaluate the power(a,b) in sub-linear time ?</span><br />
<span style="font-family: Georgia,"Times New Roman",serif;">The answer is yes, we will be using the same technique again of reusing the old values computed before.</span><br />
<span style="font-family: Georgia,"Times New Roman",serif;">May be the old computed values concept may not be straightforward.</span><br />
<span style="font-family: Georgia,"Times New Roman",serif;">Lets take a closer look on how to calculate power(a,.b)</span><br />
<span style="font-family: Georgia,"Times New Roman",serif;">power(a, b) = a*a*a*a*.........*a (b times)</span><br />
<span style="font-family: Georgia,"Times New Roman",serif;">can you figure out the overlapping solutions.</span><br />
<span style="font-family: Georgia,"Times New Roman",serif;"><br /></span>
<span style="font-family: Georgia,"Times New Roman",serif;">We can rewrite the above equation as</span><br />
<span style="font-family: Georgia,"Times New Roman",serif;">power(a,b) = power(a,b/2) * power(a, b/2) If b is even</span><br />
<span style="font-family: Georgia,"Times New Roman",serif;">power(a,b) = power(a,b/2) * power(a,b/2) * a If b is odd</span><br />
<span style="font-family: Georgia,"Times New Roman",serif;"><br /></span>
<span style="font-family: Georgia,"Times New Roman",serif;">By now you would have realized that the number of multiplications required will be ceil(log(b))</span><br />
<span style="font-family: Georgia,"Times New Roman",serif;">(where log is evaluated in base 2)</span><br />
<span style="font-family: Georgia,"Times New Roman",serif;"><br /></span>
<span style="font-family: Georgia,"Times New Roman",serif;">Using the same approach we can evaluate the power(matrix M, n) and number of operations needed will be</span><br />
<span style="font-family: Georgia,"Times New Roman",serif;">(sizeof(M) ^3) * log(n)</span><br />
<span style="font-family: Georgia,"Times New Roman",serif;"><br /></span>
<span style="font-family: Georgia,"Times New Roman",serif;">In our case it will be 8* log(n)</span><br />
<span style="font-family: Georgia,"Times New Roman",serif;"><br /></span>
<span style="font-family: Georgia,"Times New Roman",serif;">Hence the nth
Fibonacci number can be calculated in O(log(n)). Writing the code
snippet for the same is left as an exercise to the reader.</span><br />
<span style="font-family: Georgia,"Times New Roman",serif;">Comments invited :)</span></div>
Aviralhttp://www.blogger.com/profile/11920144614598355124noreply@blogger.com1tag:blogger.com,1999:blog-3418265334198879901.post-9223733290253153472013-01-14T13:20:00.002+05:302015-03-21T13:16:17.860+05:30[Google Interview] Query the most frequent element<div dir="ltr" style="text-align: left;" trbidi="on">
<span style="font-family: Trebuchet MS, sans-serif;">Design a data structure which supports the below operation</span><br />
<span style="font-family: Trebuchet MS, sans-serif;">Insertion of an integer</span><br />
<span style="font-family: Trebuchet MS, sans-serif;">Deletion removes the element with highest frequency at that instant. In case of tie, go by the FIFO startegy.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">For e.g</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">Insert 5,6,5,7,5,7</span><br />
<span style="font-family: Trebuchet MS, sans-serif;">1st removal -- 5,6,5.7,7</span><br />
<span style="font-family: Trebuchet MS, sans-serif;">2nd removal -- 5,6,5,7,</span><br />
<span style="font-family: Trebuchet MS, sans-serif;">3rd removal -- 5,6,7</span><br />
<span style="font-family: Trebuchet MS, sans-serif;">and so on </span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">Perform both the operations in O(1).</span></div>
Aviralhttp://www.blogger.com/profile/11920144614598355124noreply@blogger.com1tag:blogger.com,1999:blog-3418265334198879901.post-54985925313994816822012-09-23T23:18:00.003+05:302015-03-21T13:18:22.022+05:30[Amazon Online test] Number of swaps required<div dir="ltr" style="text-align: left;" trbidi="on">
<div dir="ltr" style="text-align: left;" trbidi="on">
<div dir="ltr" style="text-align: left;" trbidi="on">
<div style="color: #444444; font-size: 16px; line-height: 25px;">
<span style="font-family: "Trebuchet MS",sans-serif;"><span style="margin: 0px 0.3em 0px 0px; padding: 0px;">Given an array containing 0 & 1 only, You have only 1 operation i.e. you can</span><span style="margin: 0px 0.3em 0px 0px; padding: 0px;"> swap the</span><span style="margin: 0px 0.3em 0px 0px; padding: 0px;">adjacent elements in the array. Find the minimum number of operations</span><span style="margin: 0px 0.3em 0px 0px; padding: 0px;">required to sort the given input array.</span></span><br />
<span style="font-family: "Trebuchet MS",sans-serif;"><br /></span>
<span style="font-family: "Trebuchet MS",sans-serif;"><span style="margin: 0px 0.3em 0px 0px; padding: 0px;">A = (0,0,1,0,1,0,1,1) </span></span></div>
<div style="color: #444444; font-family: 'Lucida Grande',Tahoma,Arial,sans-serif; font-size: 16px; line-height: 25px;">
<span style="font-family: "Trebuchet MS",sans-serif;"><span style="margin: 0px 0.3em 0px 0px; padding: 0px;">Min Operations: 3.</span></span><br />
<span style="font-family: "Trebuchet MS",sans-serif;"><br /></span>
<span style="font-family: "Trebuchet MS",sans-serif;"><span style="margin: 0px 0.3em 0px 0px; padding: 0px;">Approach: </span></span><br />
<span style="font-family: "Trebuchet MS",sans-serif;"><span style="margin: 0px 0.3em 0px 0px; padding: 0px;"> Let's start with some of the trivial test cases.</span></span><br />
<span style="font-family: "Trebuchet MS",sans-serif;"><span style="margin: 0px 0.3em 0px 0px; padding: 0px;">(1,0) -- Number of swaps = 1</span></span><br />
<span style="font-family: "Trebuchet MS",sans-serif;"><span style="margin: 0px 0.3em 0px 0px; padding: 0px;">(1,1,0) -- Number of swaps = 2</span></span><br />
<span style="font-family: "Trebuchet MS",sans-serif;"><span style="margin: 0px 0.3em 0px 0px; padding: 0px;">(1,1,0,0) -- Number of swaps = 4 </span></span><br />
<span style="font-family: "Trebuchet MS",sans-serif;"><span style="margin: 0px 0.3em 0px 0px; padding: 0px;">So an important observation comes that given an array of the type</span></span><br />
<span style="font-family: "Trebuchet MS",sans-serif;"><span style="margin: 0px 0.3em 0px 0px; padding: 0px;">(1, 1, 1, ... n times, 0, 0, 0, .. m times)</span></span><br />
<span style="font-family: "Trebuchet MS",sans-serif;"><span style="margin: 0px 0.3em 0px 0px; padding: 0px;">Number of swaps = n*m (This is based on the fact that each 0 has to be pushed(swapped) back m number of time)</span></span><br />
<span style="font-family: "Trebuchet MS",sans-serif;"><span style="margin: 0px 0.3em 0px 0px; padding: 0px;"><br /></span></span>
<span style="font-family: "Trebuchet MS",sans-serif;"><span style="margin: 0px 0.3em 0px 0px; padding: 0px;"><br /></span></span>
<span style="font-family: "Trebuchet MS",sans-serif;"><span style="margin: 0px 0.3em 0px 0px; padding: 0px;"><br /></span></span>
<span style="font-family: "Trebuchet MS",sans-serif;"><span style="margin: 0px 0.3em 0px 0px; padding: 0px;"><br /></span></span>
<span style="font-family: "Trebuchet MS",sans-serif;"><span style="margin: 0px 0.3em 0px 0px; padding: 0px;"><br /></span></span>
<span style="font-family: "Trebuchet MS",sans-serif;"><br /></span>
<span style="font-family: "Trebuchet MS",sans-serif;"></span><br />
<a name='more'></a><br />
<span style="font-family: "Trebuchet MS",sans-serif;"><br /></span>
<span style="font-family: "Trebuchet MS",sans-serif;"><span style="margin: 0px 0.3em 0px 0px; padding: 0px;">So iterate over the array and keep track of the 1's encountered, whenever we hit a 0 we add the result(number of swaps) with the <span style="margin: 0px 0.3em 0px 0px; padding: 0px;">number of 1's encountered so far(as 0 has to be swapped with each of them order to reach a configuration like (0,0,..., 1, 1, 1...))</span></span></span><br />
<span style="font-family: "Trebuchet MS",sans-serif;"><br /></span>
<span style="font-family: "Trebuchet MS",sans-serif;"><span style="margin: 0px 0.3em 0px 0px; padding: 0px;"><span style="margin: 0px 0.3em 0px 0px; padding: 0px;">Now the piece of code will look like</span></span></span><br />
<span style="font-family: inherit; margin: 0px 0.3em 0px 0px; padding: 0px;"><span style="font-family: inherit; margin: 0px 0.3em 0px 0px; padding: 0px;"> </span>
</span></div>
</div>
</div>
<pre class="brush: cpp;">int swapSort(int *a, int n) {
int swaps = 0;
int noOfOne = 0;
for (i =0;i<n;i++) {
if (a[i] == 1)
noOfOne++;
else
swaps += noOfOne;
}
return swaps;
}
</pre>
</div>
Aviralhttp://www.blogger.com/profile/11920144614598355124noreply@blogger.com1tag:blogger.com,1999:blog-3418265334198879901.post-79086262678552941752012-09-23T23:14:00.002+05:302015-03-21T13:22:18.344+05:30[DirectI Online test] Number of substrings containing atmost 2 different characters<div dir="ltr" style="text-align: left;" trbidi="on">
<div dir="ltr" style="text-align: left;" trbidi="on">
<span style="font-family: "Trebuchet MS",sans-serif;">Given an input string, find the number of substrings which contains atmost two different characters. </span><br />
<span style="font-family: "Trebuchet MS",sans-serif;">E.g - aabc Ans: 8 </span><br />
<span style="font-family: "Trebuchet MS",sans-serif;"><br /></span></div>
<div dir="ltr" style="text-align: left;" trbidi="on">
<span style="font-family: "Trebuchet MS",sans-serif;"><b><u>Approach: </u></b></span><br />
<span style="font-family: "Trebuchet MS",sans-serif;"><br /></span>
<span style="font-family: "Trebuchet MS",sans-serif;">Lets start with a simple approach, </span><br />
<span style="font-family: "Trebuchet MS",sans-serif;"><br /></span>
<span style="font-family: 'Trebuchet MS', sans-serif;">The most naive solution would be to iterate over all the possible substrings of the array </span><br />
<span style="font-family: 'Trebuchet MS', sans-serif;">(~ n ^ 2) and then validate if the substrings have atmost two unique characters.</span><br />
<span style="font-family: 'Trebuchet MS', sans-serif;">The complexity will go over to O(n^3), proof is left to the reader.</span><br />
<span style="font-family: "Trebuchet MS",sans-serif;"><br /></span></div>
<div dir="ltr" style="text-align: left;" trbidi="on">
<span style="font-family: "Trebuchet MS",sans-serif;">Can we do it better, indeed yes, </span><br />
<span style="font-family: "Trebuchet MS",sans-serif;"><br /></span>
<span style="font-family: "Trebuchet MS",sans-serif;"></span><br />
<a name='more'></a><span style="font-family: "Trebuchet MS",sans-serif;"><br /></span><br />
<span style="font-family: "Trebuchet MS",sans-serif;"><br /></span>
<span style="font-family: "Trebuchet MS",sans-serif;">An important observation is that we should break when we have the distinct characters greater than 2 and we should not be computing the further substrings with the same prefix.</span><br />
<span style="font-family: "Trebuchet MS",sans-serif;">Also we need not find the distinct characters in each substring, rather we can just compute the largest length substring with a starting index with atmost 2 different characters, and length of the substring found is number of substrings which can be formed staring for a given index.</span><br />
<span style="font-family: "Trebuchet MS",sans-serif;">For e.g. aabbac</span><br />
<span style="font-family: "Trebuchet MS",sans-serif;">For the 0th index the aabba is the longest substring with atmost 2 different characters,</span><br />
<span style="font-family: "Trebuchet MS",sans-serif;">and indeed the number of strings which can be formed starting with 0th index is 5</span></div>
<div dir="ltr" style="text-align: left;" trbidi="on">
<span style="font-family: "Trebuchet MS",sans-serif;">which are a, aa, aab, aabb, aabba.</span></div>
<div dir="ltr" style="text-align: left;" trbidi="on">
<span style="font-family: "Trebuchet MS",sans-serif;">The above approach can be implemented by summation of the largest substrings of atmost 2 characters possible with each index element </span></div>
<div dir="ltr" style="text-align: left;" trbidi="on">
<span style="font-family: "Trebuchet MS",sans-serif;">The complexity boils down to O(n^2)</span></div>
<div dir="ltr" style="text-align: left;" trbidi="on">
<span style="font-family: "Trebuchet MS",sans-serif;"><br /></span>
<span style="font-family: "Trebuchet MS",sans-serif;"><br /></span>
<span style="font-family: "Trebuchet MS",sans-serif;">Can we still do better ?</span></div>
<div dir="ltr" style="text-align: left;" trbidi="on">
<span style="font-family: "Trebuchet MS",sans-serif;">A little pen and paper work will make us realize that there are lot of computations which are done repeatedly.</span><br />
<span style="font-family: "Trebuchet MS",sans-serif;"><br /></span></div>
<div dir="ltr" style="text-align: left;" trbidi="on">
<span style="font-family: "Trebuchet MS",sans-serif;">Once we know that the largest substring starting at index i is substring (i,j) that contains at most 2 elements.</span></div>
<div dir="ltr" style="text-align: left;" trbidi="on">
<span style="font-family: "Trebuchet MS",sans-serif;">Now to figure out the largest substring for the index i+1, should we again compute from i + 1 to j, but infact we just computed in previous iteration so why not store the result and use it back. This technique is often termed as memorisation in the computing terms.</span><br />
<span style="font-family: "Trebuchet MS",sans-serif;"><br /></span></div>
<div dir="ltr" style="text-align: left;" trbidi="on">
<span style="font-family: 'Trebuchet MS', sans-serif;">So the algorithm looks like</span></div>
<div dir="ltr" style="text-align: left;" trbidi="on">
<span style="font-family: "Trebuchet MS",sans-serif;">Keep track of the characters and their count till the distinct characters are less than 2 </span></div>
<div dir="ltr" style="text-align: left;" trbidi="on">
<span style="font-family: "Trebuchet MS",sans-serif;">At each successive iteration we need to remove the last previous index from the tracking list.</span></div>
<div dir="ltr" style="text-align: left;" trbidi="on">
<span style="font-family: "Trebuchet MS",sans-serif;">Return the result as the sum of the largest substrings formed at each index.</span></div>
<div dir="ltr" style="text-align: left;" trbidi="on">
<span style="font-family: "Trebuchet MS",sans-serif;">The running time complexity reduces to O(n)</span></div>
<div dir="ltr" style="text-align: left;" trbidi="on">
<span style="font-family: "Trebuchet MS",sans-serif;">Below is a implementation of the above logic in C </span></div>
<div dir="ltr" style="text-align: left;" trbidi="on">
<br /></div>
<pre class="brush: cpp;">int isInArray(int a[2][2], int n, int k) {
if(n > 2) return -1;
if(n == 1) {
if(a[0][0] == k) {
a[0][1]++;
return 1;
} else {
a[1][0] = k;
a[1][1] = 1;
return 2;
}
} else if(n == 2) {
if(a[0][0] == k) {a[0][1]++; return 2;}
if(a[1][0] == k) {a[1][1]++; return 2;}
return -1;
}
return -1;
}
int removeFromArray(int a[2][2], int k) {
if(a[0][0] == k) {
a[0][1]--;
if(a[0][1] <= 0) {
a[0][0] = a[1][0];
a[0][1] = a[1][1];
return 1;
}
return 2;
} else if(a[1][0] == k) {
a[1][1]--;
if(a[1][1] <= 0) {
return 1;
}
return 2;
}
return 2;
}
int numberOfSubstrings ( string A ) {
int len = A.length();
int res = 0, j = 1, c = 1, a[2][2];
a[0][0] = A[0]; a[0][1] = 1;
for(int i=0;i<len;i++) {
for (;j<len; j++) {
c = isInArray(a, c, A[j]);
if(c == -1) break;
}
c = removeFromArray(a,A[i]);
res = (res + j-i);
}
return res;
}
</pre>
</div>
Aviralhttp://www.blogger.com/profile/11920144614598355124noreply@blogger.com5tag:blogger.com,1999:blog-3418265334198879901.post-55126189047582726402012-03-22T12:16:00.005+05:302015-03-21T13:23:32.372+05:30[Amazon Interview] Compare the BSTs<div dir="ltr" style="text-align: left;" trbidi="on">
<span style="font-family: "Trebuchet MS",sans-serif;"><br /></span>
<span style="font-family: "Trebuchet MS",sans-serif;">Given two unsorted integer arrays, your task is to compare the BST formed by both the arrays.</span><br />
<span style="font-family: "Trebuchet MS",sans-serif;"><br /></span>
<span style="font-family: "Trebuchet MS",sans-serif;">e.g [3 2 1 4 5] & [3 4 2 5 1]</span><br />
<span style="font-family: "Trebuchet MS",sans-serif;">when the BST is formed by taking the elements from the left, both BST turn out to be same.</span><br />
<span style="font-family: "Trebuchet MS",sans-serif;"><br /></span>
<span style="font-family: "Trebuchet MS",sans-serif;"> 3</span><br />
<span style="font-family: "Trebuchet MS",sans-serif;"> / \</span><br />
<span style="font-family: "Trebuchet MS",sans-serif;"> 2 4</span><br />
<span style="font-family: "Trebuchet MS",sans-serif;"> / \</span><br />
<span style="font-family: "Trebuchet MS",sans-serif;"> 1 5</span><br />
<span style="font-family: "Trebuchet MS",sans-serif;"><br /></span>
<span style="font-family: "Trebuchet MS",sans-serif;">Expected time complexity O(n).</span><br />
<span style="font-family: "Trebuchet MS",sans-serif;"><br /></span>
<span style="font-family: "Trebuchet MS",sans-serif;"></span><br />
<a name='more'></a><span style="font-family: "Trebuchet MS",sans-serif;"><br /></span><br />
<span style="font-family: "Trebuchet MS",sans-serif;"><br /></span>
<span style="font-family: "Trebuchet MS",sans-serif;"><b>Approach:</b></span><br />
<span style="font-family: "Trebuchet MS",sans-serif;">First observation is that the first element of the array forms the root of the BST.</span><br />
<span style="font-family: "Trebuchet MS",sans-serif;">So the first element needs to be equal of both the arrays.</span><br />
<span style="font-family: "Trebuchet MS",sans-serif;">Now the next left element which gets added to the BST is the next smaller element in the array, and same is true for the next right element in the BST.</span><br />
<span style="font-family: "Trebuchet MS",sans-serif;"><br /></span>
<span style="font-family: "Trebuchet MS",sans-serif;">So the sequence of the elements of the less than the the first element should be same in both arrays</span><br />
<span style="font-family: "Trebuchet MS",sans-serif;"><br /></span>
<span style="font-family: "Trebuchet MS",sans-serif;">And the same is true for the elements greater than the root element</span><br />
<span style="font-family: "Trebuchet MS",sans-serif;"><br /></span>
<span style="font-family: "Trebuchet MS",sans-serif;">So if the first array contains elements {9, 14, 8, 11, 4, 7, 15, 10, 6}</span><br />
<span style="font-family: "Trebuchet MS",sans-serif;">so any array which forms the same BST should have the elements of the sort</span><br />
<span style="font-family: "Trebuchet MS",sans-serif;">{9, ., 14, ..,11, .., 15, .., 10} & {9, .., 8, .., 4, .., 7, .., 6}</span><br />
<span style="font-family: "Trebuchet MS",sans-serif;"><br /></span>
<span style="font-family: "Trebuchet MS",sans-serif;">Both the preconditions can be verified trivially by two scans over the arrays.</span></div>
Aviralhttp://www.blogger.com/profile/11920144614598355124noreply@blogger.com10tag:blogger.com,1999:blog-3418265334198879901.post-28364865052168906072012-02-08T11:49:00.000+05:302014-11-04T22:41:47.001+05:30[Amazon Online Test] : Finding the inorder successor<div dir="ltr" style="text-align: left;" trbidi="on">
<span style="font-family: "Trebuchet MS",sans-serif;">Given a binary search tree with the following node structure</span><br />
<span style="font-family: "Trebuchet MS",sans-serif;"><br /></span>
<span style="font-family: "Trebuchet MS",sans-serif;">struct tree {</span><br />
<span style="font-family: "Trebuchet MS",sans-serif;"> int data;</span><br />
<span style="font-family: "Trebuchet MS",sans-serif;"> struct tree *left;</span><br />
<span style="font-family: "Trebuchet MS",sans-serif;"> struct tree *right;</span><br />
<span style="font-family: "Trebuchet MS",sans-serif;"> struct tree *next;</span><br />
<span style="font-family: "Trebuchet MS",sans-serif;">};</span><br />
<span style="font-family: "Trebuchet MS",sans-serif;">The next pointer of each node is pointing to null.</span><br />
<span style="font-family: "Trebuchet MS",sans-serif;">Write a code to initialize the next pointer of each node to its inorder successor.</span><br />
<br />
<b><span style="font-family: "Trebuchet MS",sans-serif;">Approach:</span></b><br />
<br />
<span style="font-family: "Trebuchet MS",sans-serif;">Traverse in the BST in reverse inorder manner(i.e. postorder) and initialize the inorder successor as the last element visted.</span><br />
<span style="font-family: "Trebuchet MS",sans-serif;"><br /></span>
<span style="font-family: "Trebuchet MS",sans-serif;">Below piece of code initializes the next element to the inorder successor.</span><br />
<br />
<pre class="brush: cpp;">void inorder_successor(struct node * root) {
static struct node * current = NULL;
if(root == NULL)
return;
inorder(root->right);
root->next = current;
current = root;
inorder(root->left);
return;
}
</pre>
</div>Aviralhttp://www.blogger.com/profile/11920144614598355124noreply@blogger.com2tag:blogger.com,1999:blog-3418265334198879901.post-53661986846919628892012-02-02T00:06:00.000+05:302015-03-21T13:24:04.642+05:30Euler problem : Finding the minimum sum<div dir="ltr" style="text-align: left;" trbidi="on">
<span style="font-family: "Trebuchet MS",sans-serif;">In the 5 by 5 matrix below, the minimal path sum from the top left to the bottom right, by <b>only moving to the right and down</b>, is indicated in bold red and is equal to 2427.</span><br />
<br />
<table align="center" border="0" cellpadding="0" cellspacing="0"><tbody>
<tr><td><img align="middle" alt="" src="http://projecteuler.net/images/bracket_left.gif" height="120" width="8" /></td> <td><table border="0" cellpadding="3" cellspacing="0"><tbody>
<tr> <td><span style="color: #dd0000;"><b>131</b></span></td><td>673</td><td>234</td><td>103</td><td>18</td> </tr>
<tr> <td><span style="color: #dd0000;"><b>201</b></span></td><td><span style="color: #dd0000;"><b>96</b></span></td><td><span style="color: #dd0000;"><b>342</b></span></td><td>965</td><td>150</td> </tr>
<tr> <td>630</td><td>803</td><td><span style="color: #dd0000;"><b>746</b></span></td><td><span style="color: #dd0000;"><b>422</b></span></td><td>111</td> </tr>
<tr> <td>537</td><td>699</td><td>497</td><td><span style="color: #dd0000;"><b>121</b></span></td><td>956</td> </tr>
<tr> <td>805</td><td>732</td><td>524</td><td><span style="color: #dd0000;"><b>37</b></span></td><td><span style="color: #dd0000;"><b>331</b></span></td> </tr>
</tbody></table>
</td> <td><img align="middle" alt="" src="http://projecteuler.net/images/bracket_right.gif" height="120" width="8" /></td></tr>
</tbody></table>
<br />
<span style="font-family: "Trebuchet MS",sans-serif;"><br /></span>
<span style="font-family: "Trebuchet MS",sans-serif;"><br /></span>
<span style="font-family: "Trebuchet MS",sans-serif;">This can be solved by an easy application of the DP.</span><br />
<span style="font-family: "Trebuchet MS",sans-serif;">A nice variation of the above problem is to find the minimal path sum from the top left to the bottom right, by moving left, right, up, and down, is indicated in bold red and is equal to 2297.</span><br />
<br />
<br />
<table align="center" border="0" cellpadding="0" cellspacing="0"><tbody>
<tr><td><img align="middle" alt="" src="http://projecteuler.net/images/bracket_left.gif" height="120" width="8" /></td> <td><table border="0" cellpadding="3" cellspacing="0"><tbody>
<tr> <td><span style="color: #dd0000;"><b>131</b></span></td><td>673</td><td><span style="color: #dd0000;"><b>234</b></span></td><td><span style="color: #dd0000;"><b>103</b></span></td><td><span style="color: #dd0000;"><b>18</b></span></td> </tr>
<tr> <td><span style="color: #dd0000;"><b>201</b></span></td><td><span style="color: #dd0000;"><b>96</b></span></td><td><span style="color: #dd0000;"><b>342</b></span></td><td>965</td><td><span style="color: #dd0000;"><b>150</b></span></td> </tr>
<tr> <td>630</td><td>803</td><td>746</td><td><span style="color: #dd0000;"><b>422</b></span></td><td><span style="color: #dd0000;"><b>111</b></span></td> </tr>
<tr> <td>537</td><td>699</td><td>497</td><td><span style="color: #dd0000;"><b>121</b></span></td><td>956</td> </tr>
<tr> <td>805</td><td>732</td><td>524</td><td><span style="color: #dd0000;"><b>37</b></span></td><td><span style="color: #dd0000;"><b>331</b></span></td> </tr>
</tbody></table>
</td> <td><img align="middle" alt="" src="http://projecteuler.net/images/bracket_right.gif" height="120" width="8" /></td></tr>
</tbody></table>
<br />
<br /></div>
Aviralhttp://www.blogger.com/profile/11920144614598355124noreply@blogger.com8tag:blogger.com,1999:blog-3418265334198879901.post-88078013765970878322012-01-24T23:57:00.002+05:302014-02-23T10:52:50.446+05:30Euler Problem: Pandigital number<div dir="ltr" style="text-align: left;" trbidi="on">
<span style="font-family: "Trebuchet MS",sans-serif;">Multiplying 9 by 1, 2, 3, 4, and 5, gives the pandigital, 918273645, which is the concatenated product of 9 and (1,2,3,4,5).</span><br />
<span style="font-family: "Trebuchet MS",sans-serif;"><br /></span>
<span style="font-family: "Trebuchet MS",sans-serif;">What is the largest 1 to 9 pandigital 9-digit number that can be formed as the concatenated product of an integer with (1,2, ... , n) where n >1?</span><br />
<span style="font-family: "Trebuchet MS",sans-serif;"><br /></span>
<span style="font-family: "Trebuchet MS",sans-serif;">Its fun to solve the problem without the use of code :)</span></div>
Aviralhttp://www.blogger.com/profile/11920144614598355124noreply@blogger.com2tag:blogger.com,1999:blog-3418265334198879901.post-39379950310673775202012-01-21T13:21:00.001+05:302015-03-21T13:24:40.176+05:30[Amazon Online Test] Find the nodes at k distance.<div dir="ltr" style="text-align: left;" trbidi="on">
<span style="font-family: "Trebuchet MS",sans-serif;">Given a tree with the root and a particular node, find the nodes which are atmost at a distance of k from the particular node and print them in sorted order.</span><br />
<span style="font-family: "Trebuchet MS",sans-serif;"><br /></span>
<span style="font-family: "Trebuchet MS",sans-serif;"><br /></span>
<span style="font-family: "Trebuchet MS",sans-serif;"><b> Approach:</b></span><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://www.blogger.com/blogger.g?blogID=3418265334198879901" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img alt="" border="0" height="200" src="data:image/png;base64,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OPBMof3798NC4Yp6I/NzRBQKhmolpUmMQ4r19fXffvutRqMJCQmBzEyXnJg56PX6ZcuWjRkzZuvWrTgppNBK82dqUihUKylKjAsYwS+Gv3/++adKpXrmmWe65uTMAAc6XVxc7O3ti4qK8FNYK/GalBSKmVCtpJgAyyXICmysqanZvn17aGhoUFAQx3Hx8fHIjOUcugS9Xp+YmChJ0rx582BSkKIglPyAXXSOlL8ZVCspSvDaXoiI6BUWFq5Zs+aJJ574v//7v7Vr1zo6Ok6dOvXO9MHh/L29ve3t7V977bVdu3bduHEDNaxvrkivU62kmAnVSoppcN65pqbm0KFDixYt+r//+79Bgwa9/fbbeXl5zz//vFqtTktLg9Vl7yhkWd63b59areY4TqvVjho1KiQk5NSpU9gEtnh2JuVehmolRQleeREhVF5evm3bNhcXFysrK0EQYmNjb968KctyYmIix3He3t5de6omqaysnDBhgiiKn3/++RtvvPH000/36dNn5syZqampRUVFioUoaP8hiplQraSYRpbls2fPrlixYtCgQQ888MC8efP27dtHCo2fnx/HcbGxsV17nsbExMQIggAF85cuXdqyZYuXl9cjjzzi6Oi4du3a3NxcaJpJfXBKq6Baea9DOqQghfX19fX19WlpaX5+ft27dx86dGhkZOT58+fJ/fV6/fnz56HdWV5eHj4ariTvHHtN8S4GgyE/P5/jOEmScnJy4NnKysqMjIzXX399yJAhdnZ2L730UlJS0u3bt5FR/03spN+ZCStK10K18p5GUWcO4nLjxo2oqChYjdbDwyMuLg4UEDWIC1aoiIgIlmX9/PwqKytx4NKyBsAWg7W+tra2vLzcy8tLo9F8+OGH8CxutVlaWhobG+vm5ta/f39JklatWnXhwgXYh8ySm7OOEOXehGrlPQ256Db8PXbs2OLFi/v37z9w4MCgoKDjx4/DnlDOjf1WrJ5z5szheT40NBQfEzS3EzInxrr27rvvqlSqF154ARndBurq6srLy/fv3//yyy8PGTJkwIABQUFBP/zwQ2VlJWpsCJuceUmhUK28p8GiUFtbq9PpvvvuO3d39549ezo5OX344YcFBQWooRSRXIURv6qmpqagoMDFxUWSpKVLl3ZVngSm34SEhKhUKnd399LSUizlxinvP//88/PPP3d1dR0wYICz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" style="cursor: move;" width="200" /></a></div>
<br />
<span style="font-family: "Trebuchet MS",sans-serif;">Lets say the given tree is</span><br />
<span style="font-family: "Trebuchet MS",sans-serif;"><br /></span>
<span style="font-family: "Trebuchet MS",sans-serif;"><br /></span>
<span style="font-family: "Trebuchet MS",sans-serif;">And the given node is of the value 50, and distance k = 3</span><br />
<span style="font-family: "Trebuchet MS",sans-serif;">Then the desired result is 5, 30, 50, 70, 90</span><br />
<span style="font-family: "Trebuchet MS",sans-serif;"><br /></span>
<span style="font-family: "Trebuchet MS",sans-serif;"></span><br />
<a name='more'></a><span style="font-family: "Trebuchet MS",sans-serif;"><br /></span><br />
<span style="font-family: "Trebuchet MS",sans-serif;"><br /></span>
<span style="font-family: "Trebuchet MS",sans-serif;">The task can be broken down to below sub tasks</span><br />
<span style="font-family: "Trebuchet MS",sans-serif;">1.To find the desired node</span><br />
<span style="font-family: "Trebuchet MS",sans-serif;">2. Find and store all the elements in its vicinity of distance k</span><br />
<span style="font-family: "Trebuchet MS",sans-serif;">3. Sort the nodes by value and print the same.</span><br />
<span style="font-family: "Trebuchet MS",sans-serif;"><br /></span>
<span style="font-family: "Trebuchet MS",sans-serif;">Obviously the recursion is the key, we recursively iterate over the nodes of the tree and as soon as the target node is found, we publish this result to the calling function so that all the nodes can be stored</span><br />
<span style="font-family: "Trebuchet MS",sans-serif;"><br /></span>
<span style="font-family: "Trebuchet MS",sans-serif;">The below code snippet prints the nodes at a distance of atmost k. </span><br />
<br />
<pre class="brush: cpp;">int printNodeAtKrec(struct tree * root, struct tree * target, int k, vector <int> &v, int n) {
if(root == NULL)
return 0;
int left = 0, right = 0, level = n;
if(root == target)
level = k;
left = printNodeAtKrec(root->left, target, k, v, level - 1);
level = max(level, left);
right = printNodeAtKrec(root->right, target, k, v, level - 1);
if(right > 0 && level < 0) {
level = right;
printNodeAtKrec(root->left, target, k, v, level - 1);
}
if(level > 0)
v.push_back(root->data);
return level - 1;
}
void printNodeAtK(struct tree * t, struct tree * r, int k) {
vector <int> v;
printNodeAtKrec(t, r, k + 1, v, 0);
sort(v.begin(), v.end());
for(int i = 0; i < v.size(); i++)
cout<<v[i]<<endl;
}</pre>
</div>
Aviralhttp://www.blogger.com/profile/11920144614598355124noreply@blogger.com9tag:blogger.com,1999:blog-3418265334198879901.post-16613803612095832532011-12-20T09:56:00.000+05:302015-04-06T02:16:01.515+05:30Calculating the multiplicative inverse<div dir="ltr" style="text-align: left;" trbidi="on">
<span style="font-family: Trebuchet MS, sans-serif;">Given a number x, find its multiplicative inverse y for a given modulo N</span><br />
<span style="font-family: Trebuchet MS, sans-serif;">i.e. (x*y) == 1(MOD N)</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">Where the multiplicative inverse is useful?</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">Lets assume we need to compute ((a1 * a2 *....)/(b1 * b2 * .....)) mod N</span><br />
<span style="font-family: Trebuchet MS, sans-serif;">1 simple way is to compute the above expression as</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"></span><br />
<a name='more'></a><span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<br />
<pre class="brush: cpp;">long long res = 1;
for(int i = 0; i < n; i++)
res *= a[i];
for (int i = 0; i < n; i++)
res /= b[i];
res %= MOD;
</pre>
<br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">But, wait there is a catch, what if a1* a2 * .... overflows the long long range or the datatype under use?</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">So what are the possible options. Some people might fall into the trap </span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">res = (res * a[i]) % MOD;</span><br />
<span style="font-family: Trebuchet MS, sans-serif;">res = (res /a[i]) % MOD;</span><br />
<br />
<span style="font-family: Trebuchet MS, sans-serif;">While first statement is perfectly correct, but the subsequent divisions operations are incorrect.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;">You can pick some of the examples to reason it out!</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">So moving ahead, one most common 'trick' which would hit us would be, how we used to perform these operations in our early school days.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">Get the prime factorizations of a1, a2, a3...., b1, b2, b3, </span><br />
<span style="font-family: Trebuchet MS, sans-serif;">And then cancel out the common factors,</span><br />
<span style="font-family: Trebuchet MS, sans-serif;">Then the problem reduces to find the multiplication of the left out factors(lets say c[]) which can be done by </span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<br />
<pre class="brush: cpp;">for(int i = 0; i < n; i++)
res = (res * c[i]) % MOD;</pre>
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">But sooner or later you would realise, this easy looking task is actually quite expensive. Infact the good methods would take around O(sqrt(n)) per number to factorize itself.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;">So for (n + n) numbers with average value of x the overall complexity would be </span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">n * O(sqrt(x))</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">With this approach as the average value x increases the code would timeout for most of the cases.</span><br />
<br />
<span style="font-family: Trebuchet MS, sans-serif;">So whats next? Most of us who are familiar with the set theory would be thinking about the possibility of computing the multiplicative inverse.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;">So formally, for a number x, a number y is a multiplicative inverse if </span><br />
<span style="font-family: Trebuchet MS, sans-serif;">(x * y) % N = 1 or </span><br />
<span style="font-family: 'Trebuchet MS', sans-serif;">(x * y) == 1(MOD N)</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">A naive implementation to compute the inverse would be to try y for all the numbers between 1 to N - 1 and find the suitable match.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">Well, there is a Fermat's Little theorem which could help us here, if MOD is prime number then the inverse can be given by</span><br />
<br />
<img alt="a^{m-2} \equiv a^{-1} \pmod{m}." class="latex" height="18" scale="2" src-orig="https://s0.wp.com/latex.php?latex=a%5E%7Bm-2%7D+%5Cequiv+a%5E%7B-1%7D+%5Cpmod%7Bm%7D.&bg=ffffff&fg=1c1c1c&s=0" src="https://s0.wp.com/latex.php?zoom=2&latex=a%5E%7Bm-2%7D+%5Cequiv+a%5E%7B-1%7D+%5Cpmod%7Bm%7D.&bg=ffffff&fg=1c1c1c&s=0" style="background-color: white; border: none; color: #222222; font-family: 'Lucida Grande', 'Lucida Sans Unicode', Helvetica, Arial, sans-serif; font-size: 13px; line-height: 19.5px; margin: 0px 5px; padding: 2px; vertical-align: middle;" title="a^{m-2} \equiv a^{-1} \pmod{m}." width="155" /><br />
<br />
<br />
The a ^ n can be calculated in O(log n) time, for details you can refer <a href="http://coders-stop.blogspot.in/2010/12/compute-powerxn-in-logn-steps.html" target="_blank">here</a><br />
<br />
So the overall complexity boils down to n * O(log M)<br />
<br />
So what do we do if the MOD value is not a prime number? Can we solution this based on Fermat's theorem? This is left as an exercise to the reader :)<br />
<br />
Sidenote, there are several other methods to achieve in a more optimised way.</div>
Aviralhttp://www.blogger.com/profile/11920144614598355124noreply@blogger.com0tag:blogger.com,1999:blog-3418265334198879901.post-64992016384740379262011-12-10T17:29:00.001+05:302015-03-11T21:12:59.692+05:30[Amazon Interview] Finding the shortest path<div dir="ltr" style="text-align: left;" trbidi="on">
<span style="font-family: "Trebuchet MS",sans-serif;">Given a matrix having non negative integers you have to find the shortest path from one point to another within the matrix. The cost of path is all the matrix entries on the way. You can move in any direction (up, down, left, right, diagonally)</span><br />
<span style="font-family: "Trebuchet MS",sans-serif;">e.g.</span><br />
<span style="font-family: "Trebuchet MS",sans-serif;">5 9 10 1</span><br />
<span style="font-family: "Trebuchet MS",sans-serif;">3 7 4 4</span><br />
<span style="font-family: "Trebuchet MS",sans-serif;">8 2 1 9</span><br />
<span style="font-family: "Trebuchet MS",sans-serif;">So shortest path from (0,0) to (2,2) - 5+3+2+1 = 11</span><br />
<span style="font-family: "Trebuchet MS",sans-serif;"><br /></span>
<span style="font-family: "Trebuchet MS",sans-serif;"><b>Approach:</b></span><br />
<span style="font-family: "Trebuchet MS",sans-serif;"><br /></span>
<span style="font-family: "Trebuchet MS",sans-serif;">The matrix can be easily converted to a graph with each element having its neighbors as the up, down, left, right and diagonal elements.</span><br />
<span style="font-family: "Trebuchet MS",sans-serif;">Just pass this graph into any one of the Single source shortest path algorithm and you will find the minimum distance between the two elements </span><br />
<span style="font-family: "Trebuchet MS",sans-serif;"><br /></span>
<span style="font-family: "Trebuchet MS",sans-serif;">Can we do better ?</span></div>
Aviralhttp://www.blogger.com/profile/11920144614598355124noreply@blogger.com0tag:blogger.com,1999:blog-3418265334198879901.post-79183993200479581932011-10-21T06:18:00.000+05:302015-03-21T13:50:44.096+05:30Maximising the duration<div dir="ltr" style="text-align: left;" trbidi="on">
<span style="font-family: Trebuchet MS, sans-serif;">There is a TV avid person, who wants to spend his maximum time on TV. There are N channels that telecast programs of different length at different timings. Find the program and channel number so that the person can spend his max time on TV. If the person watches a program, he watches it completely.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">For e.g</span><br />
<span style="font-family: Trebuchet MS, sans-serif;">Channel1:</span><br />
<span style="font-family: Trebuchet MS, sans-serif;">prg1: 8:00 am - 9:00am</span><br />
<span style="font-family: Trebuchet MS, sans-serif;">prg2: 9:30 am - 12:00 am</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">Channel2:</span><br />
<span style="font-family: Trebuchet MS, sans-serif;">prg1: 8:15 am - 9:30am</span><br />
<span style="font-family: Trebuchet MS, sans-serif;">prg2: 9:30 am - 11:45 am</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">In this case, between 8:00 AM to 12:00 noon, the answer is:</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">ch2/prg1 + ch1/prg2</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<b><span style="font-family: Trebuchet MS, sans-serif;">Approach:</span></b><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">Sort the programs with the end times. And then apply the greedy algorithm to find the maximum duration. </span></div>
Aviralhttp://www.blogger.com/profile/11920144614598355124noreply@blogger.com1