File tree 4 files changed +86
-19
lines changed
4 files changed +86
-19
lines changed Original file line number Diff line number Diff line change 1
1
package code ;
2
+
3
+ import java .util .ArrayList ;
4
+ import java .util .List ;
5
+
2
6
/*
3
7
* 148. Sort List
4
8
* 题意:链表排序
5
9
* 难度:Medium
6
10
* 分类:Linked List, Sort
7
11
* 思路:快慢指针把链表分成两半,在merge两个链表
12
+ * 快排方法自己不会写,记下思路
13
+ * 快排尝试直接以ListNode互相交换位置,节点间的指向会乱掉的,当递归子情况的时候会修改指针,父方法不知道子调用做了哪些操作
14
+ * https://www.cnblogs.com/morethink/p/8452914.html
8
15
* Tips:空间复杂度不是O(1)的,但是几个高票答案都是这样写的,面试给出这样的代码应该也够了
9
16
*/
10
17
public class lc148 {
@@ -52,4 +59,40 @@ public ListNode mergeList(ListNode l1, ListNode l2){
52
59
}
53
60
return head .next ;
54
61
}
62
+
63
+ public ListNode sortList2 (ListNode head ) { //链表快排
64
+ //采用快速排序
65
+ quickSort (head , null );
66
+ return head ;
67
+ }
68
+ public void quickSort (ListNode head , ListNode end ) {
69
+ if (head != end ) {
70
+ ListNode node = partion (head , end );
71
+ quickSort (head , node );
72
+ quickSort (node .next , end );
73
+ }
74
+ }
75
+
76
+ public ListNode partion (ListNode head , ListNode end ) {
77
+ ListNode p1 = head , p2 = head .next ;
78
+
79
+ //走到末尾才停
80
+ while (p2 != end ) { //p1与p2间都是大于pivot的数
81
+ if (p2 .val < head .val ) { //lc922 类似的思想, 把小于的值放到该放的位置上
82
+ p1 = p1 .next ;
83
+
84
+ int temp = p1 .val ;
85
+ p1 .val = p2 .val ;
86
+ p2 .val = temp ;
87
+ }
88
+ p2 = p2 .next ;
89
+ }
90
+
91
+ //与pivot交换下位置
92
+ int temp = p1 .val ;
93
+ p1 .val = head .val ;
94
+ head .val = temp ;
95
+
96
+ return p1 ; //返回
97
+ }
55
98
}
Original file line number Diff line number Diff line change 5
5
* 难度:Hard
6
6
* 分类:Backtracking
7
7
* 思路:回溯+判断,注意怎么判断两个斜线方向
8
- * Tips:
8
+ * Tips:lc52
9
9
*/
10
10
import java .util .ArrayList ;
11
11
import java .util .HashSet ;
Original file line number Diff line number Diff line change
1
+ package code ;
2
+
3
+ import java .util .HashSet ;
4
+ /*
5
+ * 52. N-Queens II
6
+ * 题意:8皇后问题
7
+ * 难度:Hard
8
+ * 分类:Backtracking
9
+ * 思路:和 lc51 一样,输出变为种类数,反而简单了
10
+ * Tips:
11
+ */
12
+ public class lc52 {
13
+ HashSet <String > hs = new HashSet ();
14
+ int res = 0 ;
15
+ public int totalNQueens (int n ) {
16
+ dfs (n , 0 );
17
+ return res ;
18
+ }
19
+
20
+ public void dfs (int n , int row ){
21
+ if (row ==n ){
22
+ res ++;
23
+ }
24
+ for (int i = 0 ; i < n ; i ++) {
25
+ if (isValid (row , i )){
26
+ int a = row +i ; // row+col 作为key
27
+ int b = row -i ; // row-col 作为key
28
+ hs .add ("row" +row ); hs .add ("col" +i ); hs .add ("k1" +a ); hs .add ("k2" +b );
29
+ dfs (n , row +1 );
30
+ hs .remove ("row" +row ); hs .remove ("col" +i ); hs .remove ("k1" +a ); hs .remove ("k2" +b ); //别忘了删掉
31
+ }
32
+ }
33
+ }
34
+
35
+ public boolean isValid (int row , int col ){
36
+ int a = row +col ;
37
+ int b = row -col ;
38
+ if (hs .contains ("row" +row )||hs .contains ("col" +col )||hs .contains ("k1" +a )||hs .contains ("k2" +b )) return false ;
39
+ return true ;
40
+ }
41
+ }
Original file line number Diff line number Diff line change 9
9
* 分类:Two Pointers
10
10
* 思路:由于本题只要求给出多少种Int值,所以不一定非要用3Sum的思路,有很多更简答的方法
11
11
* 3种思路
12
- * Tips:
12
+ * Tips:lc15, lc16, lc923
13
13
*/
14
14
public class lc923 {
15
15
public int threeSumMulti (int [] A , int target ) {
@@ -53,21 +53,4 @@ else if(A[left]==A[right]) { //如果相等,则直接 C N 取 2,计算出
53
53
return res ;
54
54
}
55
55
56
- public int threeSumMulti3 (int [] A , int target ) { //直接数学计算
57
- long [] c = new long [101 ];
58
- for (int a : A ) c [a ]++;
59
- long res = 0 ;
60
- for (int i = 0 ; i <= 100 ; i ++) // 题目给了值不超过100
61
- for (int j = i ; j <= 100 ; j ++) {
62
- int k = target - i - j ;
63
- if (k > 100 || k < 0 ) continue ;
64
- if (i == j && j == k )
65
- res += c [i ] * (c [i ] - 1 ) * (c [i ] - 2 ) / 6 ;
66
- else if (i == j && j != k )
67
- res += c [i ] * (c [i ] - 1 ) / 2 * c [k ];
68
- else if (j < k )
69
- res += c [i ] * c [j ] * c [k ];
70
- }
71
- return (int )(res % (1e9 + 7 ));
72
- }
73
56
}
You can’t perform that action at this time.
0 commit comments