5
\$\begingroup\$

I wrote a solution to this question. The task is to take an input of n increasing positive integers (1 ≤ n ≤ 2∙105), each entry as large as 109, and find the length of the longest subsequence where each element is no more than double the previous element.

Example input

10
1 2 5 6 7 10 21 23 24 49

Example output

4

... because the longest subsequence is [5, 6, 7, 10].


My solution works for small numbers, but exceeds the time limit for big inputs.

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{ 
 int n,a,c=1,max_count=1;
 cin>>n;
 vector<int>v;
 for(int i=0;i<n;i++)
 {
 cin>>a;
 v.push_back(a);
}
for(int i=0;i<n;i++)
{
 int l=i+1;
 while((l<n)&&(v[l]<=2*v[i]))
 {
 c++;
 l++;
 max_count=max(max_count,c);
 }
 c=1;
}
cout<<""<<max_count;
return 0;
}
200_success
145k22 gold badges190 silver badges478 bronze badges
asked Sep 1, 2018 at 13:57
\$\endgroup\$

1 Answer 1

8
\$\begingroup\$

There is no need to store the entries in a vector. There is also no need for a nested loop. This solution will run in O(n) time and O(1) space.

Technically, int is only guaranteed to hold up to 16 bits. Use long to ensure that you can accommodate the limits.

Also, please avoid using namespace std;. You can drop the useless cout<<"".

#include <algorithm>
#include <iostream>
int main() {
 long n, a, seq_len = 0, longest = 0;
 std::cin >> n;
 for (long prev_a = 0; n--; prev_a = a) {
 std::cin >> a;
 if (a <= 2 * prev_a) {
 seq_len++;
 } else {
 seq_len = 1;
 }
 longest = std::max(longest, seq_len);
 }
 std::cout << longest << '\n';
}
answered Sep 1, 2018 at 15:06
\$\endgroup\$
1
  • \$\begingroup\$ A minor optimization, if you assign longest inside the else block before you re-assign seq_len, you only call max when a sequence ends, instead of at each iteration. \$\endgroup\$ Commented Sep 2, 2018 at 14:55

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.