Skip to content

Commit 9735dda

Browse files
committed
新增2题,累积21题
1 parent c81f786 commit 9735dda

File tree

3 files changed

+122
-5
lines changed

3 files changed

+122
-5
lines changed
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
package com.cjl.leetcode;
2+
3+
import com.cjl.common.ListNode;
4+
5+
import java.util.*;
6+
7+
/*
8+
23. 合并K个升序链表
9+
问题描述:
10+
给你一个链表数组,每个链表都已经按升序排列。
11+
请你将所有链表合并到一个升序链表中,返回合并后的链表。
12+
示例 1:
13+
输入:lists = [[1,4,5],[1,3,4],[2,6]]
14+
输出:[1,1,2,3,4,4,5,6]
15+
解释:链表数组如下:
16+
[
17+
1->4->5,
18+
1->3->4,
19+
2->6
20+
]
21+
将它们合并到一个有序链表中得到。
22+
1->1->2->3->4->4->5->6
23+
示例 2:
24+
输入:lists = []
25+
输出:[]
26+
示例 3:
27+
输入:lists = [[]]
28+
输出:[]
29+
提示:
30+
k == lists.length
31+
0 <= k <= 10^4
32+
0 <= lists[i].length <= 500
33+
-10^4 <= lists[i][j] <= 10^4
34+
lists[i] 按 升序 排列
35+
lists[i].length 的总和不超过 10^4
36+
*/
37+
public class Question_23 {
38+
39+
// 时间复杂度是O(NlogK),空间复杂度是O(K),K为队列中的元素数量
40+
public ListNode solution1(ListNode[] lists) {
41+
if(lists == null || lists.length == 0) {
42+
return null;
43+
}
44+
Queue<ListNode> pq = new PriorityQueue<>(Comparator.comparingInt(v -> v.val));
45+
for (ListNode list : lists) {
46+
// 添加集合中的链表
47+
if(list != null) {
48+
pq.offer(list);
49+
}
50+
}
51+
ListNode head = new ListNode(0);
52+
ListNode cur = head;
53+
while(!pq.isEmpty()) {
54+
ListNode tmp = pq.poll();
55+
cur.next = tmp;
56+
cur = cur.next;
57+
if(tmp.next != null){
58+
// 将当前的链表节点往后移
59+
pq.offer(tmp.next);
60+
}
61+
}
62+
return head.next;
63+
}
64+
}
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
package com.cjl.leetcode;
2+
3+
import java.util.ArrayList;
4+
import java.util.Arrays;
5+
import java.util.Collections;
6+
import java.util.List;
7+
import java.util.stream.Collectors;
8+
9+
/*
10+
46. 全排列
11+
问题描述:
12+
给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。
13+
示例 1:
14+
输入:nums = [1,2,3]
15+
输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
16+
示例 2:
17+
输入:nums = [0,1]
18+
输出:[[0,1],[1,0]]
19+
示例 3:
20+
输入:nums = [1]
21+
输出:[[1]]
22+
提示:
23+
1 <= nums.length <= 6
24+
-10 <= nums[i] <= 10
25+
nums 中的所有整数 互不相同
26+
*/
27+
public class Question_46 {
28+
29+
// 时间复杂度是O(N),空间复杂度是O(N)
30+
public List<List<Integer>> solution1(int[] nums) {
31+
List<List<Integer>> res = new ArrayList<>();
32+
if (nums.length == 0) {
33+
return res;
34+
}
35+
recur(nums, new ArrayList<>(), res);
36+
return res;
37+
}
38+
39+
private void recur(int[] nums, List<Integer> target, List<List<Integer>> res) {
40+
if (target.size() == nums.length) {
41+
res.add(new ArrayList<>(target));
42+
return;
43+
}
44+
for (int cur : nums) {
45+
if (target.contains(cur)) {
46+
continue;
47+
}
48+
target.add(cur);
49+
recur(nums, target, res);
50+
target.remove(target.size() - 1);
51+
}
52+
}
53+
}

src/com/cjl/leetcode/Question_56.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
public class Question_56 {
2424

2525
public int[][] solution1(int[][] intervals) {
26-
if(intervals == null || intervals.length == 1){
26+
if (intervals == null || intervals.length == 1) {
2727
return intervals;
2828
}
2929
List<Integer> arr = new ArrayList<>();
@@ -36,16 +36,16 @@ public int[][] solution1(int[][] intervals) {
3636
// 当前最小界大于前面的最大界,不能合并
3737
arr.add(interval[0]);
3838
arr.add(interval[1]);
39-
}else if (interval[1] > preEnd){
39+
} else if (interval[1] > preEnd) {
4040
// 当前最小界小于或等于前面的最大界,并且当前最大界大于前面的最大界,可合并
4141
arr.remove(arr.size() - 1);
4242
arr.add(interval[1]);
4343
}
44-
preEnd = Math.max(preEnd,interval[1]);
44+
preEnd = Math.max(preEnd, interval[1]);
4545
}
46-
int[][] res = new int[arr.size()/2][2];
46+
int[][] res = new int[arr.size() / 2][2];
4747
for (int i = 0; i < arr.size(); i++) {
48-
res[i/2][i%2] = arr.get(i);
48+
res[i / 2][i % 2] = arr.get(i);
4949
}
5050
return res;
5151
}

0 commit comments

Comments
 (0)