排序
归并排序, 改变有序区间(从1开始)
快速排序 {}3
堆排序 取出最大值存入数组
希尔排序 以距离值 跳跳比
桶排序
计数排序
身高
基数排序 个位数 序列 十位数 百位数
时间O(N*N)
冒泡 选择
O(N*logN)
快速
空间复杂度
O(1)
插入 选择 冒泡 堆排序 希尔排序
但是如果使用的是递归实现的,空间复杂度将不再是O(1),而是O(logN) 函数栈
OlgN-O(N)
快速
43335 快速不稳定
5115 希尔排序不稳定
快速排序:常量系数低
如果没有空间复杂度的限制,用哈希表实现
哈希表实现,时间复杂度为O(N),空间复杂度为O(N)
O(1)
先排序
合并有序数组
从后往前拷贝,避免原有的数据被覆盖,比较和拷贝
荷兰国旗问题
看当前数
|
{} 1 1 0 0 2 1 1 0 {}
0区 2区
查找矩阵中的有序数
数组右上角开始
需要排序的最短子数组的长度
【1,5,4,3,2,6,7】
返回4 【5,4,3,2】
方法:从左往右记录遍历过的最大值位置,会发生一种情况,当前的元素比右边的数大,记录这种情况的最右边的位置
在从右往左,同理
最后最小和最大的位置区间就是要进行排序的区间长度。
数组中的最大差值
例如某数组排序之后为
1 2 3 4 7 8 9
最大差值来自于4和7,所以返回3
思想来自于桶排序
遍历数组
最小 最大 N区间 元素个数
N+1 为最大值
构造空桶
空桶区间 的最大差值即为最大差值
字符串
广泛性
1.1 字符串数组 查找 排序
1.2 字符串对象需要掌握的概率
- 回文
- 子串(连续)
- 子序列(不连续)
- 前缀树
- 后缀树和后缀数组
- 匹配
- 字典序
需要掌握的操作
- 与数组有关的操作:增删改查
- 字符串替换
- 字符串的旋转
字符串题目的常见类型
规则判断
- 判断字符串符合整数规则
- 判断字符串符合浮点数规则
- 判断字符串符合回文数规则 TRUE or false
数字运算
int 和long 类型表达整数范围有限,所以经常用字符串实现大整数
与大整数相关的加减乘除操作,需要模拟笔算的过程
与数组有关的排序有关类型
- 排序
字符计数
- 哈希表
固定长度的数组
C/C++ 字符256 java 65536滑动窗口问题、寻找无重复字符串子串问题、
计算变位词问题
动态规划问题
- 最大子串长度问题
- 最大回文子序列
- 最长公共子串
- 最长公共子序列
搜索类型
- 宽度优先搜索
- 深度优先搜索
高级算法与数据结构解决的问题
- Manacher算法解决最长回文子串问题
- KMP 算法解决字符串匹配问题
- 前缀树结构
- 后缀树和后缀数组
比较两棵树,T1中包含T2的子树,返回TRUE,否则返回false
方法1,遍历二叉树+判断匹配 O(N*M)
方法2:二叉树序列化+ KMP算法 O(M+N)
实际为KMP比较字符串
变形词
str1=“123” str2=”231” 返回TRUE
str1=“123” str2=”2331” 返回False
方法:使用哈希表 str1 str2 判断记录是否一致
可以借用数组
旋转词
- 判断str1 与str2 是否相等
- 如果相等,生成str1+str1的大字符串
- KMP算法判断是否含有str2
str1=“1 2 3 4”
str1+str1=“ 1 2 3 4 1 2 3 4”
穷举了所有的旋转词
单词间逆序
- 实现将字符串逆序的函数f
- 利用f将字符串所有字符逆序
“pig loves dog”->”god sevol gip“ - 找到逆序后的字符串中每一个单词的区域,利用f将每一个单词的区域逆序
“god sevol gip”->”dog loves pig”
一个字符串str,和一个整数i,i代表str中的位置,将str[0..i]移动到右侧,str[i+1..N-1] 移到左侧
str=”ABCDE” ,i=2. 将str调整为“DEABC”
要求,时间复杂度为O(N),额外空间复杂度为O(1)
原地调整
分为两步
1. 将str[0..i] 部分的字符逆序
A B C D E
C B A D E
- 将str[i+1~N-1] 部分的字符串
C B A D E
C B A E D
- 将str整体的字符逆序
C B A E D
D E A B C
活用局部逆序函数
拼接字符串,返回字典序列最小的
strs=[“abc”, “de”];
abcde deabc 返回abcde
strs==[“b”,”ba”]
bab bba 返回bab
O(N*logN)
实质是排序
如果str1+str2
空格替换 “%20”
长度变化的规律,从后往前拷贝