Skip to content

Commit a0d9aec

Browse files
author
yupeng10
committed
update
1 parent 370edff commit a0d9aec

20 files changed

+2873
-0
lines changed

.vscode/settings.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
"java.debug.settings.onBuildFailureProceed": true
3+
}
Lines changed: 161 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,161 @@
1+
//
2+
// 请你设计并实现一个满足
3+
// LRU (最近最少使用) 缓存 约束的数据结构。
4+
//
5+
//
6+
//
7+
// 实现
8+
// LRUCache 类:
9+
//
10+
//
11+
//
12+
//
13+
//
14+
// LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存
15+
// int get(int key) 如果关键字 key 存在于缓存中,则返回关键字的值,否则返回 -1 。
16+
// void put(int key, int value) 如果关键字 key 已经存在,则变更其数据值 value ;如果不存在,则向缓存中插入该组
17+
//key-value 。如果插入操作导致关键字数量超过 capacity ,则应该 逐出 最久未使用的关键字。
18+
//
19+
//
20+
//
21+
//
22+
// 函数 get 和 put 必须以 O(1) 的平均时间复杂度运行。
23+
//
24+
//
25+
//
26+
// 示例:
27+
//
28+
//
29+
//输入
30+
//["LRUCache", "put", "put", "get", "put", "get", "put", "get", "get", "get"]
31+
//[[2], [1, 1], [2, 2], [1], [3, 3], [2], [4, 4], [1], [3], [4]]
32+
//输出
33+
//[null, null, null, 1, null, -1, null, -1, 3, 4]
34+
//
35+
//解释
36+
//LRUCache lRUCache = new LRUCache(2);
37+
//lRUCache.put(1, 1); // 缓存是 {1=1}
38+
//lRUCache.put(2, 2); // 缓存是 {1=1, 2=2}
39+
//lRUCache.get(1); // 返回 1
40+
//lRUCache.put(3, 3); // 该操作会使得关键字 2 作废,缓存是 {1=1, 3=3}
41+
//lRUCache.get(2); // 返回 -1 (未找到)
42+
//lRUCache.put(4, 4); // 该操作会使得关键字 1 作废,缓存是 {4=4, 3=3}
43+
//lRUCache.get(1); // 返回 -1 (未找到)
44+
//lRUCache.get(3); // 返回 3
45+
//lRUCache.get(4); // 返回 4
46+
//
47+
//
48+
//
49+
//
50+
// 提示:
51+
//
52+
//
53+
// 1 <= capacity <= 3000
54+
// 0 <= key <= 10000
55+
// 0 <= value <= 10⁵
56+
// 最多调用 2 * 10⁵ 次 get 和 put
57+
//
58+
//
59+
// Related Topics 设计 哈希表 链表 双向链表 👍 3335 👎 0
60+
61+
62+
package leetcode.editor.cn;
63+
64+
import java.util.HashMap;
65+
import java.util.Map;
66+
67+
public class P146LruCache {
68+
public static void main(String[] args) {
69+
}
70+
71+
//leetcode submit region begin(Prohibit modification and deletion)
72+
class LRUCache {
73+
74+
class DLinkedNode {
75+
int key;
76+
int value;
77+
DLinkedNode next;
78+
DLinkedNode prev;
79+
}
80+
81+
int size;
82+
int capacity;
83+
DLinkedNode head;
84+
DLinkedNode tail;
85+
Map<Integer, DLinkedNode> cache = new HashMap<>();
86+
87+
public LRUCache(int capacity) {
88+
this.capacity = capacity;
89+
this.size = 0;
90+
this.head = new DLinkedNode();
91+
this.tail = new DLinkedNode();
92+
head.next = tail;
93+
tail.prev = head;
94+
}
95+
96+
public int get(int key) {
97+
DLinkedNode node = cache.get(key);
98+
if (node == null) {
99+
return -1;
100+
}
101+
moveToHead(node);
102+
return node.value;
103+
}
104+
105+
106+
public void put(int key, int value) {
107+
108+
DLinkedNode node = cache.get(key);
109+
if (node == null) {
110+
DLinkedNode newNode = new DLinkedNode();
111+
newNode.key = key;
112+
newNode.value = value;
113+
cache.put(key, newNode);
114+
addToHead(newNode);
115+
size++;
116+
if (size > capacity) {
117+
cache.remove(removeTail().key);
118+
size--;
119+
}
120+
}else {
121+
node.value = value;
122+
moveToHead(node);
123+
}
124+
125+
}
126+
127+
private DLinkedNode removeTail() {
128+
129+
DLinkedNode node = tail.prev;
130+
tail.prev = node.prev;
131+
node.prev.next = tail;
132+
return node;
133+
}
134+
135+
private void moveToHead(DLinkedNode node) {
136+
removeNode(node);
137+
addToHead(node);
138+
}
139+
140+
private void addToHead(DLinkedNode node) {
141+
node.next = head.next;
142+
node.prev = head;
143+
head.next.prev = node;
144+
head.next = node;
145+
}
146+
147+
private void removeNode(DLinkedNode node) {
148+
node.prev.next = node.next;
149+
node.next.prev = node.prev;
150+
}
151+
}
152+
153+
/**
154+
* Your LRUCache object will be instantiated and called as such:
155+
* LRUCache obj = new LRUCache(capacity);
156+
* int param_1 = obj.get(key);
157+
* obj.put(key,value);
158+
*/
159+
//leetcode submit region end(Prohibit modification and deletion)
160+
161+
}
Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
1+
//给你一个链表数组,每个链表都已经按升序排列。
2+
//
3+
// 请你将所有链表合并到一个升序链表中,返回合并后的链表。
4+
//
5+
//
6+
//
7+
// 示例 1:
8+
//
9+
// 输入:lists = [[1,4,5],[1,3,4],[2,6]]
10+
//输出:[1,1,2,3,4,4,5,6]
11+
//解释:链表数组如下:
12+
//[
13+
// 1->4->5,
14+
// 1->3->4,
15+
// 2->6
16+
//]
17+
//将它们合并到一个有序链表中得到。
18+
//1->1->2->3->4->4->5->6
19+
//
20+
//
21+
// 示例 2:
22+
//
23+
// 输入:lists = []
24+
//输出:[]
25+
//
26+
//
27+
// 示例 3:
28+
//
29+
// 输入:lists = [[]]
30+
//输出:[]
31+
//
32+
//
33+
//
34+
//
35+
// 提示:
36+
//
37+
//
38+
// k == lists.length
39+
// 0 <= k <= 10^4
40+
// 0 <= lists[i].length <= 500
41+
// -10^4 <= lists[i][j] <= 10^4
42+
// lists[i] 按 升序 排列
43+
// lists[i].length 的总和不超过 10^4
44+
//
45+
//
46+
// Related Topics 链表 分治 堆(优先队列) 归并排序 👍 2925 👎 0
47+
48+
49+
package leetcode.editor.cn;
50+
51+
public class P23MergeKSortedLists {
52+
public static void main(String[] args) {
53+
Solution solution = new P23MergeKSortedLists().new Solution();
54+
//[[1,4,5],[1,3,4],[2,6]]
55+
//生成测试用例
56+
ListNode l1 = new ListNode(1);
57+
ListNode l2 = new ListNode(4);
58+
ListNode l3 = new ListNode(5);
59+
l1.next = l2;
60+
l2.next = l3;
61+
ListNode l4 = new ListNode(1);
62+
ListNode l5 = new ListNode(3);
63+
ListNode l6 = new ListNode(4);
64+
l4.next = l5;
65+
l5.next = l6;
66+
ListNode l7 = new ListNode(2);
67+
ListNode l8 = new ListNode(6);
68+
l7.next = l8;
69+
ListNode[] lists = new ListNode[]{l1, l4, l7};
70+
solution.mergeKLists(lists);
71+
}
72+
//leetcode submit region begin(Prohibit modification and deletion)
73+
74+
/**
75+
* Definition for singly-linked list.
76+
* public class ListNode {
77+
* int val;
78+
* ListNode next;
79+
* ListNode() {}
80+
* ListNode(int val) { this.val = val; }
81+
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
82+
* }
83+
*/
84+
class Solution {
85+
public ListNode mergeKLists(ListNode[] lists) {
86+
return merge(lists, 0, lists.length-1);
87+
}
88+
89+
public ListNode merge(ListNode[] lists, int l, int r) {
90+
if (l == r) {
91+
return lists[l];
92+
}
93+
if (l > r) {
94+
return null;
95+
}
96+
int mid = (l+r) >> 1;
97+
return mergeTwoLists(merge(lists, l, mid), merge(lists, mid + 1, r));
98+
}
99+
100+
public ListNode mergeTwoLists(ListNode head1, ListNode head2) {
101+
if(head1 == null || head2 == null) return head1 == null ? head2 : head1;
102+
ListNode dummy = new ListNode(0);
103+
ListNode temp = dummy, temp1 = head1, temp2 = head2;
104+
while (temp1 != null && temp2 != null) {
105+
if (temp1.val < temp2.val) {
106+
temp.next = temp1;
107+
temp1 = temp1.next;
108+
} else {
109+
temp.next = temp2;
110+
temp2 = temp2.next;
111+
}
112+
temp = temp.next;
113+
}
114+
if (temp1 == null) {
115+
temp.next = temp2;
116+
} else {
117+
temp.next = temp1;
118+
}
119+
return dummy.next;
120+
}
121+
}
122+
//leetcode submit region end(Prohibit modification and deletion)
123+
124+
}
Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
//给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。
2+
//
3+
//
4+
//
5+
// 示例 1:
6+
//
7+
//
8+
//输入:nums = [1,2,3]
9+
//输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
10+
//
11+
//
12+
// 示例 2:
13+
//
14+
//
15+
//输入:nums = [0,1]
16+
//输出:[[0,1],[1,0]]
17+
//
18+
//
19+
// 示例 3:
20+
//
21+
//
22+
//输入:nums = [1]
23+
//输出:[[1]]
24+
//
25+
//
26+
//
27+
//
28+
// 提示:
29+
//
30+
//
31+
// 1 <= nums.length <= 6
32+
// -10 <= nums[i] <= 10
33+
// nums 中的所有整数 互不相同
34+
//
35+
//
36+
// Related Topics 数组 回溯 👍 3004 👎 0
37+
38+
39+
package leetcode.editor.cn;
40+
41+
import java.util.ArrayDeque;
42+
import java.util.ArrayList;
43+
import java.util.Arrays;
44+
import java.util.Deque;
45+
import java.util.List;
46+
public class P46Permutations{
47+
public static void main(String[] args) {
48+
int[] nums = {1, 2, 3};
49+
Solution solution = new P46Permutations().new Solution();
50+
List<List<Integer>> lists = solution.permute(nums);
51+
System.out.println(lists);
52+
}
53+
//leetcode submit region begin(Prohibit modification and deletion)
54+
55+
56+
57+
58+
59+
60+
public class Solution {
61+
62+
public List<List<Integer>> permute(int[] nums) {
63+
int len = nums.length;
64+
// 使用一个动态数组保存所有可能的全排列
65+
List<List<Integer>> res = new ArrayList<>();
66+
if (len == 0) {
67+
return res;
68+
}
69+
boolean[] used = new boolean[len];
70+
List<Integer> list = Arrays.asList(new Integer[nums.length]);
71+
dfs(used, len, res, nums, list, 0);
72+
return res;
73+
}
74+
75+
private void dfs(boolean[] used, int len, List<List<Integer>> res, int[] nums, List<Integer> path, int deph) {
76+
if (deph == len) {
77+
res.add(new ArrayList<>(path));
78+
return;
79+
}
80+
81+
for (int i = 0; i < len; i++) {
82+
if (!used[i]) {
83+
used[i] = true;
84+
path.set(deph, nums[i]);
85+
dfs(used, len, res, nums, path, deph + 1);
86+
used[i] = false;
87+
}
88+
}
89+
90+
}
91+
92+
93+
}
94+
95+
96+
//leetcode submit region end(Prohibit modification and deletion)
97+
98+
}

0 commit comments

Comments
 (0)