In many problems i see the tag "two pointers". I assume its a technique. I dont have an idea on it can anybody give any type of reference. Thanks.
# | User | Rating |
---|---|---|
1 | tourist | 3985 |
2 | jiangly | 3814 |
3 | jqdai0815 | 3682 |
4 | Benq | 3529 |
5 | orzdevinwang | 3526 |
6 | ksun48 | 3517 |
7 | Radewoosh | 3410 |
8 | hos.lyric | 3399 |
9 | ecnerwala | 3392 |
9 | Um_nik | 3392 |
# | User | Contrib. |
---|---|---|
1 | cry | 169 |
2 | maomao90 | 162 |
2 | Um_nik | 162 |
4 | atcoder_official | 161 |
5 | djm03178 | 158 |
6 | -is-this-fft- | 157 |
7 | adamant | 155 |
8 | awoo | 154 |
8 | Dominater069 | 154 |
10 | luogu_official | 151 |
In many problems i see the tag "two pointers". I assume its a technique. I dont have an idea on it can anybody give any type of reference. Thanks.
Name |
---|
I will try to describe this method on example of a problem.
Given two arrays (A and B) sorted in ascending order, and an integer x. we need to find i and j, such that a[i] + b[j] is equal to X.
i and j our pointers, at first step i is points to the first element of a, and j points to the last element of b.
move first pointer one by one through the array a, and correct position of the second pointer if needed
Also, there was the same question in Russian, maybe it can helps. link to google-translated version
http://codeforces.net/blog/entry/4136
In addition to post of goo.gl_SsAhv:
The feature of this method is that solutions are O(n) (n=b.size() using his terminology) despite of possibility of decreasing second pointer with O(n) while 1 iteration of outer cycle made. It's right because every pointer will change only O(n) times.
amm... should it not be O(a.size()+b.size()) in worst case like if x=101 , a=1 2 5 7 8 100 , b= 1 2 3 4 47
and what if we have to find all the pairs that sums up to X ?
the same approach works as well, just continue moving your pointers and count the number of pairs.
actually the "writeAnswer" function in goo.gl_SsAhv code will be called for all such pairs
I guess in that case we need to do this : writeAnswer(i++,j--), right ?
no. this code works fine:
this code may not work when the array values is not unique, anyway the main point is to understand two pointers technique
i guess writeAnswer(i++,j--); thingy would also work provided all elements in the array are unique.
I don't think so, try it up and see why :)
can you think of a test case where my idea fails. Because for almost all inputs that i have, its working fine !
well, it gave me as expected, it gave me two pairs : 1,5 2,4
hence passed !
correct output:
i came up with this problem : http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=show_problem&problem=515
it reminded me of almost the same algorithm as used here except it needs perhaps more than two pointers.
can you help me in figuring out how to approach above mentioned problem given in the link.
it is just a bruteforce. There is total 2^12 subsets, try all.
is there any more efficient algorithm if input size is much larger than this complete search ?
answer can be vey big, so there is no big difference. there is O(sum * n * n + total_size_of_answer) dfs like approach. vertex is a pair (sum, last_used_number). in this graph you have to find all paths between two vertices, but the anwser can be very big as it mentioned above.
Is there any condition for arrays 'a' and 'b', like all the elements will be unique or others? If not, then how your given code will give correct ans under the following condition:
@goo.gl_SsAhv
Why don't you try it for yourself?
If you mean "why the possible answer
i=0, j=3
is not displayed", well, be more specific next time, and it's because the original problem is to find any one pair of indices. What if the problem asks to find all such pairs?The maximum running time is O(mn) instead of O(m+n), e.g., when
X=2
and all elements ofa
andb
are equal to1
. So we can actually use the straightforward algorithm (for i
,for j
,check a[i]+b[j]
) instead of the two pointers method.The above bound can be improved to O(s) where s is the number of pairs in the answer. You can still patch the algorithm (while equal, go up and down) to make it output all s pairs in O(s).
If you need the number of pairs and not the pairs themselves, it can also be done in O(m+n) by maintaining highest and lowest possible values of j instead of a single variable.
And since
X - a[ i ]
is independent of the second pointerj
, your two-pointers example can be rewritten as follows.If array elements are not distinct, the worst case is when all elements of both arrays are equal and the sum we are looking for is a[0] + b[0]. In this case all n2 pairs of indices form the needed summation, thus the best approach is an O(n2) brute force, so an O(n) solution will not work.
If you need the indices of all pairs, you may have O(n^2) results, so a O(n) is not possible, but if you need just how many index pairs there are, it's still solveable in O(n), just count how many there equal there are of a and b, and result is equalA*equalB.