Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit e45ec2e

Browse files
JAVA 知识体系
1 parent 2e8d719 commit e45ec2e

File tree

5 files changed

+148
-17
lines changed

5 files changed

+148
-17
lines changed

‎README.md‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@
100100
- [画一个线程的生命周期状态图。](https://blog.csdn.net/houbin0912/article/details/77969563)
101101
- sleep和wait的区别。
102102
- sleep和sleep(0)的区别。
103+
- [Java 各种锁的小结](https://mp.weixin.qq.com/s/_xazrXa8MBYaz2WaX6BNew)
103104
- [Lock与Synchronized的区别 。](https://blog.csdn.net/javazejian/article/details/75043422)
104105
- [synchronized的原理是什么](https://blog.csdn.net/javazejian/article/details/72828483)
105106
- [量级锁,可重入锁,公平锁,非公平锁,乐观锁,悲观锁。](https://www.toutiao.com/i6630764198357893646/)

‎src/main/java/com/algorithm/study/demo/datastructure/heap/TopkCount.java‎

Lines changed: 59 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ public class TopkCount {
1717
* @param k
1818
* @return
1919
*/
20-
public static int[] topk(int[] data, int k) {
20+
public static int topk(int[] data, int k) {
2121
PriorityQueue<Integer> queue = new PriorityQueue<>(k);
2222

2323
for (int i = 0; i < data.length; i++) {
@@ -32,18 +32,69 @@ public static int[] topk(int[] data, int k) {
3232
}
3333
}
3434
}
35+
return queue.peek();
36+
}
37+
38+
/**
39+
* 手动实现堆然后查找topK
40+
* @param nums
41+
* @param k
42+
* @return
43+
*/
44+
public static int findKthLargest(int[] nums, int k) {
45+
//构建一个小顶堆数组
46+
int[] out = new int[k];
47+
//小顶堆元素数量
48+
int count = 0;
49+
//循环处理数组
50+
for (int i=0;i<nums.length;i++){
51+
//数组没有满之前,从下向上调整
52+
if(count<k){
53+
out[i] = nums[i];
54+
count++;
55+
down2up(out,i);
56+
}else{
57+
//数组满了以后,如果新元素大于堆顶则替换堆顶,然后从上向下调整
58+
if(nums[i]>out[0]){
59+
out[0] = nums[i];
60+
up2down(out,0);
61+
}
62+
}
63+
}
64+
return out[0];
65+
}
3566

36-
int[] result = new int[k];
37-
int index = 0;
38-
// 遍历完成后,小顶堆的数据就为需要求得的topk的数据
39-
while (!queue.isEmpty()) {
40-
result[index++] = queue.poll();
67+
//从下向上调整,构建小顶堆
68+
public static void down2up(int[] nums,int i){
69+
int parent = (i-1)/2;
70+
while(parent>=0&&nums[i]<nums[parent]){
71+
swap(nums,i,parent);
72+
i = parent;
73+
parent = (i-1)/2;
4174
}
75+
}
76+
77+
//从上向下调整,构建小顶堆
78+
public static void up2down(int[] nums,int p){
79+
while(true){
80+
int left = 2*p+1;
81+
int right = 2*p+2;
82+
int minpos = p;
83+
if(left<nums.length&&nums[left]<nums[p]) minpos=left;
84+
if(right<nums.length&&nums[right]<nums[minpos]) minpos=right;
85+
if(minpos==p) break;
86+
swap(nums,p,minpos);
87+
p = minpos;
88+
}
89+
}
4290

43-
return result;
91+
private static void swap(int[] nums, int i, int parent) {
92+
int tmp = nums[i];
93+
nums[i] = nums[parent];
94+
nums[parent] = tmp;
4495
}
4596

4697
public static void main(String[] args) {
47-
System.out.println(JSON.toJSONString(topk(new int[]{1,2,3,4,5},2)));
98+
System.out.println(findKthLargest(new int[]{1,2,3,4,5},2));
4899
}
49100
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package com.algorithm.study.demo.datastructure.linear;
2+
3+
/**
4+
* 链表数据结构
5+
* @Author: liuxun
6+
* @CreateDate: 2019年2月12日 下午3:43
7+
* @Version: 1.0
8+
*/
9+
public class ListNode {
10+
int val;
11+
ListNode next;
12+
public ListNode(int val){
13+
this.val=val;
14+
}
15+
}

‎src/main/java/com/algorithm/study/demo/datastructure/linear/MLinkList.java‎

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
*/
1313
public class MLinkList<E> {
1414
// 定义一个内部类Node,代表链表的节点
15-
private class Node {
15+
public class Node {
1616
private E value;// 保存数据
1717
private Node next;// 指向下个节点的引用
1818

@@ -214,17 +214,17 @@ public void reverseLinkedList(){
214214
System.out.println("反转完毕");
215215
}
216216

217-
218217
public static void main(String[] args) {
219-
MLinkList mLinkList=new MLinkList();
220-
mLinkList.add("a");
221-
mLinkList.add("b");
222-
mLinkList.add("c");
223-
mLinkList.add("d");
218+
MLinkList<Integer> mLinkList=new MLinkList();
219+
mLinkList.add(4);
220+
mLinkList.add(1);
221+
mLinkList.add(8);
222+
mLinkList.add(4);
223+
mLinkList.add(5);
224224
// System.out.println(mLinkList.toString());
225225
// mLinkList.delete("b");
226-
mLinkList.delete(0);
227-
System.out.println(mLinkList.size);
226+
// mLinkList.delete(0);
227+
// System.out.println(mLinkList.size);
228228
// mLinkList.reverseLinkedList();
229229
System.out.println(mLinkList.toString());
230230

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
package com.algorithm.study.demo.datastructure.linear;
2+
3+
import org.omg.PortableInterceptor.INACTIVE;
4+
5+
import java.util.Arrays;
6+
import java.util.HashMap;
7+
import java.util.Map;
8+
9+
/**
10+
* @Author: liuxun
11+
* @CreateDate: 2019年2月12日 下午3:43
12+
* @Version: 1.0
13+
*/
14+
public class Solution {
15+
public static ListNode detectCycle(ListNode head) {
16+
ListNode temp=head;
17+
ListNode temp2=head;
18+
while(temp!=null && temp.next.next!=null){
19+
temp2=temp2.next.next;
20+
temp=temp.next;
21+
if (temp==temp2){
22+
ListNode q = head;
23+
while(temp2!=q){
24+
temp2=temp2.next;
25+
q=q.next;
26+
}
27+
return q;
28+
}
29+
}
30+
return null;
31+
}
32+
33+
public static void main(String[] args) {
34+
ListNode head=new ListNode(3);
35+
ListNode head0=new ListNode(1);
36+
37+
ListNode head1=new ListNode(2);
38+
ListNode head2=new ListNode(-4);
39+
40+
head.next=head0;
41+
head0.next=head1;
42+
head1.next=head2;
43+
head2.next=head1;
44+
// head1.next=head2;
45+
// head2.next=head3;
46+
// head3.next=head1;
47+
ListNode c=Solution.detectCycle(head);
48+
System.out.println(c==null?-1:1);
49+
50+
51+
}
52+
public boolean containsDuplicate(int[] nums) {
53+
if(nums==null || nums.length<2){
54+
return false;
55+
}
56+
Arrays.sort(nums);
57+
for(int i=0;i<nums.length-1;i++){
58+
if (nums[i]==nums[i+1]){
59+
return true;
60+
}
61+
}
62+
return false;
63+
}
64+
}

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /