双指针

198 阅读1分钟

力扣的练习笔记保存到这里,GitHub 不装插件不能显示公式而这边可以。
按着这里的顺序练习的。

633. 平方数之和

双指针

使用 sqrt() 函数

因为 b^2 = c - a^2,通过遍历 a 寻找是否存在整数 b。若不使用 sqrt(),可通过二分查找判断 b 是否存在

345. 反转字符串中的元音字母

主要的速度差异在于元音字母的判断上

public static boolean isVowel(char c) {
    return c == 65 || c == 69 || c == 73 || c == 79 || c == 85 || c == 97 || c == 101 || c == 105 || c == 111 || c == 117;
}

680. 验证回文字符串 Ⅱ

在试着删除字符时,我们既可以删除左指针指向的字符,也可以删除右指针指向的字符。如下:

return isPalindrome(s, i, j - 1) || isPalindrome(s, i + 1, j);

回顾 5. 最长回文子串

88. 合并两个有序数组

双指针

从后往前,空间复杂度为 O(1)

141. 环形链表

trick

遍历链表时修改每个 head.val = "fsdvvvvfs"(这个值为链表中没有的值),若遍历过程中出现 head.val == "fsdvvvvfs",则有环;否则 head.next = null 出循环,则无环

哈希表

哈希表存储 head,再用 contains(head) 判断即可

⭐快慢指针

慢指针走一步,快指针走两步。
快慢指针的最长耗时差于哈希表