add quicksort
This commit is contained in:
@@ -143,6 +143,44 @@ void quicksort(int *a, int left, int right){
|
|||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```Java
|
||||||
|
// pivot 选择 尾部节点, 代码写起来更加简单; 移动元素更方便
|
||||||
|
static int partition(int[] nums, int left, int right){
|
||||||
|
|
||||||
|
int pivot = nums[right];//选尾部节点作为 pivot
|
||||||
|
int end = right;
|
||||||
|
|
||||||
|
right--;
|
||||||
|
while (left < right) {
|
||||||
|
|
||||||
|
if (nums[left] <= pivot) {
|
||||||
|
left ++ ;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
//元素比 pivot 大,右边窗口变小
|
||||||
|
//swap left & right
|
||||||
|
swap(nums, left, right);
|
||||||
|
right--;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// 跟 pivot 元素置换
|
||||||
|
int i = 0;
|
||||||
|
if (nums[left] <= pivot) {
|
||||||
|
//swap left+1 & pivot
|
||||||
|
i = left +1;
|
||||||
|
} else {//swap left & pivot
|
||||||
|
i = left ;
|
||||||
|
}
|
||||||
|
|
||||||
|
swap(nums, i, end);
|
||||||
|
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
|
|||||||
@@ -97,6 +97,7 @@ for 状态1 in 状态1的所有取值:
|
|||||||
## 凑零钱问题
|
## 凑零钱问题
|
||||||
|
|
||||||
凑零钱问题[视频解读参考这里](https://www.ixigua.com/6881883015832666635?wid_try=1)
|
凑零钱问题[视频解读参考这里](https://www.ixigua.com/6881883015832666635?wid_try=1)
|
||||||
|
[实现代码这里](https://github.com/nonstriater/deep-in-java/tree/master/src/main/java/com/nonstriater/deepinjava/algo/list)
|
||||||
|
|
||||||
如果使用贪心策略,并不能得到最优解。
|
如果使用贪心策略,并不能得到最优解。
|
||||||
|
|
||||||
@@ -104,11 +105,12 @@ for 状态1 in 状态1的所有取值:
|
|||||||
|
|
||||||
```Java
|
```Java
|
||||||
//递归解法,处理重叠子问题, 使用 dp[amount+1] 备忘录
|
//递归解法,处理重叠子问题, 使用 dp[amount+1] 备忘录
|
||||||
int coinChange2(int[] coins, int amount) {
|
int coinChange2(int[] coins, int amount) {
|
||||||
int[] dp = new int[amount + 1];
|
int[] dp = new int[amount + 1];
|
||||||
|
|
||||||
// 数组大小为 amount + 1,初始值也为 amount + 1
|
// 数组大小为 amount + 1,初始值也为 amount + 1
|
||||||
// 为啥 dp 数组初始化为 amount + 1 呢,因为凑成 amount 金额的硬币数最多只可能等于 amount(全用 1 元面值的硬币),所以初始化为 amount + 1 就相当于初始化为正无穷
|
// 为啥 dp 数组初始化为 amount + 1 呢?
|
||||||
|
// 因为凑成 amount 金额的硬币数最多只可能等于 amount(全用 1 元面值的硬币),所以初始化为 amount + 1 就相当于初始化为正无穷
|
||||||
Arrays.fill(dp, amount + 1);
|
Arrays.fill(dp, amount + 1);
|
||||||
|
|
||||||
// base case
|
// base case
|
||||||
@@ -125,11 +127,36 @@ for 状态1 in 状态1的所有取值:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
return (dp[amount] == amount + 1) ? -1 : dp[amount];
|
return (dp[amount] == amount + 1) ? -1 : dp[amount];
|
||||||
}
|
}
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
## 股票问题
|
||||||
|
|
||||||
|
|
||||||
|
```
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
## 接雨水问题
|
||||||
|
|
||||||
|
num[i]表示柱子高度,计算下雨之后最多能接多少雨水
|
||||||
|
|
||||||
|
|
||||||
|
```
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user