Skip to content

Commit a93189e

Browse files
committed
Java
1 parent ffdee51 commit a93189e

3 files changed

Lines changed: 121 additions & 12 deletions

File tree

docs/AimForOffer/13_排序.md

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -251,15 +251,72 @@ private int partition(int[] arr,int l,int r){
251251

252252
## 3、堆
253253

254+
使用数组存储二叉堆,下标从0开始:
255+
256+
<div align="center"><img src="https://gitee.com/duhouan/ImagePro/raw/master/java-notes/dataStructure/heap//heap_4.png" width="600px"/></div>
257+
254258

255259

256260

257261

258262
## 4、堆排序
259263

264+
堆排序思路:**把最大元素和当前堆中数组的最后一个元素交换位置,并且不删除它,那么就可以得到一个从尾到头的递减序列,从正向来看就是一个递增序列,这就是堆排序。**
265+
266+
```java
267+
public void sort(int[] arr){
268+
int N = arr.length;
269+
//构建大根堆
270+
for(int i=parent(N-1);i>=0;i--){ //从中间位置开始下沉
271+
sink(arr,i,N);
272+
}
273+
274+
//大根堆的根节点就是最大值
275+
while(N>0){
276+
swap(arr,0,N-1);
277+
//每次交换堆的最后一个元素和堆的一个元素,每次获取的最大值
278+
N--; // 相当于删除堆的第一个元素
279+
sink(arr,0,N); //每次再从 0 位置开始下沉,维护长度为 (N-1) 的大根堆
280+
}
281+
}
282+
283+
// 从 i 位置开始下沉
284+
// N 是堆中元素,可以动态变化
285+
private void sink(int[] num,int i,int N){
286+
while (leftChild(i)<N){
287+
int j = leftChild(i);
288+
if(j+1<N && num[j]<num[j+1]){
289+
j = rightChild(i);
290+
}
291+
if(num[i]>=num[j]){
292+
break;
293+
}
294+
swap(num,i,j); // i 位置和 j 位置元素交换
295+
i=j; // i 元素已经下沉,需要继续下沉
296+
}
297+
}
298+
299+
private int parent(int i){
300+
if(i==0){
301+
throw new IllegalArgumentException("index=0 时,不存在父节点");
302+
}
303+
return (i-1)/2;
304+
}
260305

306+
private int leftChild(int i){
307+
return 2*i+1;
308+
}
261309

310+
private int rightChild(int i){
311+
return 2*i+2;
312+
}
262313

314+
private void swap(int[] arr,int i,int j){
315+
int tmp = arr[i];
316+
arr[i] = arr[j];
317+
arr[j] = tmp;
318+
}
319+
```
263320

264321

265322

docs/AimForOffer/1_数组.md

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -389,29 +389,31 @@ public int MoreThanHalfNum_Solution(int [] array) {
389389
[扑克牌顺子](https://www.nowcoder.com/practice/762836f4d43d43ca9deb273b3de8e1f4?tpId=13&tqId=11198&tPage=1&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking)
390390

391391
```java
392+
//思路:使用大小王来补充中间差的牌
393+
394+
//为了方便统计大小王,先进行排序。
392395
public boolean isContinuous(int [] numbers) {
393-
if(numbers.length<5){
396+
if(numbers==null || numbers.length!=5){
397+
//必须是5张牌,形成顺子
394398
return false;
395399
}
396-
397-
//统计这些牌中大小王数
398-
int cnt=0;
399400
Arrays.sort(numbers);
400-
for(int num : numbers){
401-
if(num==0){
401+
int n =numbers.length;
402+
403+
int cnt=0; //统计大小王数量
404+
for(int i=0;i<n;i++){
405+
if(numbers[i]==0){
402406
cnt++;
403407
}else{
404408
break;
405409
}
406410
}
407-
408-
//使用大小王补全相邻数字中间的间隙
409-
for(int i=cnt;i<numbers.length-1;i++){ // i 从 cnt 开始,cnt 位置之前都是 0
410-
if(numbers[i]==numbers[i+1]){
411+
for(int i=cnt;i<n-1;i++){
412+
if(numbers[i]==numbers[i+1]){ //牌相等,不可能形成顺子
411413
return false;
412414
}
413-
//需要在 [numbers[i],numbers[i+1]] 之间插入 (numbers[i+1]-numbers[i]-1) 个元素
414-
cnt -= (numbers[i+1]-numbers[i]-1);
415+
int diff = numbers[i+1]-numbers[i]-1;
416+
cnt -= diff;
415417
}
416418
return cnt>=0;
417419
}

docs/AimForOffer/9_回溯.md

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,4 +176,54 @@ public int movingCount(int threshold, int rows, int cols) {
176176
visited = new boolean[m][n];
177177
return walk(threshold,0,0);
178178
}
179+
```
180+
181+
182+
183+
## 4、全排列
184+
185+
[全排列](https://leetcode-cn.com/problems/permutations/)
186+
187+
```java
188+
189+
```
190+
191+
192+
193+
## 5、全排列 II
194+
195+
[全排列 II](https://leetcode-cn.com/problems/permutations-ii/)
196+
197+
```java
198+
199+
```
200+
201+
202+
203+
## 6、字母大小写全排列
204+
205+
[字母大小写全排列](https://leetcode-cn.com/problems/letter-case-permutation/)
206+
207+
```java
208+
209+
```
210+
211+
212+
213+
## 7、电话号码的字母组合
214+
215+
[电话号码的字母组合](https://leetcode-cn.com/problems/letter-combinations-of-a-phone-number/)
216+
217+
```java
218+
219+
```
220+
221+
222+
223+
## 8、组合
224+
225+
[组合](https://leetcode-cn.com/problems/combinations/)
226+
227+
```java
228+
179229
```

0 commit comments

Comments
 (0)