Skip to content

Commit 55c1230

Browse files
committed
提交作业
1 parent 2609786 commit 55c1230

3 files changed

Lines changed: 188 additions & 1 deletion

File tree

Week08/LRUCache.java

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
import java.util.HashMap;
2+
import java.util.Map;
3+
4+
public class LRUCache {
5+
6+
class CacheNode {
7+
private int key;
8+
9+
private int value;
10+
11+
private CacheNode prev;
12+
13+
private CacheNode next;
14+
15+
public CacheNode() {}
16+
17+
public CacheNode(int key, int value) {
18+
this.key = key;
19+
this.value = value;
20+
}
21+
}
22+
23+
private Map<Integer, CacheNode> instance;
24+
25+
private int size;
26+
private int capacity;
27+
private CacheNode head, tail;
28+
29+
30+
public LRUCache(int capacity) {
31+
instance = new HashMap<>(capacity);
32+
this.capacity = capacity;
33+
// 使用伪头部和伪尾部节点
34+
head = new CacheNode();
35+
tail = new CacheNode();
36+
head.next = tail;
37+
tail.prev = head;
38+
}
39+
40+
public int get(int key) {
41+
CacheNode node = instance.get(key);
42+
if (null == node) {
43+
return -1;
44+
}
45+
int value = node.value;
46+
moveToHead(node);
47+
return value;
48+
}
49+
50+
public void put(int key, int value) {
51+
CacheNode node = instance.get(key);
52+
if (null == node) {
53+
size++;
54+
if(size > capacity) {
55+
CacheNode node1 = removeTail();
56+
instance.remove(node1.key);
57+
size--;
58+
}
59+
CacheNode newNode = new CacheNode(key, value);
60+
instance.put(key, newNode);
61+
addToHead(newNode);
62+
return;
63+
}
64+
node.value = value;
65+
moveToHead(node);
66+
}
67+
68+
private void addToHead(CacheNode node) {
69+
node.prev = head;
70+
node.next = head.next;
71+
head.next.prev = node;
72+
head.next = node;
73+
}
74+
75+
private void removeNode(CacheNode node) {
76+
node.prev.next = node.next;
77+
node.next.prev = node.prev;
78+
}
79+
80+
private void moveToHead(CacheNode node) {
81+
removeNode(node);
82+
addToHead(node);
83+
}
84+
85+
private CacheNode removeTail() {
86+
CacheNode res = tail.prev;
87+
removeNode(res);
88+
return res;
89+
}
90+
}

Week08/NOTE.md

Lines changed: 61 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,61 @@
1-
学习笔记
1+
学习笔记
2+
```java
3+
public void bubbleSort(int[] nums) {
4+
int size = nums.length;
5+
for (int i = 0; i < size -1; i++) {
6+
for (int j = i; j < size - 1 - i; j++) {
7+
int tmp = nums[j];
8+
if (nums[j] > nums[j+1]) {
9+
nums[j] = nums[j+1];
10+
nums[j+1] = tmp;
11+
}
12+
}
13+
}
14+
}
15+
16+
public void selectionSort(int[] arr) {
17+
int len = arr.length;
18+
int minIndex, temp;
19+
for(int i = 0; i < len - 1; i++) {
20+
minIndex = i;
21+
for(int j = i + 1; j < len; j++) {
22+
if(arr[j] < arr[minIndex]) { // 寻找最小的数
23+
minIndex = j; // 将最小数的索引保存
24+
}
25+
}
26+
temp = arr[i];
27+
arr[i] = arr[minIndex];
28+
arr[minIndex] = temp;
29+
}
30+
}
31+
32+
public void insertionSort(int[] arr) {
33+
int len = arr.length;
34+
int preIndex, current;
35+
for(int i = 1; i < len; i++) {
36+
preIndex = i - 1;
37+
current = arr[i];
38+
while(preIndex >= 0 && arr[preIndex] > current) {
39+
arr[preIndex + 1] = arr[preIndex];
40+
preIndex--;
41+
}
42+
arr[preIndex + 1] = current;
43+
}
44+
}
45+
46+
public void shellSort(int[] arr) {
47+
int len = arr.length;
48+
for(int gap = (int) Math.floor(len / 2); gap > 0; gap = (int) Math.floor(gap / 2)) {
49+
for(int i = gap; i < len; i++) {
50+
int j = i;
51+
int current = arr[i];
52+
while(j - gap >= 0 && current < arr[j - gap]) {
53+
arr[j] = arr[j - gap];
54+
j = j - gap;
55+
}
56+
arr[j] = current;
57+
}
58+
}
59+
}
60+
```
61+

Week08/ReversePairs.java

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package com.ryuhi.execute.leetcode;
2+
3+
public class ReversePairs {
4+
5+
public int reversePairs(int[] nums) {
6+
if(nums == null || nums.length == 0) {
7+
return 0;
8+
}
9+
return mergeSort(nums,0,nums.length-1);
10+
}
11+
12+
public int mergeSort(int[] nums,int left,int right){
13+
if(right <= left ){
14+
return 0;
15+
}
16+
int mid = (left+right) >> 1;
17+
int count = mergeSort(nums,left,mid)+mergeSort(nums,mid+1,right);
18+
// 中间数组用于合并
19+
int[] cache = new int[right-left+1];
20+
int i = left, j = mid+1, k = 0, tmp = left;
21+
while(j <= right){
22+
while(tmp <= mid && nums[tmp] <= (long)nums[j] << 1) {
23+
tmp++;
24+
}
25+
while(i <= mid && nums[i] < nums[j] ) {
26+
cache[k++] = nums[i++];
27+
}
28+
cache[k++] = nums[j++];
29+
count += mid - tmp + 1 ;
30+
}
31+
while(i <= mid) {
32+
cache[k++] = nums[i++];
33+
}
34+
System.arraycopy(cache,0,nums,left,right- left +1);
35+
return count;
36+
}
37+
}

0 commit comments

Comments
 (0)