---
sidebar: heading
title: 常è§ç®æ³æ»ç»
category: è®¡ç®æºåºç¡
tag:
- ç®æ³
head:
- - meta
- name: keywords
content: ç®æ³ç¥è¯æ»ç»,äºåæ éå,æåºç®æ³,卿è§å,åæº¯ç®æ³,è´ªå¿ç®æ³,åæé
- - meta
- name: description
content: ç®æ³å¸¸è§ç¥è¯ç¹æ»ç»
---
::: tip è¿æ¯ä¸åæè®¸å¯¹ä½ æå¸®å©çä¿¡æ¯
- **é¢è¯æå**ï¼è¿æ¯ä¸ä»½å¤§å½¬ç²¾å¿æ´çç[**大åé¢è¯æå**](https://topjavaer.cn/zsxq/mianshishouce.html)ææ°çï¼ç®åå·²ç»æ´æ°è¿ä»£äº**19**ä¸ªçæ¬ï¼è´¨éå¾é«ï¼ä¸ä¸ºé¢è¯æé ï¼
- **ç¥è¯æç**ï¼**ä¸å±é¢è¯æå/ä¸å¯¹ä¸äº¤æµ/ç®åä¿®æ¹/è¶
æ£çå¦ä¹ æ°å´/å¦ä¹ 路线è§å**ï¼æ¬¢è¿å å
¥[大彬çç¥è¯æç](https://topjavaer.cn/zsxq/introduce.html)ï¼ç¹å»é¾æ¥æ¥çæçç详ç»ä»ç»ï¼
:::
## äºåæ çéå
äºåæ æ¯ä¸ç§é常éè¦çæ°æ®ç»æï¼å¾å¤å
¶å®æ°æ®ç»æé½æ¯åºäºäºåæ çåºç¡æ¼åèæ¥çã
äºåæ çå
åºãä¸åºåååºå±äºæ·±åº¦ä¼å
éåDFSï¼å±æ¬¡éåå±äºå¹¿åº¦ä¼å
éåBFSã

åç§ä¸»è¦çéåææ³ä¸ºï¼
ååºéåï¼æ ¹ç»ç¹ ---> å·¦åæ ---> å³åæ
ä¸åºéåï¼å·¦åæ ---> æ ¹ç»ç¹ ---> å³åæ
ååºéåï¼å·¦åæ ---> å³åæ ---> æ ¹ç»ç¹
屿¬¡éåï¼åªéæå±æ¬¡éåå³å¯
### ååºéå
éåæè·¯ï¼æ ¹ç»ç¹ ---> å·¦åæ ---> å³åæ ã
æ ¹æ®ååºéåç顺åºï¼ä¼å
è®¿é®æ ¹ç»ç¹ï¼ç¶åå¨è®¿é®å·¦åæ åå³åæ ãæä»¥ï¼å¯¹äºä»»æç»ç¹nodeï¼ç¬¬ä¸é¨åå³ç´æ¥è®¿é®ä¹ï¼ä¹åå¨å¤æå·¦åæ æ¯å¦ä¸ºç©ºï¼ä¸ä¸ºç©ºæ¶å³éå¤ä¸é¢çæ¥éª¤ï¼ç´å°å
¶ä¸ºç©ºãè¥ä¸ºç©ºï¼åéè¦è®¿é®å³åæ ãæ³¨æï¼å¨è®¿é®è¿å·¦å©åä¹åï¼éè¦åè¿æ¥è®¿é®å
¶å³å©åï¼å¯ä»¥æ¯æ è¿ç§æ°æ®ç»ææ¥æ¯æã对äºä»»æä¸ä¸ªç»ç¹nodeï¼å
·ä½æ¥éª¤å¦ä¸ï¼
1. 访é®ç»ç¹ï¼å¹¶æç»ç¹nodeå
¥æ ï¼å½åç»ç¹ç½®ä¸ºå·¦å©åï¼
2. 夿ç»ç¹nodeæ¯å¦ä¸ºç©ºï¼è¥ä¸ºç©ºï¼åååºæ é¡¶ç»ç¹å¹¶åºæ ï¼å°å³å©å置为å½åç»ç¹ï¼å¦åéå¤a)æ¥ç´å°å½åç»ç¹ä¸ºç©ºæè
æ 为空ï¼å¯ä»¥åç°æ ä¸çç»ç¹å°±æ¯ä¸ºäºè®¿é®å³å©åæåå¨çï¼
```java
public void preOrderTraverse2(TreeNode root) {
LinkedList stack = new LinkedList<>();
TreeNode pNode = root;
while (pNode != null || !stack.isEmpty()) {
if (pNode != null) {
System.out.print(pNode.val+" ");
stack.push(pNode);
pNode = pNode.left;
} else { //pNode == null && !stack.isEmpty()
TreeNode node = stack.pop();
pNode = node.right;
}
}
}
```
### ä¸åºéå
éåæè·¯ï¼å·¦åæ ---> æ ¹ç»ç¹ ---> å³åæ
```java
public List inorderTraversal(TreeNode root) {
List res = new ArrayList<>();
Deque deque = new ArrayDeque<>();
while (!deque.isEmpty() || root != null) {
while (root != null) {
deque.push(root);
root = root.left;
}
root = deque.pop();
res.add(root.val);
root = root.right;
}
return res;
}
```
### ååºéå
éåæè·¯ï¼å·¦åæ ---> å³åæ ---> æ ¹ç»ç¹ã
ä½¿ç¨ null ä½ä¸ºæ å¿ä½ï¼è®¿é®å° null è¯´ææ¤æ¬¡éå½è°ç¨ç»æã
```java
class Solution {
public List postorderTraversal(TreeNode root) {
List res = new LinkedList<>();
if (root == null) {
return res;
}
Stack stack = new Stack<>();
stack.push(root);
while (!stack.isEmpty()) {
root = stack.pop();
if (root != null) {
stack.push(root);//æå访é®
stack.push(null);
if (root.right != null) {
stack.push(root.right);
}
if (root.left != null) {
stack.push(root.left);
}
} else { //å¼ä¸ºnullè¯´ææ¤æ¬¡éå½è°ç¨ç»æï¼å°èç¹å¼åè¿ç»æ
res.add(stack.pop().val);
}
}
return res;
}
}
```
### å±åºéå
åªéè¦ä¸ä¸ªéåå³å¯ï¼å
å¨éåä¸å å
¥æ ¹ç»ç¹ãä¹å对äºä»»æä¸ä¸ªç»ç¹æ¥è¯´ï¼å¨å
¶åºéåçæ¶åï¼è®¿é®ä¹ã忶妿左å©ååå³å©åæä¸ä¸ºç©ºçï¼å
¥éåã
```
public void levelTraverse(TreeNode root) {
if (root == null) {
return;
}
LinkedList queue = new LinkedList<>();
queue.offer(root);
while (!queue.isEmpty()) {
TreeNode node = queue.poll();
System.out.print(node.val+" ");
if (node.left != null) {
queue.offer(node.left);
}
if (node.right != null) {
queue.offer(node.right);
}
}
}
```
## æåºç®æ³
常è§çæåºç®æ³ä¸»è¦æï¼å泡æåºãæå
¥æåºãéæ©æåºãå¿«éæåºãå½å¹¶æåºãå æåºãåºæ°æåºãåç§æåºç®æ³çæ¶é´ç©ºé´å¤æåº¦ãç¨³å®æ§è§ä¸å¾ã

### åæ³¡æåº
åæ³¡æåºæ¯ä¸ç§ç®åçæåºç®æ³ãå®éå¤å°èµ°è®¿è¿è¦æåºçæ°åï¼ä¸æ¬¡æ¯è¾ä¸¤ä¸ªå
ç´ ï¼å¦æå®ä»¬ç顺åºé误就æå®ä»¬äº¤æ¢è¿æ¥ã走访æ°åç工使¯éå¤å°è¿è¡ç´å°æ²¡æåéè¦äº¤æ¢ï¼ä¹å°±æ¯è¯´è¯¥æ°åå·²ç»æåºå®æãè¿ä¸ªç®æ³çååç±æ¥æ¯å 为è¶å°çå
ç´ ä¼ç»ç±äº¤æ¢æ
¢æ
¢âæµ®âå°æ°åç顶端ã
æè·¯ï¼
- æ¯è¾ç¸é»çå
ç´ ãå¦æç¬¬ä¸ä¸ªæ¯ç¬¬äºä¸ªå¤§ï¼å°±äº¤æ¢å®ä»¬ä¸¤ä¸ªï¼
- 对æ¯ä¸å¯¹ç¸é»å
ç´ ä½åæ ·çå·¥ä½ï¼ä»å¼å§ç¬¬ä¸å¯¹å°ç»å°¾çæåä¸å¯¹ï¼è¿æ ·å¨æåçå
ç´ åºè¯¥ä¼æ¯æå¤§çæ°ï¼
- é对ææçå
ç´ éå¤ä»¥ä¸çæ¥éª¤ï¼é¤äºæåä¸ä¸ªï¼
- é夿¥éª¤1~3ï¼ç´å°æåºå®æã
代ç å®ç°ï¼
```java
public void bubbleSort(int[] arr) {
if (arr == null) {
return;
}
boolean flag;
for (int i = arr.length - 1; i > 0; i--) {
flag = false;
for (int j = 0; j < i; j++) {
if (arr[j] > arr[j + 1]) {
int tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
flag = true;
}
}
if (!flag) {
return;
}
}
}
```
### æå
¥æåº
æå
¥æåºï¼Insertion-Sortï¼çç®æ³æè¿°æ¯ä¸ç§ç®åç´è§çæåºç®æ³ãå®çå·¥ä½åçæ¯éè¿æå»ºæåºåºåï¼å¯¹äºæªæåºæ°æ®ï¼å¨å·²æåºåºåä¸ä»åååæ«æï¼æ¾å°ç¸åºä½ç½®å¹¶æå
¥ãæå
¥æåºå¨å®ç°ä¸ï¼é常éç¨in-placeæåºï¼å³åªéç¨å°O(1)çé¢å¤ç©ºé´çæåºï¼ï¼å èå¨ä»åååæ«æè¿ç¨ä¸ï¼éè¦å夿已æåºå
ç´ éæ¥ååæªä½ï¼ä¸ºææ°å
ç´ æä¾æå
¥ç©ºé´ã
ç®æ³æè¿°ï¼
ä¸è¬æ¥è¯´ï¼æå
¥æåºé½éç¨in-place卿°ç»ä¸å®ç°ãå
·ä½ç®æ³æè¿°å¦ä¸ï¼
- ä»ç¬¬ä¸ä¸ªå
ç´ å¼å§ï¼è¯¥å
ç´ å¯ä»¥è®¤ä¸ºå·²ç»è¢«æåºï¼
- ååºä¸ä¸ä¸ªå
ç´ ï¼å¨å·²ç»æåºçå
ç´ åºåä¸ä»åååæ«æï¼
- å¦æè¯¥å
ç´ ï¼å·²æåºï¼å¤§äºæ°å
ç´ ï¼å°è¯¥å
ç´ ç§»å°ä¸ä¸ä½ç½®ï¼
- é夿¥éª¤3ï¼ç´å°æ¾å°å·²æåºçå
ç´ å°äºæè
çäºæ°å
ç´ çä½ç½®ï¼
- å°æ°å
ç´ æå
¥å°è¯¥ä½ç½®åï¼
- é夿¥éª¤2~5ã
代ç å®ç°ï¼
```java
public void insertSort(int[] arr) {
if (arr == null) {
return;
}
for (int i = 1; i < arr.length; i++) {
int tmp = arr[i];
int j = i;
for (; j > 0 && tmp < arr[j - 1]; j--) {
arr[j] = arr[j - 1];
}
arr[j] = tmp;
}
}
```
### éæ©æåº
表ç°**æç¨³å®çæåºç®æ³ä¹ä¸**ï¼å 为**æ 论ä»ä¹æ°æ®è¿å»é½æ¯O(n2)çæ¶é´å¤æåº¦**ï¼æä»¥ç¨å°å®çæ¶åï¼æ°æ®è§æ¨¡è¶å°è¶å¥½ãå¯ä¸ç好å¤å¯è½å°±æ¯ä¸å ç¨é¢å¤çå
å空é´ã
éæ©æåº(Selection-sort)æ¯ä¸ç§ç®åç´è§çæåºç®æ³ãå®çå·¥ä½åçï¼é¦å
卿ªæåºåºå䏿¾å°æå°ï¼å¤§ï¼å
ç´ ï¼åæ¾å°æåºåºåçèµ·å§ä½ç½®ï¼ç¶åï¼åä»å©ä½æªæåºå
ç´ ä¸ç»§ç»å¯»æ¾æå°ï¼å¤§ï¼å
ç´ ï¼ç¶åæ¾å°å·²æåºåºåçæ«å°¾ã以æ¤ç±»æ¨ï¼ç´å°ææå
ç´ åæåºå®æ¯ã
æè·¯ï¼n个记å½çç´æ¥éæ©æåºå¯ç»è¿n-1è¶ç´æ¥éæ©æåºå¾å°æåºç»æãå
·ä½ç®æ³æè¿°å¦ä¸ï¼
- åå§ç¶æï¼æ åºåºä¸ºR[1..n]ï¼æåºåºä¸ºç©ºï¼
- 第iè¶æåº(i=1,2,3â¦n-1)å¼å§æ¶ï¼å½åæåºåºåæ åºåºåå«ä¸ºR[1..i-1]åR(i..nï¼ãè¯¥è¶æåºä»å½åæ åºåºä¸-éåºå
³é®åæå°çè®°å½ R[k]ï¼å°å®ä¸æ åºåºç第1个记å½R交æ¢ï¼ä½¿R[1..i]åR[i+1..n)åå«å为记å½ä¸ªæ°å¢å 1ä¸ªçæ°æåºåºåè®°å½ä¸ªæ°åå°1ä¸ªçæ°æ åºåºï¼
- n-1è¶ç»æï¼æ°ç»æåºåäºã
代ç å®ç°ï¼
```java
public void selectionSort(int[] arr) {
if (arr == null) {
return;
}
for (int i = 0; i < arr.length - 1; i++) {
for (int j = i + 1; j < arr.length; j++) {
if (arr[i] > arr[j]) {
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
}
}
}
```
### å¸å°æåº
å¸å°æåºæ¯å¸å°ï¼Donald Shellï¼äº1959å¹´æåºçä¸ç§æåºç®æ³ãå¸å°æåºä¹æ¯ä¸ç§æå
¥æåºï¼å®æ¯ç®åæå
¥æåºç»è¿æ¹è¿ä¹åçä¸ä¸ªæ´é«æççæ¬ï¼ä¹ç§°ä¸ºç¼©å°å¢éæåºï¼åæ¶è¯¥ç®æ³æ¯å²ç ´O(n2ï¼çç¬¬ä¸æ¹ç®æ³ä¹ä¸ãå®ä¸æå
¥æåºçä¸åä¹å¤å¨äºï¼å®ä¼ä¼å
æ¯è¾è·ç¦»è¾è¿çå
ç´ ãå¸å°æåºåå«ç¼©å°å¢éæåºã
**å¸å°æåºæ¯æè®°å½æä¸è¡¨çä¸å®å¢éåç»ï¼å¯¹æ¯ç»ä½¿ç¨ç´æ¥æå
¥æåºç®æ³æåºï¼éçå¢é鿏åå°ï¼æ¯ç»å
å«çå
³é®è¯è¶æ¥è¶å¤ï¼å½å¢éåè³1æ¶ï¼æ´ä¸ªæä»¶æ°è¢«åæä¸ç»ï¼ç®æ³ä¾¿ç»æ¢ã**
代ç å®ç°ï¼
```java
public static int[] ShellSort(int[] array) {
int len = array.length;
int temp, gap = len / 2;
while (gap > 0) {
for (int i = gap; i < len; i++) {
temp = array[i];
int preIndex = i - gap;
while (preIndex >= 0 && array[preIndex] > temp) {
array[preIndex + gap] = array[preIndex];
preIndex -= gap;
}
array[preIndex + gap] = temp;
}
gap /= 2;
}
return array;
}
```
### åºæ°æåº
åºæ°æåºä¹æ¯éæ¯è¾çæåºç®æ³ï¼å¯¹æ¯ä¸ä½è¿è¡æåºï¼ä»æä½ä½å¼å§æåºï¼å¤æåº¦ä¸ºO(kn),为æ°ç»é¿åº¦ï¼k为æ°ç»ä¸çæ°çæå¤§ç使°ï¼
åºæ°æåºæ¯æç
§ä½ä½å
æåºï¼ç¶åæ¶éï¼åæç
§é«ä½æåºï¼ç¶ååæ¶éï¼ä¾æ¬¡ç±»æ¨ï¼ç´å°æé«ä½ãææ¶åæäºå±æ§æ¯æä¼å
级顺åºçï¼å
æä½ä¼å
级æåºï¼åæé«ä¼å
级æåºãæåçæ¬¡åºå°±æ¯é«ä¼å
级é«çå¨åï¼é«ä¼å
级ç¸åçä½ä¼å
级é«çå¨åãåºæ°æåºåºäºå嫿åºï¼å嫿¶éï¼æä»¥æ¯ç¨³å®çã
ç®æ³æè¿°ï¼
- å徿°ç»ä¸çæå¤§æ°ï¼å¹¶åå¾ä½æ°ï¼
- arr为åå§æ°ç»ï¼ä»æä½ä½å¼å§åæ¯ä¸ªä½ç»æradixæ°ç»ï¼
- 对radixè¿è¡è®¡æ°æåºï¼å©ç¨è®¡æ°æåºéç¨äºå°èå´æ°çç¹ç¹ï¼ï¼
代ç å®ç°ï¼
```java
public static int[] RadixSort(int[] array) {
if (array == null || array.length < 2)
return array;
// 1.å
ç®åºæå¤§æ°ç使°ï¼
int max = array[0];
for (int i = 1; i < array.length; i++) {
max = Math.max(max, array[i]);
}
int maxDigit = 0;
while (max != 0) {
max /= 10;
maxDigit++;
}
int mod = 10, div = 1;
ArrayList> bucketList = new ArrayList>();
for (int i = 0; i < 10; i++)
bucketList.add(new ArrayList());
for (int i = 0; i < maxDigit; i++, mod *= 10, div *= 10) {
for (int j = 0; j < array.length; j++) {
int num = (array[j] % mod) / div;
bucketList.get(num).add(array[j]);
}
int index = 0;
for (int j = 0; j < bucketList.size(); j++) {
for (int k = 0; k < bucketList.get(j).size(); k++)
array[index++] = bucketList.get(j).get(k);
bucketList.get(j).clear();
}
}
return array;
}
```
### è®¡æ°æåº
è®¡æ°æåºçæ ¸å¿å¨äºå°è¾å
¥çæ°æ®å¼è½¬å为é®åå¨å¨é¢å¤å¼è¾çæ°ç»ç©ºé´ä¸ã ä½ä¸ºä¸ç§çº¿æ§æ¶é´å¤æåº¦çæåºï¼è®¡æ°æåºè¦æ±è¾å
¥çæ°æ®å¿
é¡»æ¯æç¡®å®èå´çæ´æ°ã
è®¡æ°æåº(Counting sort)æ¯ä¸ç§ç¨³å®çæåºç®æ³ãè®¡æ°æåºä½¿ç¨ä¸ä¸ªé¢å¤çæ°ç»Cï¼å
¶ä¸ç¬¬i个å
ç´ æ¯å¾
æåºæ°ç»Aä¸å¼çäºiçå
ç´ ç个æ°ãç¶åæ ¹æ®æ°ç»Cæ¥å°Aä¸çå
ç´ æå°æ£ç¡®çä½ç½®ãå®åªè½å¯¹æ´æ°è¿è¡æåºã
```java
public static int[] CountingSort(int[] array) {
if (array.length == 0) return array;
int bias, min = array[0], max = array[0];
for (int i = 1; i < array.length; i++) {
if (array[i] > max)
max = array[i];
if (array[i] < min)
min = array[i];
}
bias = 0 - min;
int[] bucket = new int[max - min + 1];
Arrays.fill(bucket, 0);
for (int i = 0; i < array.length; i++) {
bucket[array[i] + bias]++;
}
int index = 0, i = 0;
while (index < array.length) {
if (bucket[i] != 0) {
array[index] = i - bias;
bucket[i]--;
index++;
} else
i++;
}
return array;
}
```
### å¿«éæåº
å¿«éæåºæ¯ç±**åæ³¡æåº**æ¹è¿èå¾å°çï¼æ¯ä¸ç§æåºæ§è¡æçå¾é«çæåºç®æ³ï¼å®å©ç¨**åæ²»æ³**æ¥å¯¹å¾
æåºåºåè¿è¡åæ²»æåºï¼å®çææ³ä¸»è¦æ¯éè¿ä¸è¶æåºå°å¾
æè®°å½åéæç¬ç«ç两é¨åï¼å
¶ä¸çä¸é¨åæ¯å
³é®åå°ï¼åé¢ä¸é¨åæ¯å
³é®å大ï¼ç¶åå对è¿ååç两é¨ååå«éç¨è¿ç§æ¹å¼è¿è¡æåºï¼éè¿éå½çè¿ç®æç»è¾¾å°æ´ä¸ªåºåæåºã
å¿«éæåºçè¿ç¨å¦ä¸ï¼
1. å¨å¾
æåºçN个记å½ä¸ä»»åä¸ä¸ªå
ç´ ï¼é常å第ä¸ä¸ªè®°å½ï¼ä½ä¸ºåºåï¼ç§°ä¸ºåºåè®°å½ï¼
2. å®ä¹ä¸¤ä¸ªç´¢å¼ left å right åå«è¡¨ç¤ºé¦ç´¢å¼å尾索å¼ï¼key 表示åºåå¼ï¼
3. é¦å
ï¼å°¾ç´¢å¼ååæ«æï¼ç´å°æ¾å°æ¯åºåå¼å°çè®°å½ï¼å¹¶æ¿æ¢é¦ç´¢å¼å¯¹åºçå¼ï¼
4. ç¶åï¼é¦ç´¢å¼ååæ«æï¼ç´å°æ¾å°æ¯åºåå¼å¤§äºçè®°å½ï¼å¹¶æ¿æ¢å°¾ç´¢å¼å¯¹åºçå¼ï¼
5. è¥å¨æ«æè¿ç¨ä¸é¦ç´¢å¼çäºå°¾ç´¢å¼(left = right)ï¼åä¸è¶æåºç»æï¼å°åºåå¼(key)æ¿æ¢é¦ç´¢å¼æå¯¹åºçå¼ï¼
6. åè¿è¡ä¸ä¸è¶æåºæ¶ï¼å¾
æåºå被åæä¸¤ä¸ªåºï¼[0,left-1]å[righ+1,end]
7. 对æ¯ä¸ä¸ªååºéå¤ä»¥ä¸æ¥éª¤ï¼ç´å°ææååºä¸çè®°å½é½æåºï¼æåºå®æ
å¿«æä¸ºä»ä¹æ¯å泡æçé«ï¼
å¿«éæåºä¹æä»¥æ¯è¾å¿«ï¼æ¯å ä¸ºç¸æ¯å泡æåºï¼æ¯æ¬¡ç交æ¢é½æ¯è·³è·å¼çï¼æ¯æ¬¡è®¾ç½®ä¸ä¸ªåºåå¼ï¼å°å°äºåºåå¼çé½äº¤æ¢å°å·¦è¾¹ï¼å¤§äºåºåå¼çé½äº¤æ¢å°å³è¾¹ï¼è¿æ ·ä¸ä¼ååæ³¡ä¸æ ·æ¯æ¬¡é½åªäº¤æ¢ç¸é»ç两个æ°ï¼å æ¤æ¯è¾å交æ¢çæ¤æ°é½åå°äºï¼é度èªç¶æ´é«ã
å¿«éæåºç平忶é´å¤æåº¦æ¯O(nlgn)ï¼æåæ¶é´å¤æåº¦æ¯O(n^2)ã
```java
public void quickSort(int[] arr) {
if (arr == null) {
return;
}
quickSortHelper(arr, 0, arr.length - 1);
}
private void quickSortHelper(int[] arr, int left, int right) {
if (left > right) {
return;
}
int tmp = arr[left];
int i = left;
int j = right;
while (i < j) {
//jå
èµ°ï¼æç»å¾ªç¯ç»æ¢æ¶ï¼jåççä½ç½®å°±æ¯arr[left]çæ£ç¡®ä½ç½®
//æ¹ä¸ºi<=jï¼åä¼è¿å
¥æ»å¾ªç¯ï¼[1,5,5,5,5]->[1] 5 [5,5,5]->[5,5,5]ï¼ä¼æ»å¾ªç¯
while (i < j && arr[j] >= tmp) {
j--;
}
while (i < j && arr[i] <= tmp) {
i++;
}
if (i < j) {
int tmp1 = arr[i];
arr[i] = arr[j];
arr[j] = tmp1;
} else {
break;
}
}
//å½å¾ªç¯ç»æ¢çæ¶åï¼i=jï¼å 为æ¯jå
èµ°çï¼jæå¨ä½ç½®çå¼å°äºarr[left]ï¼äº¤æ¢arr[j]åarr[left]
arr[left] = arr[j];
arr[j] = tmp;
quickSortHelper(arr, left, j - 1);
quickSortHelper(arr, j + 1, right);
}
```
### å½å¹¶æåº
å½å¹¶æåº (merge sort) æ¯ä¸ç±»ä¸æå
¥æåºãäº¤æ¢æåºãéæ©æåºä¸åçå¦ä¸ç§æåºæ¹æ³ãå½å¹¶çå«ä¹æ¯å°ä¸¤ä¸ªæä¸¤ä¸ªä»¥ä¸çæåºè¡¨åå¹¶æä¸ä¸ªæ°çæåºè¡¨ãå½å¹¶æåºæå¤è·¯å½å¹¶æåºã两路å½å¹¶æåº ï¼ å¯ç¨äºå
æåºï¼ä¹å¯ä»¥ç¨äºå¤æåºã
两路å½å¹¶æåºç®æ³æè·¯æ¯éå½å¤çãæ¯ä¸ªéå½è¿ç¨æ¶åä¸ä¸ªæ¥éª¤
- åè§£ï¼ æå¾
æåºç n 个å
ç´ çåºååè§£æä¸¤ä¸ªååºåï¼ æ¯ä¸ªååºåå
æ¬ n/2 个å
ç´
- æ²»çï¼ å¯¹æ¯ä¸ªååºååå«è°ç¨å½å¹¶æåºMergeSortï¼ è¿è¡é彿ä½
- åå¹¶ï¼ å并两个æå¥½åºçååºåï¼çææåºç»æ

æ¶é´å¤æåº¦ï¼å¯¹é¿åº¦ä¸ºnçåºåï¼éè¿è¡logn次äºè·¯å½å¹¶ï¼æ¯æ¬¡å½å¹¶çæ¶é´ä¸ºO(n)ï¼æ
æ¶é´å¤æåº¦æ¯O(nlgn)ã
空é´å¤æåº¦ï¼å½å¹¶æåºéè¦è¾
å©ç©ºé´æ¥æå两个æåºååºåå½å¹¶çç»æï¼æ
å
¶è¾
å©ç©ºé´å¤æåº¦ä¸ºO(n)
```java
public class MergeSort {
public void mergeSort(int[] arr) {
if (arr == null || arr.length == 0) {
return;
}
//è¾
婿°ç»
int[] tmpArr = new int[arr.length];
mergeSort(arr, tmpArr, 0, arr.length - 1);
}
private void mergeSort(int[] arr, int[] tmpArr, int left, int right) {
if (left < right) {
int mid = (left + right) >> 1;
mergeSort(arr, tmpArr, left, mid);
mergeSort(arr, tmpArr, mid + 1, right);
merge(arr, tmpArr, left, mid, right);
}
}
private void merge(int[] arr, int[] tmpArr, int left, int mid, int right) {
int i = left;
int j = mid + 1;
int tmpIndex = left;
while (i <= mid && j <= right) {
if (arr[i] < arr[j]) {
tmpArr[tmpIndex++] = arr[i];
i++;
} else {
tmpArr[tmpIndex++] = arr[j];
j++;
}
}
while (i <= mid) {
tmpArr[tmpIndex++] = arr[i++];
}
while (j <= right) {
tmpArr[tmpIndex++] = arr[j++];
}
for (int m = left; m <= right; m++) {
arr[m] = tmpArr[m];
}
}
}
```
### å æåº
å æ¯å
·æä¸åæ§è´¨çå®å
¨äºåæ ï¼æ¯ä¸ªç»ç¹çå¼é½å¤§äºæçäºå
¶å·¦å³å©åç»ç¹çå¼ï¼ç§°ä¸ºå¤§é¡¶å ï¼æè
æ¯ä¸ªç»ç¹çå¼é½å°äºæçäºå
¶å·¦å³å©åç»ç¹çå¼ï¼ç§°ä¸ºå°é¡¶å ã

**Top大é®é¢**è§£å³æè·¯ï¼ä½¿ç¨ä¸ä¸ªåºå®å¤§å°ç**æå°å **ï¼å½å 满åï¼æ¯æ¬¡æ·»å æ°æ®çæ¶åä¸å é¡¶å
ç´ æ¯è¾ï¼è¥å°äºå é¡¶å
ç´ ï¼åèå¼ï¼è¥å¤§äºå é¡¶å
ç´ ï¼åå é¤å é¡¶å
ç´ ï¼æ·»å æ°å¢å
ç´ ï¼å¯¹å è¿è¡éæ°æåºã
对äºn个æ°ï¼åTop m个æ°ï¼æ¶é´å¤æåº¦ä¸ºO(nlogm)ï¼è¿æ ·å¨nè¾å¤§æ
åµä¸ï¼æ¯ä¼äºnlognï¼å
¶ä»æåºç®æ³ï¼çæ¶é´å¤æåº¦çã
PriorityQueue æ¯ä¸ç§åºäºä¼å
级å çä¼å
级éåãæ¯æ¬¡ä»éåä¸ååºçæ¯å
·ææé«ä¼å
æçå
ç´ ã妿䏿ä¾Comparatorçè¯ï¼ä¼å
éåä¸å
ç´ é»è®¤æèªç¶é¡ºåºæåï¼ä¹å°±æ¯æ°åé»è®¤æ¯å°çå¨éå头ãä¼å
级éåç¨æ°ç»å®ç°ï¼ä½æ¯æ°ç»å¤§å°å¯ä»¥å¨æå¢å ï¼å®¹éæ éã
```java
//æ¾åºåk个æå¤§æ°ï¼éç¨å°é¡¶å å®ç°
public static int[] findKMax(int[] nums, int k) {
PriorityQueue pq = new PriorityQueue<>(k);//éåé»è®¤èªç¶é¡ºåºæåï¼å°é¡¶å ï¼ä¸å¿
éåcompare
for (int num : nums) {
if (pq.size() < k) {
pq.offer(num);
} else if (pq.peek() < num) {//妿å é¡¶å
ç´ < æ°æ°ï¼åå é¤å é¡¶ï¼å å
¥æ°æ°å
¥å
pq.poll();
pq.offer(num);
}
}
int[] result = new int[k];
for (int i = 0; i < k&&!pq.isEmpty(); i++) {
result[i] = pq.poll();
}
return result;
}
```
## 卿è§å
卿è§å常常éç¨äºæéå åé®é¢çé®é¢ã卿è§åçåºæ¬ææ³ï¼è¥è¦è§£ä¸ä¸ªç»å®é®é¢ï¼æä»¬éè¦è§£å
¶ä¸åé¨åï¼å³åé®é¢ï¼ï¼åæ ¹æ®åé®é¢ç解以å¾åºåé®é¢çè§£ã
卿è§åæ³è¯å¾ä»
ä»
è§£å³æ¯ä¸ªåé®é¢ä¸æ¬¡ï¼ä¸æ¦æä¸ªç»å®åé®é¢ç解已ç»ç®åºï¼åå°å
¶è®°å¿ååå¨ï¼ä»¥ä¾¿ä¸æ¬¡éå°åä¸ä¸ªåé®é¢çæ¶åç´æ¥æ¥è¡¨å¾å°è§£ã
卿è§åçè§£é¢æè·¯ï¼1ãç¶æå®ä¹ï¼2ãç¶æè½¬ç§»æ¹ç¨ï¼3ãåå§ç¶æã
### ä¸åè·¯å¾
[ä¸åè·¯å¾](../leetcode/hot120/62-unique-paths.md)
### æé¿åæå串
ä»ç»å®çå符串 `s` 䏿¾å°æé¿çåæå串çé¿åº¦ã
ä¾å¦ `s = "babbad"` çæé¿åæåä¸²æ¯ `"abba"` ï¼é¿åº¦æ¯ `4` ã
è§£é¢æè·¯ï¼
1. å®ä¹ç¶æã`dp[i][j]` 表示å串 `s[i..j]` æ¯å¦ä¸ºåæå串
2. ç¶æè½¬ç§»æ¹ç¨ï¼`dp[i][j] = (s[i] == s[j]) and dp[i + 1][j - 1]`
3. åå§åçæ¶åï¼å个å符ä¸å®æ¯åæä¸²ï¼å æ¤æå¯¹è§çº¿å
åå§å为 `true`ï¼å³ `dp[i][i] = true` ã
4. åªè¦ä¸å¾å° `dp[i][j] = true`ï¼å°±è®°å½å串çé¿åº¦åèµ·å§ä½ç½®
注æäºé¡¹ï¼æ»æ¯å
å¾å°å°å串çåæå¤å®ï¼ç¶å大å串æè½åèå°å串çå¤æç»æï¼å³å¡«è¡¨é¡ºåºå¾éè¦ã

æ¶é´å¤æåº¦O(N2)ï¼ç©ºé´å¤æåº¦O(N2)ï¼å 为使ç¨äºäºç»´æ°ç»ã
```java
public class Solution {
public String longestPalindrome(String s) {
// ç¹å¤
int len = s.length();
if (len < 2) {
return s;
}
int maxLen = 1;
int begin = 0;
// dp[i][j] 表示 s[i, j] æ¯å¦æ¯åæä¸²
boolean[][] dp = new boolean[len][len];
char[] charArray = s.toCharArray();
for (int i = 0; i < len; i++) {
dp[i][i] = true;
}
for (int j = 1; j < len; j++) {
for (int i = 0; i < j; i++) {
if (charArray[i] != charArray[j]) {
dp[i][j] = false;
} else {
if (j - i < 3) {
dp[i][j] = true;
} else {
dp[i][j] = dp[i + 1][j - 1];
}
}
// åªè¦ dp[i][j] == true æç«ï¼å°±è¡¨ç¤ºå串 s[i..j] æ¯åæï¼æ¤æ¶è®°å½åæé¿åº¦åèµ·å§ä½ç½®
if (dp[i][j] && j - i + 1 > maxLen) {
maxLen = j - i + 1;
begin = i;
}
}
}
return s.substring(begin, begin + maxLen); //substring(i, j)æªåiå°j(ä¸å
å«j)çå符串
}
}
```
### æå¤§åæ°ç»å
**é¢ç®æè¿°**ï¼ç»ä½ ä¸ä¸ªæ´æ°æ°ç» `nums` ï¼è¯·ä½ æ¾åºä¸ä¸ªå
·ææå¤§åçè¿ç»åæ°ç»ï¼åæ°ç»æå°å
å«ä¸ä¸ªå
ç´ ï¼ï¼è¿åå
¶æå¤§åã
**示ä¾**ï¼
```java
è¾å
¥ï¼ nums = [-2,1,-3,4,-1,2,1,-5,4]
è¾åºï¼ 6
è§£éï¼ è¿ç»åæ°ç» [4,-1,2,1] çåæå¤§ï¼ä¸º 6 ã
```
1ãé¦å
ç¡®å®dpæ°ç»ï¼dp tableï¼ä»¥å䏿 çå«ä¹ã
dp[i]表示以nums[i]ç»å°¾çåæ°ç»çæå¤§åã
2ãç¡®å®éæ¨å
¬å¼ã
`dp[i] = dp[i - 1] > 0 ? ( dp[i - 1] + nums[i]) : nums[i]`
dp[i+1]åå³äºdp[i]çå¼ï¼ä¸éè¦ä½¿ç¨æ°ç»ä¿åç¶æï¼åªéè¦ä¸ä¸ªåésumæ¥ä¿åä¸ä¸ä¸ªç¶æå³å¯ã
3ãdpæ°ç»å¦ä½åå§åã
ä»éæ¨å
¬å¼å¯ä»¥çåºæ¥dp[i]æ¯ä¾èµäºdp[i - 1]çç¶æï¼dp[0]å°±æ¯éæ¨å
¬å¼çåºç¡ã
dp[0]åºè¯¥æ¯å¤å°å¢ï¼æ ¹æ®dp[i]çå®ä¹ï¼å¾ææ¾dp[0]åºä¸ºnums[0]å³dp[0] = nums[0]ã
示ä¾ä»£ç å¦ä¸ï¼
```java
class Solution {
public int maxSubArray(int[] nums) {
if (nums == null || nums.length == 0) {
return 0;
}
int max = nums[0];
int sum = 0;
for (int num : nums) {
if (sum > 0) {
sum += num;
} else {
sum = num;
}
max = Math.max(max, sum);
}
return max;
}
}
```
### æé¿å
Œ
±ååºå
ä¸ä¸ªå符串ç ååºå æ¯æè¿æ ·ä¸ä¸ªæ°çå符串ï¼å®æ¯ç±åå符串å¨ä¸æ¹åå符çç¸å¯¹é¡ºåºçæ
åµä¸å 餿äºå符ï¼ä¹å¯ä»¥ä¸å é¤ä»»ä½å符ï¼åç»æçæ°å符串ã
ä¾å¦ï¼"ace" æ¯ "abcde" çååºåï¼ä½ "aec" 䏿¯ "abcde" çååºåã
卿è§åã`dp[i][j]`表示text1以i-1ç»å°¾çå串åtext2以j-1ç»å°¾çå串çæé¿å
Œ
±ååºåçé¿åº¦ãdpæ¨ªåæ æçºµåæ 为0表示空å符串ï¼`dp[0][j] = dp[i][0] = 0`ï¼æ éé¢å¤å¤çbase caseã

```java
class Solution {
public int longestCommonSubsequence(String text1, String text2) {
char[] arr1 = text1.toCharArray();
char[] arr2 = text2.toCharArray();
//dp[0][x]ådp[x][0]表示æä¸ä¸ªä¸ºç©ºå符串
//dp[1][1]为text1第ä¸ä¸ªå符åtext2第ä¸ä¸ªå符çæé¿å
Œ
±ååºåçé¿åº¦
//dp[i][j]表示text1以i-1ç»å°¾çå串åtext2以j-1ç»å°¾çå串çæé¿å
Œ
±ååºåçé¿åº¦
int len1 = arr1.length;
int len2 = arr2.length;
int[][] dp = new int[len1 + 1][len2 + 1];
for (int i = 1; i < len1 + 1; i++) {
for (int j = 1; j < len2 + 1; j++) {
if (arr1[i - 1] == arr2[j - 1]) {
dp[i][j] = dp[i - 1][j - 1] + 1;
} else {
dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]);
}
}
}
return dp[len1][len2];
}
}
```
`dp[i][j]`表示text1以iç»å°¾çå串åtext2以jç»å°¾çå串çæé¿å
Œ
±ååºåçé¿åº¦ãéè¦å¤çbase caseã
```java
class Solution {
public int longestCommonSubsequence(String text1, String text2) {
char[] arr1 = text1.toCharArray();
char[] arr2 = text2.toCharArray();
int len1 = arr1.length;
int len2 = arr2.length;
//`dp[i][j]`表示text1以iç»å°¾çå串åtext2以jç»å°¾çå串çæé¿å
Œ
±ååºåçé¿åº¦ã
int[][] dp = new int[len1][len2];
if (arr1[0] == arr2[0]) {
dp[0][0] = 1;
}
for (int i = 1; i < len1; i++) {
if (arr1[i] == arr2[0]) {
dp[i][0] = 1;
} else {
dp[i][0] = dp[i - 1][0];
}
}
for (int i = 1; i < len2; i++) {
if (arr1[0] == arr2[i]) {
dp[0][i] = 1;
} else {
dp[0][i] = dp[0][i - 1];
}
}
for (int i = 1; i < len1; i++) {
for (int j = 1; j < len2; j++) {
if (arr1[i] == arr2[j]) {
dp[i][j] = dp[i - 1][j - 1] + 1;
} else {
dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]);
}
}
}
return dp[len1 - 1][len2 - 1];
}
}
```
### æ¥é¨æ°´
ç»å® `n` 个éè´æ´æ°è¡¨ç¤ºæ¯ä¸ªå®½åº¦ä¸º `1` çæ±åçé«åº¦å¾ï¼è®¡ç®ææ¤æåçæ±åï¼ä¸é¨ä¹åè½æ¥å¤å°é¨æ°´ã

示ä¾ï¼
```java
è¾å
¥ï¼height = [0,1,0,2,1,0,1,3,2,1,2,1]
è¾åºï¼6
è§£éï¼ä¸é¢æ¯ç±æ°ç» [0,1,0,2,1,0,1,3,2,1,2,1] 表示çé«åº¦å¾ï¼å¨è¿ç§æ
åµä¸ï¼å¯ä»¥æ¥ 6 个åä½ç鍿°´ï¼èè²é¨åè¡¨ç¤ºé¨æ°´ï¼ã
```
卿è§åï¼ä½¿ç¨ä¸¤ä¸ªæ°ç»ç©ºé´ãleftMax[i] 代表第 `i` å左边ï¼ä¸å
å«èªèº«ï¼æé«çå¢çé«åº¦ï¼rightMax[i] 代表第 `i` åå³è¾¹æé«çå¢çé«åº¦ã
```java
class Solution {
public int trap(int[] height) {
int len = height.length;
int res = 0;
int[] leftMax = new int[len];
int[] rightMax = new int[len];
for (int i = 1; i < len; i++) {
leftMax[i] = Math.max(leftMax[i - 1], height[i - 1]);
}
for (int j = len - 2; j > 0; j--) {
rightMax[j] = Math.max(rightMax[j + 1], height[j + 1]);
}
for (int i = 1; i < len - 1; i++) {
int min = Math.min(leftMax[i], rightMax[i]);
if (min > height[i]) {
res += min - height[i];
}
}
return res;
}
}
```
### åè¯æå

```java
class Solution {
public boolean wordBreak(String s, List wordDict) {
int len = s.length(), maxw = 0;
//dp[i]表示åiä¸ªåæ¯ç»æçå符串æ¯å¦å¯ä»¥è¢«æå
boolean[] dp = new boolean[len + 1];
//ç¶æè½¬ç§»æ¹ç¨åå§åæ¡ä»¶
dp[0] = true;
Set set = new HashSet();
for(String str : wordDict){
set.add(str);
maxw = Math.max(maxw, str.length());
}
for(int i = 1; i < len + 1; i++){
for(int j = i; j >= 0 && j >= i - maxw; j--){
if(dp[j] && set.contains(s.substring(j, i))){
dp[i] = true;
break;
}
}
}
return dp[len];
}
}
```
## åæº¯ç®æ³
åæº¯ç®æ³çåºæ¬ææ³æ¯ï¼ä»ä¸æ¡è·¯å¾åèµ°ï¼è½è¿åè¿ï¼ä¸è½è¿åéåæ¥ï¼æ¢ä¸æ¡è·¯åè¯ã
### ç»åæ»å
é¢ç®æè¿°ï¼ç»å®ä¸ä¸ª**æ éå¤å
ç´ **çæ°ç» `candidates` åä¸ä¸ªç®æ æ° `target` ï¼æ¾åº `candidates` 䏿æå¯ä»¥ä½¿æ°åå为 `target` çç»åã
示ä¾ï¼
```
è¾å
¥ï¼candidates = [2,3,6,7], target = 7,
è¾åºï¼
[
[7],
[2,2,3]
]
```
使ç¨åæº¯ç®æ³ã
```java
class Solution {
private List> ans = new ArrayList<>();
public List> combinationSum2(int[] candidates, int target) {
if (candidates == null || candidates.length == 0) {
return ans;
}
Arrays.sort(candidates);//æåºæ¹ä¾¿åæº¯åªæ
Deque path = new ArrayDeque<>();//ä½ä¸ºæ æ¥ä½¿ç¨ï¼æçé«äºStackï¼ä¹å¯ä»¥ä½ä¸ºéåæ¥ä½¿ç¨ï¼æçé«äºLinkedListï¼çº¿ç¨ä¸å®å
¨
combinationSum2Helper(candidates, target, 0, path);
return ans;
}
public void combinationSum2Helper(int[] arr, int target, int start, Deque path) {
if (target == 0) {
ans.add(new ArrayList(path));
}
for (int i = start; i < arr.length; i++) {
if (target < arr[i]) {//åªæ
return;
}
if (i > start && arr[i] == arr[i - 1]) {//å¨ä¸ä¸ªå±çº§ï¼ä¼äº§çéå¤
continue;
}
path.addLast(arr[i]);
combinationSum2Helper(arr, target - arr[i], i + 1, path);
path.removeLast();
}
}
}
```
### å
¨æå
ç»å®ä¸ä¸ª **没æéå¤** æ°åçåºåï¼è¿åå
¶ææå¯è½çå
¨æåã
示ä¾ï¼
```
è¾å
¥: [1,2,3]
è¾åº:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]
```
使ç¨åæº¯ãæ³¨æä¸ç»åæ»åçåºå«ï¼æ°åææ é¡ºåºï¼ã
```java
class Solution {
private List> ans = new ArrayList<>();
public List> permute(int[] nums) {
boolean[] flag = new boolean[nums.length];
ArrayDeque path = new ArrayDeque<>();
permuteHelper(nums, flag, path);
return ans;
}
private void permuteHelper(int[] nums, boolean[] flag, ArrayDeque path) {
if (path.size() == nums.length) {
ans.add(new ArrayList<>(path));
return;
}
for (int i = 0; i < nums.length; i++) {
if (flag[i]) {
continue;//ç»§ç»å¾ªç¯
}
path.addLast(nums[i]);
flag[i] = true;
permuteHelper(nums, flag, path);
path.removeLast();
flag[i] = false;
}
}
}
```
### å
¨æåII
ç»å®ä¸ä¸ªå¯å
å«é夿°åçåºåï¼è¿åææä¸éå¤çå
¨æåãæ³¨æä¸ç»åæ»åçåºå«ã
1ãæåºï¼2ãåä¸å±çº§ç¸åå
ç´ åªæã

```java
class Solution {
private List> ans = new ArrayList<>();
public List> permuteUnique(int[] nums) {
if (nums == null || nums.length == 0) {
return ans;
}
ArrayDeque path = new ArrayDeque<>();
boolean[] used = new boolean[nums.length];
Arrays.sort(nums);//åè®°
dps(nums, used, path);
return ans;
}
private void dps(int[] nums, boolean[] used, ArrayDeque path) {
if (path.size() == nums.length) {
ans.add(new ArrayList<>(path));
return;
}
for (int i = 0; i < nums.length; i++) {
if (used[i]) {
continue;
}
if ((i > 0 && nums[i] == nums[i - 1]) && !used[i - 1]) {//åä¸å±ç¸åçå
ç´ ï¼åªæ
continue;//ç»§ç»å¾ªç¯ï¼ä¸æ¯returnéåºå¾ªç¯
}
path.addLast(nums[i]);
used[i] = true;
dps(nums, used, path);
path.removeLast();
used[i] = false;
}
}
}
```
## è´ªå¿ç®æ³
è´ªå¿ç®æ³ï¼æ¯å¯»æ¾**æä¼è§£é®é¢**çå¸¸ç¨æ¹æ³ï¼è¿ç§æ¹æ³æ¨¡å¼ä¸è¬å°æ±è§£è¿ç¨åæ**è¥å¹²ä¸ªæ¥éª¤**ï¼ä½æ¯ä¸ªæ¥éª¤é½åºç¨è´ªå¿ååï¼éåå½åç¶æä¸**æå¥½/æä¼çéæ©**ï¼å±é¨ææå©çéæ©ï¼ï¼å¹¶ä»¥æ¤å¸ææåå å åºçç»æä¹æ¯æå¥½/æä¼çè§£ã
**贪婪æ³çåºæ¬æ¥éª¤ï¼**
1. ä»æä¸ªåå§è§£åºåï¼
2. éç¨è¿ä»£çè¿ç¨ï¼å½å¯ä»¥åç®æ åè¿ä¸æ¥æ¶ï¼å°±æ ¹æ®å±é¨æä¼çç¥ï¼å¾å°ä¸é¨åè§£ï¼ç¼©å°é®é¢è§æ¨¡ï¼
3. å°ææè§£ç»¼åèµ·æ¥ã
### ä¹°åè¡ç¥¨çæä½³æ¶æº II
**é¢ç®æè¿°**ï¼
ç»ä½ ä¸ä¸ªæ´æ°æ°ç» prices ï¼å
¶ä¸ prices[i] è¡¨ç¤ºææ¯è¡ç¥¨ç¬¬ i 天çä»·æ ¼ã
卿¯ä¸å¤©ï¼ä½ å¯ä»¥å³å®æ¯å¦è´ä¹°å/æåºå®è¡ç¥¨ãä½ å¨ä»»ä½æ¶å æå¤ åªè½ææ ä¸è¡ è¡ç¥¨ãä½ ä¹å¯ä»¥å
è´ä¹°ï¼ç¶åå¨ åä¸å¤© åºå®ã
è¿å ä½ è½è·å¾ç æå¤§ 婿¶¦ ã
**示ä¾**ï¼
```java
è¾å
¥ï¼prices = [1,2,3,4,5]
è¾åºï¼4
è§£éï¼å¨ç¬¬ 1 天ï¼è¡ç¥¨ä»·æ ¼ = 1ï¼çæ¶åä¹°å
¥ï¼å¨ç¬¬ 5 天 ï¼è¡ç¥¨ä»·æ ¼ = 5ï¼çæ¶åååº, è¿ç¬äº¤ææè½è·å¾å©æ¶¦ = 5 - 1 = 4 ã
 æ»å©æ¶¦ä¸º 4 ã
```
æè·¯ï¼å¯ä»¥å°½å¯è½å°å®ææ´å¤ç交æï¼ä½ä¸è½åæ¶åä¸å¤ç¬äº¤æï¼ä½ å¿
é¡»å¨å次è´ä¹°ååºå®æä¹åçè¡ç¥¨ï¼ã
```java
//è¾å
¥: [7,1,5,3,6,4]
//è¾åº: 7
class Solution {
public int maxProfit(int[] prices) {
int profit = 0;
for (int i = 1; i < prices.length; i++) {
int tmp = prices[i] - prices[i - 1];
if (tmp > 0) {
profit += tmp;
}
}
return profit;
}
}
```
### è·³è·æ¸¸æ
**é¢ç®æè¿°**
ç»å®ä¸ä¸ªéè´æ´æ°æ°ç» `nums` ï¼ä½ æåä½äºæ°ç»ç **第ä¸ä¸ªä¸æ ** ã
æ°ç»ä¸çæ¯ä¸ªå
ç´ ä»£è¡¨ä½ å¨è¯¥ä½ç½®å¯ä»¥è·³è·çæå¤§é¿åº¦ã
å¤æä½ æ¯å¦è½å¤å°è¾¾æåä¸ä¸ªä¸æ ã
**示ä¾**ï¼
```java
è¾å
¥ï¼nums = [2,3,1,1,4]
è¾åºï¼true
è§£éï¼å¯ä»¥å
è·³ 1 æ¥ï¼ä»ä¸æ 0 å°è¾¾ä¸æ 1, ç¶ååä»ä¸æ 1 è·³ 3 æ¥å°è¾¾æåä¸ä¸ªä¸æ ã
```
è§£é¢æè·¯ï¼
1. 妿æä¸ä¸ªä½ä¸º èµ·è·³ç¹ çæ ¼åå¯ä»¥è·³è·çè·ç¦»æ¯ 3ï¼é£ä¹è¡¨ç¤ºåé¢ 3 ä¸ªæ ¼åé½å¯ä»¥ä½ä¸º èµ·è·³ç¹
2. å¯ä»¥å¯¹æ¯ä¸ä¸ªè½ä½ä¸º èµ·è·³ç¹ çæ ¼åé½å°è¯è·³ä¸æ¬¡ï¼æ è½è·³å°æè¿çè·ç¦» ä¸ææ´æ°
3. 妿å¯ä»¥ä¸ç´è·³å°æåï¼å°±æåäº
```java
class Solution {
public boolean canJump(int[] nums) {
if (nums == null || nums.length == 0) {
return true;
}
int maxIndex = nums[0];
for (int i = 1; i < nums.length; i++) {
if (maxIndex >= i) {
maxIndex = Math.max(maxIndex, i + nums[i]);
} else {
return false;
}
}
return true;
}
}
```
### å æ²¹ç«
**é¢ç®æè¿°**
å¨ä¸æ¡ç¯è·¯ä¸æ n ä¸ªå æ²¹ç«ï¼å
¶ä¸ç¬¬ i ä¸ªå æ²¹ç«ææ±½æ²¹ gas[i] åã
ä½ æä¸è¾æ²¹ç®±å®¹éæ éççæ±½è½¦ï¼ä»ç¬¬ i ä¸ªå æ²¹ç«å¼å¾ç¬¬ i+1 ä¸ªå æ²¹ç«éè¦æ¶è汽油 cost[i] åãä½ ä»å
¶ä¸çä¸ä¸ªå æ²¹ç«åºåï¼å¼å§æ¶æ²¹ç®±ä¸ºç©ºã
ç»å®ä¸¤ä¸ªæ´æ°æ°ç» gas å cost ï¼å¦æä½ å¯ä»¥ç»ç¯è·¯è¡é©¶ä¸å¨ï¼åè¿ååºåæ¶å æ²¹ç«çç¼å·ï¼å¦åè¿å -1 ã妿åå¨è§£ï¼å ä¿è¯ 宿¯ å¯ä¸ çã
**示ä¾**
```java
è¾å
¥: gas = [1,2,3,4,5], cost = [3,4,5,1,2]
è¾åº: 3
è§£é:
ä» 3 å·å æ²¹ç«(ç´¢å¼ä¸º 3 å¤)åºåï¼å¯è·å¾ 4 åæ±½æ²¹ãæ¤æ¶æ²¹ç®±æ = 0 + 4 = 4 åæ±½æ²¹
å¼å¾ 4 å·å æ²¹ç«ï¼æ¤æ¶æ²¹ç®±æ 4 - 1 + 5 = 8 åæ±½æ²¹
å¼å¾ 0 å·å æ²¹ç«ï¼æ¤æ¶æ²¹ç®±æ 8 - 2 + 1 = 7 åæ±½æ²¹
å¼å¾ 1 å·å æ²¹ç«ï¼æ¤æ¶æ²¹ç®±æ 7 - 3 + 2 = 6 åæ±½æ²¹
å¼å¾ 2 å·å æ²¹ç«ï¼æ¤æ¶æ²¹ç®±æ 6 - 4 + 3 = 5 åæ±½æ²¹
å¼å¾ 3 å·å æ²¹ç«ï¼ä½ éè¦æ¶è 5 åæ±½æ²¹ï¼æ£å¥½è¶³å¤ä½ è¿åå° 3 å·å æ²¹ç«ã
å æ¤ï¼3 å¯ä¸ºèµ·å§ç´¢å¼ã
```
**æè·¯**ï¼
1. éåä¸å¨ï¼æ»è·å¾çæ²¹éå°äºè¦è±æçæ²¹éå¿
ç¶æ²¡æç»æï¼
2. å
è¦åçï¼è®°å½éåæ¶æåçæ²¹éæå°çç«ç¹ï¼ç±äºé¢ç®æè§£åªæå¯ä¸è§£ï¼æä»¥ä»å½åç«ç¹çä¸ä¸ä¸ªç«ç¹å¼å§æ¯å¯ä¸å¯è½æåå¼å®å
¨ç¨çã
```java
class Solution {
public int canCompleteCircuit(int[] gas, int[] cost) {
int minIdx=0;
int sum=Integer.MAX_VALUE;
int num=0;
for (int i = 0; i < gas.length; i++) {
num+=gas[i]-cost[i];
if(num 0) {
fast = fast.next;
}
while (fast.next != null) {
fast = fast.next;
slow = slow.next;
}
slow.next = slow.next.next;
return tmp.next;
}
}
```
### 䏿°ä¹å
[é¢ç®é¾æ¥](https://leetcode.cn/problems/3sum/)
**é¢ç®æè¿°**
ç»ä½ ä¸ä¸ªå
å« n ä¸ªæ´æ°çæ°ç» numsï¼å¤æ nums 䏿¯å¦åå¨ä¸ä¸ªå
ç´ aï¼bï¼c ï¼ä½¿å¾ a + b + c = 0 ï¼è¯·ä½ æ¾åºææå为 0 ä¸ä¸éå¤çä¸å
ç»ã
注æï¼çæ¡ä¸ä¸å¯ä»¥å
å«éå¤çä¸å
ç»ã
**示ä¾**
```java
è¾å
¥ï¼nums = [-1,0,1,2,-1,-4]
è¾åºï¼[[-1,-1,2],[-1,0,1]]
```
**æè·¯**ï¼
- é¦å
对æ°ç»è¿è¡æåºï¼æåºååºå®ä¸ä¸ªæ° nums[i]nums[i]ï¼å使ç¨å·¦å³æéæå nums[i]nums[i]åé¢çä¸¤ç«¯ï¼æ°ååå«ä¸º nums[L]nums[L] å
- nums[R]nums[R]ï¼è®¡ç®ä¸ä¸ªæ°çå sumsum 夿æ¯å¦æ»¡è¶³ä¸º 00ï¼æ»¡è¶³åæ·»å è¿ç»æé
- 妿 nums[i]nums[i]å¤§äº 00ï¼å䏿°ä¹åå¿
ç¶æ æ³çäº 00ï¼ç»æå¾ªç¯
- 妿 nums[i]nums[i] == nums[i-1]nums[iâ1]ï¼å说æè¯¥æ°åéå¤ï¼ä¼å¯¼è´ç»æéå¤ï¼æä»¥åºè¯¥è·³è¿
- å½ sumsum == 00 æ¶ï¼nums[L]nums[L] == nums[L+1]nums[L+1] åä¼å¯¼è´ç»æéå¤ï¼åºè¯¥è·³è¿ï¼L++L++
- å½ sumsum == 00 æ¶ï¼nums[R]nums[R] == nums[R-1]nums[Râ1] åä¼å¯¼è´ç»æéå¤ï¼åºè¯¥è·³è¿ï¼R--Rââ
**åè代ç **ï¼
```java
class Solution {
public List> threeSum(int[] nums) {
List> res = new ArrayList<>();
Arrays.sort(nums);
for (int i = 0; i < nums.length; i++) {
if (nums[i] > 0) { //æå·¦è¾¹çæ°å大äº0ï¼åsumä¸ä¼çäº0ï¼éåº
break;
}
if (i > 0 && nums[i] == nums[i - 1]) { //å»éå¤
continue;
}
int left = i + 1;
int right = nums.length - 1;
while (left < right) {
int sum = nums[i] + nums[left] + nums[right];
if (sum == 0) {
res.add(Arrays.asList(nums[i], nums[left], nums[right])); ///array to list
while (left < right && nums[left] == nums[left + 1]) {
left++;
}
while (left < right && nums[right] == nums[right - 1]) {
right--;
}
left++;
right--;
} else if (sum > 0) {
right--;
} else {
left++;
}
}
}
return res;
}
}
```
### ç¯å½¢é¾è¡¨
[é¢ç®é¾æ¥](https://leetcode.cn/problems/linked-list-cycle/)
**é¢ç®æè¿°**
ç»ä½ ä¸ä¸ªé¾è¡¨ç头èç¹ head ï¼å¤æé¾è¡¨ä¸æ¯å¦æç¯ã
妿é¾è¡¨ä¸ææä¸ªèç¹ï¼å¯ä»¥éè¿è¿ç»è·è¸ª next æé忬¡å°è¾¾ï¼åé¾è¡¨ä¸åå¨ç¯ã 为äºè¡¨ç¤ºç»å®é¾è¡¨ä¸çç¯ï¼è¯æµç³»ç»å
é¨ä½¿ç¨æ´æ° pos æ¥è¡¨ç¤ºé¾è¡¨å°¾è¿æ¥å°é¾è¡¨ä¸çä½ç½®ï¼ç´¢å¼ä» 0 å¼å§ï¼ã注æï¼pos ä¸ä½ä¸ºåæ°è¿è¡ä¼ é ãä»
ä»
æ¯ä¸ºäºæ è¯é¾è¡¨çå®é
æ
åµã
妿é¾è¡¨ä¸åå¨ç¯ ï¼åè¿å true ã å¦åï¼è¿å false ã
**示ä¾**
```java
è¾å
¥ï¼head = [3,2,0,-4], pos = 1
è¾åºï¼true
è§£éï¼é¾è¡¨ä¸æä¸ä¸ªç¯ï¼å
¶å°¾é¨è¿æ¥å°ç¬¬äºä¸ªèç¹ã
```
**æè·¯**
å¿«æ
¢æéãå¿«æéæ¯æ¬¡èµ°ä¸¤æ¥ï¼æ
¢æéèµ°ä¸æ¥ï¼ç¸å½äºæ
¢æéä¸å¨ï¼å¿«æéæ¯æ¬¡èµ°ä¸æ¥ï¼å¦ææ¯ç¯å½¢é¾è¡¨ï¼åä¸å®ä¼ç¸éã
```java
public class Solution {
public boolean hasCycle(ListNode head) {
if (head == null) {
return false;
}
ListNode quick = head;
ListNode slow = head;
while (quick != null && quick.next != null) {
slow = slow.next;
quick = quick.next.next;
if (slow == quick) {
return true;
}
}
return false;
}
}
```
### ç¯å½¢é¾è¡¨II
[é¢ç®é¾æ¥](https://leetcode.cn/problems/linked-list-cycle-ii/)
**é¢ç®æè¿°**
ç»å®ä¸ä¸ªé¾è¡¨ç头èç¹ head ï¼è¿åé¾è¡¨å¼å§å
¥ç¯ç第ä¸ä¸ªèç¹ã 妿é¾è¡¨æ ç¯ï¼åè¿å nullã
妿é¾è¡¨ä¸ææä¸ªèç¹ï¼å¯ä»¥éè¿è¿ç»è·è¸ª next æé忬¡å°è¾¾ï¼åé¾è¡¨ä¸åå¨ç¯ã 为äºè¡¨ç¤ºç»å®é¾è¡¨ä¸çç¯ï¼è¯æµç³»ç»å
é¨ä½¿ç¨æ´æ° pos æ¥è¡¨ç¤ºé¾è¡¨å°¾è¿æ¥å°é¾è¡¨ä¸çä½ç½®ï¼ç´¢å¼ä» 0 å¼å§ï¼ã妿 pos æ¯ -1ï¼åå¨è¯¥é¾è¡¨ä¸æ²¡æç¯ã注æï¼pos ä¸ä½ä¸ºåæ°è¿è¡ä¼ éï¼ä»
ä»
æ¯ä¸ºäºæ è¯é¾è¡¨çå®é
æ
åµã
ä¸å
è®¸ä¿®æ¹ é¾è¡¨ã
**示ä¾**
```java
è¾å
¥ï¼head = [3,2,0,-4], pos = 1
è¾åºï¼è¿åç´¢å¼ä¸º 1 çé¾è¡¨èç¹
è§£éï¼é¾è¡¨ä¸æä¸ä¸ªç¯ï¼å
¶å°¾é¨è¿æ¥å°ç¬¬äºä¸ªèç¹
```
**è§£é¢æè·¯**
æ¹æ³ä¸ï¼å¤´ç»ç¹å°å
¥ç¯ç»ç¹çè·ç¦»ä¸ºaï¼å
¥ç¯ç»ç¹å°ç¸éç»ç¹çè·ç¦»ä¸ºbï¼ç¸éç»ç¹å°å
¥ç¯ç»ç¹çè·ç¦»ä¸ºcãç¶åï¼å½fast以slowç两åé度åè¿å¹¶åslowç¸éæ¶ï¼fastèµ°è¿çè·ç¦»æ¯sç两åï¼å³æçå¼ï¼a+b+c+b = 2(a+b) ï¼å¯ä»¥å¾åº a = c ï¼æä»¥è¯´ï¼è®©faståslowåå«ä»ç¸éç»ç¹å头ç»ç¹åæ¶åæ¥é¿åºåï¼ä»ä»¬çç¸éç»ç¹å°±æ¯å
¥ç¯ç»ç¹ã
```java
public class Solution {
public ListNode detectCycle(ListNode head) {
ListNode fast = head;
ListNode slow = head;
while (true) {
if (fast == null || fast.next == null) {
return null;
}
fast = fast.next.next;
slow = slow.next;
if (fast == slow) {
break;
}
}
fast = head;
while (slow != fast) {
slow = slow.next;
fast = fast.next;
}
return fast;
}
}
```
æ¹æ³äºï¼å
ç®åºç¯ç大å°nï¼å¿«æéå
èµ°næ¥ï¼ç¶åå¿«æ
¢æéä¸èµ·èµ°ï¼ç¸éçå°æ¹å³æ¯ç¯çå
¥å£ã
```java
public class Solution {
public ListNode detectCycle(ListNode head) {
ListNode slow = head;
ListNode fast = head;
//å¿«æ
¢æéæ¾åºç¯ç大å°
while (fast != null && fast.next != null) {
slow = slow.next;
fast = fast.next.next;
if (fast == slow) {
break;
}
}
if (fast == null || fast.next == null) {
return null;
}
int cycleSize = 1;
while (fast.next != slow) {
cycleSize++;
fast = fast.next;
}
//å¿«æ
¢æééæ°ä»é¾è¡¨é¦é¨åºåï¼å¿«æéå
èµ°sizeOfCycleæ¥
//ç¶å两个æéåæ¶ä¸èµ·èµ°ï¼æ¥é¿ä¸º1ï¼ç¸éèç¹å³æ¯ç¯çå
¥å£
fast = head;
slow = head;
while (cycleSize-- > 0) {
fast = fast.next;
}
while (fast != slow) {
fast = fast.next;
slow = slow.next;
}
return fast;
}
}
```