|
1 | | -<!-- TOC --> |
2 | | - |
3 | | -- [前言](#前言) |
4 | | -- [第一部分:数据结构](#第一部分数据结构) |
5 | | - - [一、线性表](#一线性表) |
6 | | - - [二、栈和队列](#二栈和队列) |
7 | | - - [三、树和二叉树](#三树和二叉树) |
8 | | - - [1. 红黑树](#1-红黑树) |
9 | | - - [2. 二叉树](#2-二叉树) |
10 | | - - [二分查找法](#二分查找法) |
11 | | - - [二叉树遍历](#二叉树遍历) |
12 | | - - [3. 二分搜索树](#3-二分搜索树) |
13 | | - - [深度优先遍历(前序、中序、后序遍历)](#深度优先遍历前序中序后序遍历) |
14 | | - - [广度优先遍历(层序遍历)](#广度优先遍历层序遍历) |
15 | | - - [4. AVL树](#4-avl树) |
16 | | - - [5. B和B+](#5-b和b) |
17 | | - - [四、字符串和数组](#四字符串和数组) |
18 | | -- [第二部分:算法思想](#第二部分算法思想) |
19 | | - - [一、排序](#一排序) |
20 | | - - [1. 选择排序(Selection Sort)](#1-选择排序selection-sort) |
21 | | - - [2. 插入排序(Insertion Sort)](#2-插入排序insertion-sort) |
22 | | - - [3. 冒泡排序(Bubble Sort)](#3-冒泡排序bubble-sort) |
23 | | - - [4. 希尔排序(Shell Sort)](#4-希尔排序shell-sort) |
24 | | - - [5. 归并排序(Merge Sort)](#5-归并排序merge-sort) |
25 | | - - [6. 快速排序(Quick Sort)](#6-快速排序quick-sort) |
26 | | - - [1. 普通快速排序](#1-普通快速排序) |
27 | | - - [2. 双路快速排序](#2-双路快速排序) |
28 | | - - [3. 三路快速排序](#3-三路快速排序) |
29 | | - - [7. 堆排序(Heap Sort)](#7-堆排序heap-sort) |
30 | | - - [1. 堆](#1-堆) |
31 | | - - [2. 上浮和下沉](#2-上浮和下沉) |
32 | | - - [3.插入元素](#3插入元素) |
33 | | - - [4. 删除最大元素](#4-删除最大元素) |
34 | | - - [5. 堆排序](#5-堆排序) |
35 | | - - [6. 堆排序的应用——Top K问题](#6-堆排序的应用top-k问题) |
36 | | - - [8. 计数排序和流排序](#8-计数排序和流排序) |
37 | | - - [9. 排序算法总结](#9-排序算法总结) |
38 | | - - [二、递归和回溯法](#二递归和回溯法) |
39 | | - - [1. 例题](#1-例题) |
40 | | - - [2. 排列问题](#2-排列问题) |
41 | | - - [3. 组合问题](#3-组合问题) |
42 | | - - [4. 回溯法的剪枝](#4-回溯法的剪枝) |
43 | | - - [5. 二维平面回溯法](#5-二维平面回溯法) |
44 | | - - [6. floodfill算法](#6-floodfill算法) |
45 | | - - [三、动态规划](#三动态规划) |
46 | | - - [1. 斐波那契数列](#1-斐波那契数列) |
47 | | - - [1.1 递归方式(自顶向下)](#11-递归方式自顶向下) |
48 | | - - [1.2 记忆化搜索(自底向上)](#12-记忆化搜索自底向上) |
49 | | - - [1.3 动态规划](#13-动态规划) |
50 | | - - [2. 背包问题](#2-背包问题) |
51 | | - - [(1)记忆化搜索](#1记忆化搜索) |
52 | | - - [(2)动态规划](#2动态规划) |
53 | | - - [(3)动态规划优化思路1](#3动态规划优化思路1) |
54 | | - - [(4)动态规划优化思路2](#4动态规划优化思路2) |
55 | | - - [(5)背包问题更多变种](#5背包问题更多变种) |
56 | | - - [3. 最长上升子序列](#3-最长上升子序列) |
57 | | - - [4. 最长公共子序列](#4-最长公共子序列) |
58 | | - - [四、贪心算法](#四贪心算法) |
59 | | - - [1. assign-cookies](#1-assign-cookies) |
60 | | -- [第三部分:面试指南](#第三部分面试指南) |
61 | | - - [1. 判单链表是否对称](#1-判单链表是否对称) |
62 | | - - [2. 合并两个有序数组成一个有序数组](#2-合并两个有序数组成一个有序数组) |
63 | | - - [3. 求二叉树中值为x的结点的层号](#3-求二叉树中值为x的结点的层号) |
64 | | - - [阿里面经OneNote](#阿里面经onenote) |
65 | | -- [第四部分:参考资料](#第四部分参考资料) |
66 | | - |
67 | | -<!-- /TOC --> |
68 | 1 | # 前言 |
69 | 2 |
|
70 | | -本文将系统总结算法面试和经典数据结构相关知识点,在这里分成 【数据结构】 和 【算法】 两部分展开。这里将展示主要的核心知识点,关于代码面试的Leetcode习题请转向代码仓库:[Interview-code](https://github.com/frank-lam/interview_code) |
| 3 | +本文将系统总结算法面试和经典数据结构相关知识点,在这里分成 【数据结构】 和 【算法】 两部分展开。这里将展示主要的核心知识点,关于代码面试的 Leetcode 习题请转向代码仓库:[Interview-code](https://github.com/frank-lam/interview_code) |
71 | 4 |
|
72 | 5 |
|
73 | 6 |
|
|
94 | 27 | - 数组 |
95 | 28 | - 链表 |
96 | 29 |
|
| 30 | + |
| 31 | + |
97 | 32 | ## 二、栈和队列 |
98 | 33 |
|
99 | 34 |
|
@@ -168,9 +103,9 @@ private static int searchDfs(int[] data, int l, int r, int target) { |
168 | 103 | } |
169 | 104 | ``` |
170 | 105 |
|
171 | | -##### |
172 | 106 |
|
173 | | -### 4.. 二叉树遍历 |
| 107 | + |
| 108 | +### 4. 二叉树遍历 |
174 | 109 |
|
175 | 110 | #### 深度优先遍历(前序、中序、后序遍历) |
176 | 111 |
|
@@ -300,6 +235,14 @@ public: |
300 | 235 |
|
301 | 236 |
|
302 | 237 |
|
| 238 | +## 五、图结构 |
| 239 | + |
| 240 | +### 邻接矩阵 |
| 241 | + |
| 242 | +### 邻接表 |
| 243 | + |
| 244 | + |
| 245 | + |
303 | 246 | # 第二部分:算法思想 |
304 | 247 |
|
305 | 248 | ## 一、排序 |
@@ -351,13 +294,15 @@ private static void swap(int[] arr, int i, int j) { |
351 | 294 |
|
352 | 295 | ```java |
353 | 296 | public static void sort(int[] arr) { |
354 | | - for (int i = 0; i < arr.length - 1; i++) { |
355 | | - for (int j = i + 1; j > 0; j--) { |
356 | | - if (arr[j] < arr[j - 1]) |
357 | | - swap(arr, j, j - 1); // 大量的交换会消耗时间 |
358 | | - else |
359 | | - break; |
| 297 | + for (int i = 0; i < arr.length; i++) { |
| 298 | + // 选择 arr[i...n) 中的最小值 |
| 299 | + int minIndex = i; |
| 300 | + for (int j = i + 1; j < arr.length; j++) { |
| 301 | + if (arr[minIndex] > arr[j]) { |
| 302 | + minIndex = j; |
| 303 | + } |
360 | 304 | } |
| 305 | + swap(arr, i, minIndex); |
361 | 306 | } |
362 | 307 | } |
363 | 308 |
|
@@ -385,7 +330,7 @@ private static void swap(int[] arr, int i, int j) { |
385 | 330 |
|
386 | 331 | **算法分析** |
387 | 332 |
|
388 | | -插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。 |
| 333 | +插入排序在实现上,通常采用 in-place 排序(即只需用到 O(1) 的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。 |
389 | 334 |
|
390 | 335 |
|
391 | 336 |
|
@@ -1676,12 +1621,10 @@ void level_in_x(BinTree BT,char x,int level) |
1676 | 1621 | # 第四部分:参考资料 |
1677 | 1622 |
|
1678 | 1623 | - [数据结构与算法系列 目录 - 如果天空不死 - 博客园](http://www.cnblogs.com/skywang12345/p/3603935.html) |
1679 | | -- [Interview-Notebook/算法.md at master · CyC2018/Interview-Notebook](https://github.com/CyC2018/Interview-Notebook/blob/master/notes/%E7%AE%97%E6%B3%95.md#%E9%80%89%E6%8B%A9%E6%8E%92%E5%BA%8F) |
1680 | 1624 | - [十大经典排序算法](https://www.cnblogs.com/onepixel/articles/7674659.html) |
1681 | 1625 | - [VisuAlgo - visualising data structures and algorithms through animation](https://visualgo.net/en) |
1682 | 1626 | - [Data Structure Visualization](https://www.cs.usfca.edu/~galles/visualization/Algorithms.html) |
1683 | 1627 | - [海量数据处理:十道面试题与十个海量数据处理方法总结 - chenhuan001 - 博客园](https://www.cnblogs.com/chenhuan001/p/5866916.html) |
1684 | 1628 |
|
1685 | 1629 |
|
1686 | 1630 |
|
1687 | | - |
0 commit comments