算法解释
- 双指针主要用于遍历数组,两个指针指向不同的元素,从而协同完成任务。也可以延伸到多个数组的多个指针。
- 若两个指针指向同一个数组,遍历的方向相同且不会相交,则也称为滑动窗口;
- 若两个指针指向同一个数组,但是遍历的方向相反,则可以用来进行搜索,待搜索的数组往往是排好序的。
167. 两数之和
- 我的代码:
88. 合并两个有序数组
- 我的想法:非常朴素的想法,就是把nums2每个元素放进nums1的后面,然后对整个nums1进行排序。
- 最优算法:两个数组都已经进行过升序排列,最优时间复杂度和空间复杂度的做法是在两个数组最大的元素上置指针,将两者中元素较大的值置于nums1的最后,然后依次排序。这样时间复杂度为O(m+n),空间复杂度为O(1)。
- 按照最优算法的思路进行代码复现:
- 本来想按照最优思路自己复现出来,结果写出来的代码又臭又长还没考虑到边界情况,再看看人家简洁的代码,自愧不如。这题主要提供一种逆序双指针解决问题的思路。
142.环形列表2
- 对于链路找环路问题,有一个通用的解法--快慢指针(Floyd判圈法);
- 给定两个指针,分别命名为slow和fast,起始位置在链表的开头;每次fast前进两步,slow前进一步;
- 如果fast可以走到尽头,那么说明没有环路;
- 如果fast可以无限走下去,说明一定有环路,且一定存在某个时刻solw和fast相遇;
- 当slow和fast第一次相遇时,将fast重新移到链表开头,并让slow和fast每次都前进一步;
- 当slow和fast第二次相遇时,相遇的节点即为环路的开始点。
- 代码:
76.最小覆盖子串
滑动窗口;这个题好难,战略放弃一下;;
633.平方数之和
- 思路:双指针;但是我一开始没想到j的初值可以设置为目标数开根号,所以测试用例特别大的时候,运行时间就超过了限制;本来是应该想到的,被easy的题目冲昏了头脑,忽略了很多细节。
- 我的代码:
680.验证回文串Ⅱ
在不考虑删改的情况下,如何判断一个字符串是不是回文串?
- 在一个字符串的头和尾各置一个指针,分别为left指针和right指针;若l和r对应的元素相等,则各自向中间移动一位,直到指针相遇,指向同一个元素,则该字符串是回文串。
- 若left指针和right指针指向的元素并不相等,则判断left指针向右挪一位和right指针向左挪一位的剩下的字符串是否是回文串。
- 官方代码:
- charAt方法
charAt()方法返回指定索引位置的char值。索引范围为0~length()-1,如: str.charAt(0)检索str中的第一个字符,str.charAt(str.length()-1)检索最后一个字符。