Skip to content

Commit f1a3fe6

Browse files
committed
Leetcode
1 parent 811dbb9 commit f1a3fe6

File tree

2 files changed

+84
-20
lines changed

2 files changed

+84
-20
lines changed

FindMedianFromDataStream.java

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
import java.util.ArrayList;
2+
import java.util.List;
3+
4+
/**
5+
* Median is the middle value in an ordered integer list. If the size of the list is even,
6+
* there is no middle value. So the median is the mean of the two middle value.
7+
* <p>
8+
* For example,
9+
* [2,3,4], the median is 3
10+
* <p>
11+
* [2,3], the median is (2 + 3) / 2 = 2.5
12+
* <p>
13+
* Design a data structure that supports the following two operations:
14+
* <p>
15+
* void addNum(int num) - Add a integer number from the data stream to the data structure.
16+
* double findMedian() - Return the median of all elements so far.
17+
*/
18+
19+
class MedianFinder {
20+
21+
private final List<Integer> elements = new ArrayList<>();
22+
23+
/**
24+
* initialize your data structure here.
25+
*/
26+
public MedianFinder() {
27+
}
28+
29+
public void addNum(int num) {
30+
qinsert(0, elements.size() - 1, num);
31+
}
32+
33+
public double findMedian() {
34+
if (elements.size() % 2 == 0) {
35+
int q = elements.size() / 2;
36+
int p = q > 0 ? q - 1 : q;
37+
return (elements.get(p) + elements.get(q)) / 2.f;
38+
} else {
39+
return elements.get((elements.size() - 1) / 2);
40+
}
41+
}
42+
43+
private void qinsert(int start, int end, int num) {
44+
if (start > end) {
45+
elements.add(start, num);
46+
return;
47+
}
48+
int index = (start + end) / 2;
49+
int mid = elements.get(index);
50+
if (mid == num) {
51+
elements.add(index, num);
52+
return;
53+
}
54+
if (mid < num) {
55+
qinsert(index + 1, end, num);
56+
} else {
57+
qinsert(start, index - 1, num);
58+
}
59+
}
60+
}

ReverseNodesinkGroup.java

Lines changed: 24 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -18,33 +18,37 @@
1818
*/
1919
public class ReverseNodesinkGroup {
2020
public ListNode reverseKGroup(ListNode head, int k) {
21-
if (head == null) return null;
22-
int t = 0;
23-
ListNode nextHead = head;
24-
while (nextHead != null && t < k - 1) {
25-
nextHead = nextHead.next;
26-
t++;
27-
}
28-
if (nextHead == null || t < k - 1) {
21+
if (head == null || k < 2) {
2922
return head;
30-
} else {
31-
ListNode nextPart = reverseKGroup(nextHead.next, k);
32-
return reverseList(head, k, nextPart);
3323
}
24+
int count = 0;
25+
ListNode root = new ListNode(0);
26+
root.next = head;
27+
ListNode start = head;
28+
ListNode end = start;
29+
while (count < k - 1 && end != null && end.next != null) {
30+
count++;
31+
end = end.next;
32+
}
33+
if (count == k - 1) {
34+
ListNode nextStart = end.next;
35+
end.next = null;
36+
reverseList(start);
37+
root.next = end;
38+
start.next = reverseKGroup(nextStart, k);
39+
}
40+
return root.next;
3441
}
3542

36-
private ListNode reverseList(ListNode head, int k, ListNode nextPart) {
37-
ListNode cur = head, prev = null, next = null;
38-
for (int i = 0; i < k; i++) {
43+
private void reverseList(ListNode start) {
44+
ListNode next;
45+
ListNode cur = start;
46+
ListNode prev = null;
47+
while (cur != null) {
3948
next = cur.next;
40-
if (i != 0) {
41-
cur.next = prev;
42-
} else {
43-
cur.next = nextPart;
44-
}
49+
cur.next = prev;
4550
prev = cur;
4651
cur = next;
4752
}
48-
return prev;
4953
}
5054
}

0 commit comments

Comments
 (0)