双指针算法 主要思想:
帮助优化双循环算法,原本算法为O(n^2):
1 2 for (int i = 0 ; i < n; ++i) for (int j = 0 ; j < n; ++j)
可以将算法优化为O(n),此时双指针就像弹簧一样,i在前面扯着j往前移动,然后check它们中间那一段是否合格:
1 2 for (int i = 0 , j = 0 ; i < n; ++i) while (j < i && check (i, j)) j++;
基础题 给一个字符串,单词用空格隔开,输出每个单词
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 #include <iostream> #include <string> using namespace std;int main () { string input; getline (cin, input); for (int i = 0 ; input[i]; i++) { int j = i; while (j < input.size () && input[j] != ' ' ) j++; for (int k = i; k < j; ++k) cout << input[k]; cout << endl; i = j; } return 0 ; }
最长连续不重复子序列 给定一个长度为n的整数序列,请找出最长的不包含重复数字的连续子序列,输出它的长度。
输入:
输出:3 (2, 3, 5)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 #include <iostream> using namespace std;const int N = 100000 ;int q[N], s[N];int main () { int n; int result = 0 ; scanf ("%d" , &n); for (int i = 0 ; i < n; ++i) scanf ("%d" , &q[i]); for (int i = 0 , j = 0 ; i < n; ++i) { s[q[i]]++; while (s[q[i]] > 1 ) { s[q[j]]--; j++; } result = max (result, i - j + 1 ); } printf ("%d" , result); }