Skip to content

Commit 8c3e41f

Browse files
committed
20190106
1 parent 1f63d60 commit 8c3e41f

File tree

5 files changed

+230
-0
lines changed

5 files changed

+230
-0
lines changed

code/lc160.java

+33
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package code;
2+
/*
3+
* 160. Intersection of Two Linked Lists
4+
* 题意:求两个链表的交叉点
5+
* 难度:Easy
6+
* 分类:LinkedList
7+
* 思路:两种方法:1.找出两个链表的长度差x,长的先走x步; 2.走完一个链表,走另一个链表,两个cur都走了两个链表长度的和步
8+
* Tips:两种方法的本质是一样的其实,都是找到了步数差,都遍历了两遍
9+
*/
10+
public class lc160 {
11+
public class ListNode {
12+
int val;
13+
ListNode next;
14+
ListNode(int x) { val = x; }
15+
}
16+
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
17+
if(headA==null||headB==null)
18+
return null;
19+
ListNode curA = headA;
20+
ListNode curB = headB;
21+
while (curA != curB) {
22+
if(curA == null)
23+
curA = headB;
24+
if(curB == null)
25+
curB = headA;
26+
if(curA==curB)
27+
return curA; //别忘了判断一下是否相等
28+
curA = curA.next;
29+
curB = curB.next;
30+
}
31+
return curA;
32+
}
33+
}

code/lc169.java

+26
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package code;
2+
/*
3+
* 169. Majority Element
4+
* 题意:数组中有一个元素出现次数 >len/2 ,找出这个数
5+
* 难度:Easy
6+
* 分类:Array, Divide and Conquer, Bit Maniputation
7+
* 思路:很多种方法, Hashmap 是 O(n), O(n)的。 快排是O(log(n)), O(1)的。最巧妙的办法是 O(n), O(1) 的如下。
8+
* Tips:之所以能够 O(n), O(1) 是因为题目已经给定了数组中一定能找到这个数,该方法充分利用了这一点
9+
*/
10+
public class lc169 {
11+
public int majorityElement(int[] nums) {
12+
int res = nums[0];
13+
int count = 1;
14+
for (int i = 1; i < nums.length ; i++) {
15+
if(nums[i]!=res) // 不是这个数就 --, ==0就用当前数替换res
16+
count--;
17+
else
18+
count++;
19+
if(count==0){
20+
res = nums[i];
21+
count++;
22+
}
23+
}
24+
return res;
25+
}
26+
}

code/lc198.java

+24
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package code;
2+
/*
3+
* 198. House Robber
4+
* 题意:数组最大和,不能选取相邻的两个数
5+
* 难度:Easy
6+
* 分类:Dynamic Programming
7+
* 思路:经典的dp题,记一下
8+
* Tips:时间复杂度为 O(n)
9+
*/
10+
public class lc198 {
11+
public int rob(int[] nums) {
12+
if(nums.length == 0)
13+
return 0;
14+
if(nums.length == 1)
15+
return nums[0];
16+
int[] dp = new int[nums.length];
17+
dp[0] = nums[0];
18+
dp[1] = Math.max(nums[0], nums[1]);
19+
for (int i = 2; i < nums.length ; i++) {
20+
dp[i] = Math.max((dp[i-2] + nums[i]),dp[i-1]); //dp[i] 表示以 0~i 的数组的结果
21+
}
22+
return dp[nums.length-1];
23+
}
24+
}

code/lc200.java

+109
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
package code;
2+
/*
3+
* 200. Number of Islands
4+
* 题意:0,1矩阵,求1片区个数
5+
* 难度:Medium
6+
* 分类:Depth-first Search, Breadth-first Search, Union Find
7+
* 思路:两种方法,一种搜索,一种并查集
8+
* Tips:
9+
*/
10+
public class lc200 {
11+
public int numIslands(char[][] grid) {
12+
if(grid.length==0)
13+
return 0;
14+
int count = 0;
15+
for (int i = 0; i < grid.length ; i++) {
16+
for (int j = 0; j < grid[i].length ; j++) {
17+
if( grid[i][j]=='1' ){
18+
count++;
19+
grid[i][j] = '0'; //置0, 下次不用考虑
20+
search(grid,i,j);
21+
}
22+
}
23+
}
24+
return count;
25+
}
26+
public void search(char[][] grid, int i, int j){
27+
if( i>0 && grid[i-1][j]=='1') {
28+
grid[i-1][j] = '0'; //置0, 下次不用考虑
29+
search(grid, i - 1, j);
30+
}
31+
if( j>0 && grid[i][j-1]=='1') {
32+
grid[i][j-1] = '0';
33+
search(grid, i, j-1);
34+
}
35+
if( i+1<grid.length && grid[i+1][j]=='1') {
36+
grid[i+1][j] = '0';
37+
search(grid, i + 1, j);
38+
}
39+
if( j+1<grid[0].length && grid[i][j+1]=='1') {
40+
grid[i][j+1] = '0';
41+
search(grid, i, j+1);
42+
}
43+
return;
44+
}
45+
46+
//并查集
47+
int[] flag;
48+
int count = 0;
49+
50+
public int numIslands2(char[][] grid) {
51+
if(grid.length==0)
52+
return 0;
53+
//初始化, 每个1都是一个island
54+
flag = new int[grid.length*grid[0].length];
55+
for (int i = 0; i < grid.length ; i++) {
56+
for (int j = 0; j < grid[0].length ; j++) {
57+
if(grid[i][j]=='1'){
58+
int id = i*grid[0].length+j;
59+
flag[id] = id;
60+
count++;
61+
}
62+
}
63+
}
64+
for (int i = 0; i < grid.length ; i++) {
65+
for (int j = 0; j < grid[0].length ; j++) {
66+
if(grid[i][j]=='1'){
67+
int id1 = i*grid[0].length+j;
68+
if( i>0 && grid[i-1][j]=='1') { //四个方向都合一下,虽然有些冗余
69+
int id2 = (i-1)*grid[0].length+j;
70+
union(id1, id2);
71+
}
72+
if( j>0 && grid[i][j-1]=='1') {
73+
int id2 = i*grid[0].length+j-1;
74+
union(id1, id2);
75+
}
76+
if( i+1<grid.length && grid[i+1][j]=='1') {
77+
int id2 = (i+1)*grid[0].length+j;
78+
union(id1, id2);
79+
}
80+
if( j+1<grid[0].length && grid[i][j+1]=='1') {
81+
int id2 = i*grid[0].length+j+1;
82+
union(id1, id2);
83+
}
84+
}
85+
}
86+
}
87+
return count;
88+
}
89+
90+
public void union(int id1, int id2){
91+
int flag_id1 = find(id1);
92+
int flag_id2 = find(id2);
93+
if(flag_id1==flag_id2)
94+
return;
95+
else{
96+
flag[flag_id1] = flag[flag_id2]; //把father们的 flag_id 合一起了
97+
count--;
98+
}
99+
}
100+
101+
public int find(int id){ //找到father的flag_id
102+
int res = flag[id];
103+
while(res != id){ //接着往上找father
104+
id = res;
105+
res = flag[id];
106+
}
107+
return res;
108+
}
109+
}

code/lc206.java

+38
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package code;
2+
/*
3+
* 206. Reverse Linked List
4+
* 题意:链表反转
5+
* 难度:Easy
6+
* 分类:Linked List
7+
* 思路:2中方法:设置一个快走一步的快指针,注意赋值操作顺序。还有一种递归的方法。
8+
* Tips:递归的方法有点绕,多看下
9+
*/
10+
public class lc206 {
11+
public class ListNode {
12+
int val;
13+
ListNode next;
14+
ListNode(int x) { val = x; }
15+
}
16+
17+
public ListNode reverseList(ListNode head) {
18+
ListNode newHead = null; //头节点变成尾节点,最后要指向null
19+
while (head != null) {
20+
ListNode next = head.next;
21+
head.next = newHead;
22+
newHead = head;
23+
head = next;
24+
}
25+
return newHead;
26+
}
27+
28+
public ListNode reverseList2(ListNode head) { //递归
29+
return reverseListInt(head, null);
30+
}
31+
private ListNode reverseListInt(ListNode head, ListNode newHead) {
32+
if (head == null)
33+
return newHead;
34+
ListNode next = head.next;
35+
head.next = newHead;
36+
return reverseListInt(next, head); //尾递归,操作已经完成,最后返回最后结果罢了
37+
}
38+
}

0 commit comments

Comments
 (0)