介绍:
双指针应用有多种

  • 归并排序应用

image.png

  • 快速排序应用

image.png

image.png

y总的模板:
image.png

一:例题1

题目测试的时候可以通过acwing随便一个题进行输入输出测试。用ACWINGC测试的时候gets无法通过,不知道网站的编译器有什么问题

题目描述:
实现单词拆分,并且每个单词空格输出
例如:
输入:abc def ghi
输出:
abc
def
ghi

核心思想: 本质就是两个指针分别定位起始和终止,其实位置的指针通过for完成定位,后面指针通过内部的while实现定位,注意每一轮的两个指针的更新。

个人觉得双指针算法的本质就是转换为时间复杂度O(2n),最终其实就是达到O(n)级别。

  1. #include <iostream>
  2. #include <string.h>
  3. using namespace std;
  4. int main () {
  5. char a[1000];
  6. gets(a);
  7. int n = strlen(a);
  8. for (int i = 0; i < n; i++) {
  9. int j = i; // 每输出一个单词以后就得把j定位到i位置
  10. while (j < n && a[j] != ' ') j++; // j定位到下一个空格的位置
  11. for (int k = i; k < j; k++) cout << a[k]; // 从i到j输出单词
  12. cout << endl;
  13. i = j; // i需要更新,for会自动把i从空格位置 + 1
  14. }
  15. return 0;
  16. }

二:最长连续不重复子序列

没找到题目,只能在clion上面自己敲。

题目:
从一组数中,找到连续不重复的子序列,计算这个子序列的个数

输入:
5 (数组元素个数)
1 2 3 4 4(数组元素)
输出:
4 (1 2 3 4作为连续不重复的四个数字)

  1. #include <iostream>
  2. using namespace std;
  3. const int N = 100010;
  4. int n;
  5. int s[N], a[N];
  6. int main() {
  7. cin >> n;
  8. for (int i = 0; i < n; i++) {
  9. cin >> a[i];
  10. }
  11. int res = 0;
  12. for (int i = 0, j = 0; i < n; i++) { // 依然是双指针的思路,但是这个题需要借助s[]数组,判断i到j之间有没有重复元素
  13. s[a[i]]++; // i指针每向后移动一位的时候,计数数组对应的元素个数就需要加一。
  14. while (s[a[i]] > 1) { // 如果s数组这个元素个数大于1,说明i到j区间有重复,有重复了,j就得不断向i靠,消除重复元素
  15. s[a[j]]--; // 有重复元素,不仅仅j指针需要向后,计数数组也需要去掉j对应的元素
  16. j++;
  17. }
  18. res = max(res, i - j + 1); // 选择最大的
  19. }
  20. cout << res << endl;
  21. return 0;
  22. }