update sort

This commit is contained in:
ranwenjie
2021-09-13 14:43:50 +08:00
parent d1ad2f3dbb
commit f72365e833
8 changed files with 169 additions and 65 deletions
@@ -123,6 +123,45 @@ int longest_continuious_number(const char *input,char *output){
```
## 最长无重复子串问题
给一个字符串,找出不包含有重复字符的最长子串的长度
如 ”abcabbcbb“ 输出 3
思路1: 两个指针
思路2: 窗口函数
两个指针窗口函数实现
```
int lengthOfLongestSubstring(string s) {
unordered_map<char, int> window;
int left = 0, right = 0;
int res = 0; // 记录结果
while (right < s.size()) {
char c = s[right];
right++;
// 进行窗口内数据的一系列更新
window[c]++;
// 判断左侧窗口是否要收缩
while (window[c] > 1) {
char d = s[left];
left++;
// 进行窗口内数据的一系列更新
window[d]--;
}
// 在这里更新答案
res = max(res, right - left);
}
return res;
}
```
## 求最大连续递增数字子串
如“ads3sl456789DF3456ld345AA”中的“456789”就是所求。这道题在上一道题目的基础上增加了数字要递增的条件。思路跟上面差不多,碰到不递增的数字就相当于第二个数字串了。
@@ -152,7 +191,6 @@ int longest_common_subsequence(const char *s1,const char *s2, char *common){
```
## 对称子字符串的最大长度
题目:输入一个字符串,输出该字符串中对称的子字符串的最大长度。比如输入字符串“google”,由于该字符串里最长的对称子字符串是“goog”,因此输出4。
@@ -2,8 +2,6 @@
## 翻转句子中单词的顺序
题目:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。句子中单词以空格符隔开。为简单起见,标点符号和普通字母一样处理。
@@ -190,8 +188,6 @@ char *proc(char *str){
## 字符串原地压缩
题目描述:“abeeeeegaaaffa" 压缩为 "abe5ag3f2a",请编程实现。
@@ -24,7 +24,7 @@ B = [1,2,7]
A = [1,2,4,5,6,7]
```
思路1:
思路1:合并2个数列,变成 `[4,5,6,1,2,7]` , 归因排序即可
思路2:
+72 -43
View File
@@ -7,6 +7,9 @@
* 子树
写二叉树的算法题,都是基于递归框架的。我们先要搞清楚 root 节点它自己要做什么,然后根据题目要求选择使用前序,中序,后续的递归框架。
二元树的结点定义如下:
```
struct SBinaryTreeNode // a node of the binary tree
@@ -19,8 +22,56 @@ struct SBinaryTreeNode // a node of the binary tree
## 二叉树翻转
输入一颗二元查找树,将该树转换为它的镜像,即在转换后的二元查找树中,左子树的结点都大于右子树的结点。用递归和循环两种方法完成树的镜像转换。例
如输入:
```
8
/ \
6 10
/\ / \
5 7 9 11
```
输出:
```
8
/ \
10 6
/\ /\
11 9 7 5
```
思路:二叉树翻转 , 把二叉树上的每一个节点的左右子节点进行交换
```
// 将整棵树的节点翻转
TreeNode invertTree(TreeNode root) {
// base case
if (root == null) {
return null;
}
/**** 前序遍历位置 ****/
// root 节点需要交换它的左右子节点
TreeNode tmp = root.left;
root.left = root.right;
root.right = tmp;
// 让左右子节点继续翻转它们的子节点
invertTree(root.left);
invertTree(root.right);
return root;
}
```
## 把二元查找树转变成排序的双向链表
难度:中等
输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。要求`不能创建任何新的结点`,只调整指针的指向。
```
@@ -40,6 +91,27 @@ struct SBinaryTreeNode // a node of the binary tree
## 二叉树两个结点的最低共同父结点
设计一个算法,找出二叉树上任意两个结点的最近共同父结点。复杂度如果是O(n2)则不得分
输入二叉树中的两个结点,输出这两个结点在数中最低的共同父结点。
分析:求数中两个结点的最低共同结点是面试中经常出现的一个问题。这个问题至少有两个变种。
## 求一个二叉树中任意两个节点间的最大距离
两个节点的距离的定义是 这两个节点间边的个数,比如某个孩子节点和父节点间的距离是1,和相邻兄弟节点间的距离是2,优化时间空间复杂度。
## 在二元树中找出和为某一值的所有路径
题目:输入一个整数和一棵二元树。从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。打印出和与输入整数相等的所有路径。
@@ -65,47 +137,4 @@ struct SBinaryTreeNode // a node of the binary tree
## 二叉树翻转
输入一颗二元查找树,将该树转换为它的镜像,即在转换后的二元查找树中,左子树的结点都大于右子树的结点。用递归和循环两种方法完成树的镜像转换。例
如输入:
```
8
/ \
6 10
/\ / \
5 7 9 11
```
输出:
```
8
/ \
10 6
/\ /\
11 9 7 5
```
## 二叉树两个结点的最低共同父结点
设计一个算法,找出二叉树上任意两个结点的最近共同父结点。复杂度如果是O(n2)则不得分
输入二叉树中的两个结点,输出这两个结点在数中最低的共同父结点。
分析:求数中两个结点的最低共同结点是面试中经常出现的一个问题。这个问题至少有两个变种。
## 求一个二叉树中任意两个节点间的最大距离
两个节点的距离的定义是 这两个节点间边的个数,比如某个孩子节点和父节点间的距离是1,和相邻兄弟节点间的距离是2,优化时间空间复杂度。
@@ -1,9 +1,10 @@
# 二叉树-遍历
> 快速排序就是个二叉树的前序遍历,归并排序就是个二叉树的后序遍历
## 俩种方法实现二叉树的前序遍历。
## 2种方法实现二叉树的前序遍历。
递归和非递归