算法(1): 双指针
双指针通常用在有序数组,链表的数据结构上,根据题目条件移动对应的指针。比如判断子串、链表是否有环的问题。
1.1 最长子串
题目描述:给定一个字符串和一个字符串字典,找到字典里面最长的字符串,该字符串可以通过删除给定字符串的某些字符来得到。如果答案不止一个,返回长度最长且字典顺序最小的字符串。如果答案不存在,则返回空字符串 输入: s = “abpcplea”, d = [“ale”,“apple”,“monkey”,“plea”] 输出: “apple”
双指针通常用在有序数组,链表的数据结构上,根据题目条件移动对应的指针。比如判断子串、链表是否有环的问题。
题目描述:给定一个字符串和一个字符串字典,找到字典里面最长的字符串,该字符串可以通过删除给定字符串的某些字符来得到。如果答案不止一个,返回长度最长且字典顺序最小的字符串。如果答案不存在,则返回空字符串 输入: s = “abpcplea”, d = [“ale”,“apple”,“monkey”,“plea”] 输出: “apple”
题目描述:请你仅使用两个栈实现先入先出队列。队列应当支持一般队列的支持的所有操作(push、pop、peek、empty):
思路: 两个栈一个栈做队头(出元素),另一个栈做队尾(入元素)
问题描述:根据一棵树的前序遍历与中序遍历构造二叉树。
思路:根据二叉树的前序和中序(或后序和中序)的序列可唯一构造一棵二叉树,必须要有中序。前序遍历的第一个为根节点,找到根节点在中序中的位置,中序左边的节点都是根节点的左子树,右边的同理,然后可以用递归的方式求解。
问题描述:删除单向链表倒数第n个节点(只遍历一次) Input: head = [1,2,3,4,5], n = 2 Output: [1,2,3,5]
思路:两个指针,p1先走n步,然后p1和p2再一起走,当p1到链表结尾,p2就是要删除的节点。注意处理可能删除的是头结点(n=length)或者不需要删除(n>length)的情况。 可以通过增加一个虚拟的头节点,避免对头节点的特殊处理。
题目描述:给一个整数数组,找出所有出现次数大于n/3的元素。 Input: nums = [3,2,3] Output: [3]
摩尔投票法: 一般情况一个大小为 n 的整数数组,找出其中所有出现超过 ⌊ n/k ⌋ 次的元素。n/k的众数最多只有k - 1个,原因:假设有k个众数,则 出现次数(⌊ n/k ⌋ +1) × \times× 众数个数 k > n。
问题:将字符的前k个字符移到字符串结尾。 Input:“abcde”,2 Output:“cdeab”
三步翻转法: 将字符串分为前k位和后(n-k)位两部分,将两部分分别翻转,最后再整体翻转即可。 时间复杂度:T = O(n) 参考原文