本文整理于【拉勾*力扣】课程笔记,侵删~
1、题目:字符串翻转
解法:两个指针指向首尾,元素交换,指针向中间移动,继续交换元素
2、数组优缺点
3、题目:有效的字母异位词(数组)
解法1:两个长度为26的数组,分别统计两个字符串中各字母的个数,比较两个数组即可
解法2:一个长度为26的数组,出现在s中,该位置+1,出现到t中,该位置-1,判断是否每个位置都为0即可。
4、链表
5、链表优缺点
6、链表解题技巧
快慢指针可以用于求链表倒数第k个元素
7、题目:k个一组翻转链表(链表)
解法:
(1)使用3个指针prev、current、next分别指向前一个结点、当前节点、下一个节点;
(2)将current指向prev;
(3)同时向后移动prev、current、next指针;
(4)执行(2)(3)步骤
8、栈
9、例题:有效的括号(栈)
解法:遇到左括号压栈、遇到与之匹配的右括号出栈,判断最后栈是否为空
10、例题:每日的温度(栈)
解法:
将第0个元素【23】的下标0入栈,由于第1个元素【24】> 第0个元素【23】,得出【23】到温度升高那天需要1天
第0个元素【23】出栈,第1个元素【24】入栈,由于第2个元素【25】> 栈顶元素【24】,得出【24】到温度升高那天需要1天
第1个元素【24】出栈,第2个元素【25】入栈,由于第3个元素【21】< 栈顶元素【25】,【21】入栈,栈为:【25】【21】
由于第4个元素【19】< 栈顶元素【21】,【19】入栈,栈中元素为:【25】【21】【19】
由于第5个元素【22】> 栈顶元素【19】,得出第4个元素【19】到温度升高那天需要1天,【19】出栈,栈为:【25】【21】
继续比较,由于第5个元素【22】> 栈顶元素【21】,得出第4个元素【19】到温度升高那天需要2天,【21】出栈,栈为【25】
继续比较,由于第5个元素【22】< 栈顶元素【25】,【22】入栈,栈为:【25】【22】
由于第6个元素【26】> 栈顶元素【22】,得出第5个元素【22】到温度升高那天需要1天,【22】出栈,栈为【25】
继续比较,由于第6个元素【26】> 栈顶元素【25】,(栈中保存的是元素下标)得出第5个元素【22】到温度升高那天需要5天
【25】出栈,【26】入栈,栈为【26】,以此类推...
普通算法时间复杂度O(n*n),栈时间复杂度O(n)
11、队列
12、双端队列
13、题目:滑动窗口最大值(双端队列)
解法:
【1】入队,【3】>队尾元素【1】,【1】出队,【3】入队,队中元素为【3】
【-1】< 队尾元素【3】,【-1】入队,队中元素为【3】【-1】
滑动窗口,将当前队首的值放入结果数组中:【3】
【-3】< 队尾元素【-1】,【-3】入队,队中元素为【3】【-1】【-3】(队头总是保存滑动窗口最大的元素)
滑动窗口,将当前队首的值放入结果数组中:【3】【3】
【5】> 队尾元素【-3】,【-3】出队,队中元素为【3】【-1】
【5】> 队尾元素【-1】,【-1】出队,队中元素为【3】
【5】> 队尾元素【3】,【3】出队,【5】入队,队中元素为【5】
滑动窗口,将当前队首的值放入结果数组中:【3】【3】【5】
以此类推...
每滑动一次窗口,将当前队头的值放入到结果数组中,结果为【3】【3】【5】【5】【6】【7】
普通解法时间复杂度:o(n*k);双端队列时间复杂度o(n)
14、树
1、平衡二叉搜索树
又被称为AVL树,且具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。
由于普通的二叉查找树会容易失去”平衡“,极端情况下,二叉查找树会退化成线性的链表,导致插入和查找的复杂度下降到 O(n) ,所以,这也是平衡二叉树设计的初衷。那么平衡二叉树如何保持”平衡“呢?根据定义,有两个重点,一是左右两子树的高度差的绝对值不能超过1,二是左右两子树也是一颗平衡二叉树。
如下图所示,左图是一棵平衡二叉树,根节点10,左右两子树的高度差是1,而右图,虽然根节点左右两子树高度差是0,但是右子树15的左右子树高度差为2,不符合定义,所以右图不是一棵平衡二叉树。
由此可以看出平衡二叉树是一棵高度平衡的二叉查找树。所以,要构建跟维系一棵平衡二叉树就比普通的二叉树要复杂的多。在构建一棵平衡二叉树的过程中,当有新的节点要插入时,检查是否因插入后而破坏了树的平衡,如果是,则需要做旋转去改变树的结构。
关于旋转,这个博客讲的很不错:https://blog.csdn.net/qq_25940921/article/details/82183093
2、完全二叉树
如果二叉树的深度为k,则除第k层外其余所有层节点的度都为2,且叶子节点从左到右依次存在。也即是,将满二叉树的最后一层从左到右依次删除若干节点就得到完全二叉树。满二叉树是一棵特殊的完全二叉树,但完全二叉树不一定是满二叉树。
15、树的遍历
先序遍历:根左右;用于创建树
中序遍历:左根右;用于二叉搜索树(左孩子 < 根节点 < 右孩子)
后序遍历:左右根;
16、题目:(树的后序遍历)
考察二叉搜索树的性质(左孩子 < 根节点 < 右孩子)和二叉搜索树的遍历
解法:
二叉搜索树中序遍历,得到的结果就是有序的【1】【2】【3】【4】【5】【6】,遍历到第k个元素即可。
求第K大的元素,则进行反向遍历【6】【5】【4】【3】【2】【1】,同样遍历到第k个元素即可。