解决哪类问题

:::success 分为左右指针、快慢指针
左右指针:数组问题或字符串问题,如查找子字符串
快慢指针:链表问题 :::

代码模板

左右指针

  1. public int[] twoSum(int[] nums, int target) {
  2. int l = 0, r = nums.length - 1;
  3. while(l < r) {
  4. if(nums[l] + nums[r] == target) {
  5. return new int[]{l + 1, r + 1};
  6. } else if(nums[l] + nums[r] < target) {
  7. l++;
  8. } else {
  9. r--;
  10. }
  11. }
  12. return new int[]{-1, -1};
  13. }

快慢指针

  1. public ListNode findMiddle(ListNode head) {
  2. // 初始化,让快指针和慢指针都处于链表的头部
  3. ListNode slow = head;
  4. ListNode fast = head;
  5. while(fast != null && fast.next != null) {
  6. // 如果快指针并且下一个不为空
  7. fast = fast.next.next; //快指针移动两个
  8. slow = slow.next; //慢指针移动一个
  9. }
  10. return slow;
  11. }
  1. public boolean hasCycle(ListNode head) {
  2. if (head == null)
  3. return false;
  4. // 快慢两个指针,初始时都指向链表的头结点
  5. ListNode slow = head;
  6. ListNode fast = head;
  7. while (fast != null && fast.next != null) {
  8. // 慢指针每次走一步
  9. slow = slow.next;
  10. // 快指针每次走两步
  11. fast = fast.next.next;
  12. //如果相遇,说明有环,直接返回true
  13. if (slow == fast)
  14. return true;
  15. }
  16. // 否则就是没环
  17. return false;
  18. }
  1. public ListNode removeBackEndNode(ListNode head, int n) {
  2. if (head == null || head.next == null) {
  3. return null;
  4. }
  5. ListNode dummyHead = new ListNode(-1);
  6. dummyHead.next = head;
  7. // 初始时让快慢指针都指向链表的头部
  8. ListNode slow = dummyHead;
  9. ListNode fast = dummyHead;
  10. for (int i = 0; i < n + 1; i++) {
  11. fast = fast.next;
  12. }
  13. while (fast != null) {
  14. slow = slow.next;
  15. fast = fast.next;
  16. }
  17. slow.next = slow.next.next; //为了解决断链问题
  18. return dummyHead.next;
  19. }
  1. public boolean isPalindrome(ListNode head) {
  2. if(head == null || head.next == null){
  3. return true;
  4. }
  5. ListNode pre = null; // 指向前一个节点的指针
  6. ListNode slow = head; // 慢指针
  7. ListNode fast = head; // 快指针
  8. while(fast!=null&&fast.next!=null){
  9. fast = fast.next.next;
  10. ListNode next = slow.next;
  11. slow.next = pre; // 修改慢指针走过的节点指向前一个节点
  12. pre = slow;
  13. slow = next;
  14. }
  15. if(fast != null){
  16. slow = slow.next;
  17. //当长度为奇数是,慢指针需要再走一个单位
  18. }
  19. while(pre!=null) {
  20. //判断是否为回文串
  21. if(pre.val != slow.val){
  22. return false;
  23. }
  24. pre = pre.next;
  25. slow = slow.next;
  26. }
  27. return true;
  28. }

复杂度

O(n)

运用思想

例题

题目 难度 推荐指数
3. 无重复字符的最长子串 中等 🤩🤩🤩🤩🤩
11. 盛最多水的容器 中等 🤩🤩🤩🤩🤩
15. 三数之和 中等 🤩🤩🤩🤩🤩
16. 最接近的三数之和 中等 🤩🤩🤩🤩
18. 四数之和 中等 🤩🤩🤩🤩
19. 删除链表的倒数第 N 个结点 中等 🤩🤩🤩🤩🤩
26. 删除有序数组中的重复项 简单 🤩🤩🤩🤩
27. 移除元素 简单 🤩🤩🤩🤩
45. 跳跃游戏 II 中等 🤩🤩🤩🤩
88. 合并两个有序数组 简单 🤩🤩🤩
345. 反转字符串中的元音字母 简单 🤩🤩🤩
395. 至少有 K 个重复字符的最长子串 中等 🤩🤩🤩
413. 等差数列划分 中等 🤩🤩🤩🤩
424. 替换后的最长重复字符 中等 🤩🤩🤩🤩
438. 找到字符串中所有字母异位词 中等 🤩🤩🤩🤩
443. 压缩字符串 中等 🤩🤩🤩🤩
475. 供暖器 中等 🤩🤩🤩🤩
485. 最大连续 1 的个数 简单 🤩🤩🤩🤩
519. 随机翻转矩阵 中等 🤩🤩🤩🤩
524. 通过删除字母匹配到字典里最长单词 中等 🤩🤩🤩🤩
581. 最短无序连续子数组 中等 🤩🤩🤩🤩
594. 最长和谐子序列 简单 🤩🤩🤩🤩
611. 有效三角形的个数 中等 🤩🤩🤩🤩
633. 平方数之和 简单 🤩🤩
653. 两数之和 IV - 输入 BST 简单 🤩🤩🤩🤩
786. 第 K 个最小的素数分数 中等 🤩🤩🤩
825. 适龄的朋友 中等 🤩🤩🤩🤩
832. 翻转图像 简单 🤩🤩
838. 推多米诺 中等 🤩🤩🤩🤩
881. 救生艇 中等 🤩🤩🤩🤩
905. 按奇偶排序数组 简单 🤩🤩🤩🤩
917. 仅仅反转字母 简单 🤩🤩🤩🤩
930. 和相同的二元子数组 中等 🤩🤩🤩
992. K 个不同整数的子数组 困难 🤩🤩🤩🤩
1004. 最大连续1的个数 III 中等 🤩🤩🤩
1052. 爱生气的书店老板 中等 🤩🤩🤩
1221. 分割平衡字符串 简单 🤩🤩🤩🤩
1332. 删除回文子序列 简单 🤩🤩🤩🤩
1446. 连续字符 简单 🤩🤩🤩🤩🤩
1610. 可见点的最大数目 困难 🤩🤩🤩🤩
1743. 从相邻元素对还原数组 中等 🤩🤩🤩🤩
1748. 唯一元素的和 简单 🤩🤩🤩🤩
1764. 通过连接另一个数组的子数组得到一个数组 中等 🤩🤩🤩🤩
2000. 反转单词前缀 简单 🤩🤩🤩🤩
2024. 考试的最大困扰度 中等 🤩🤩🤩🤩
2047. 句子中的有效单词数 简单 🤩🤩🤩🤩