Skip to content

Commit 733379b

Browse files
committed
新增2题,累积9题
1 parent cd93ebc commit 733379b

File tree

2 files changed

+150
-0
lines changed

2 files changed

+150
-0
lines changed
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
package com.cjl.leetcode;
2+
3+
import com.cjl.common.ListNode;
4+
5+
/*
6+
25. K 个一组翻转链表
7+
问题描述:
8+
给你一个链表,每k个节点一组进行翻转,请你返回翻转后的链表。
9+
k是一个正整数,它的值小于或等于链表的长度。
10+
如果节点总数不是k的整数倍,那么请将最后剩余的节点保持原有顺序。
11+
示例 1:
12+
输入:head = [1,2,3,4,5], k = 2
13+
输出:[2,1,4,3,5]
14+
示例 2:
15+
输入:head = [1,2,3,4,5], k = 3
16+
输出:[3,2,1,4,5]
17+
示例 3:
18+
输入:head = [1,2,3,4,5], k = 1
19+
输出:[1,2,3,4,5]
20+
示例 4:
21+
输入:head = [1], k = 1
22+
输出:[1]
23+
提示:
24+
列表中节点的数量在范围 sz 内
25+
1 <= sz <= 5000
26+
0 <= Node.val <= 1000
27+
1 <= k <= sz
28+
进阶:
29+
你可以设计一个只使用常数额外空间的算法来解决此问题吗?
30+
你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。
31+
*/
32+
public class Question_25 {
33+
34+
// 时间复杂度是O(N),空间复杂度是O(1)
35+
public ListNode solution1(ListNode head, int k) {
36+
ListNode res = new ListNode(0);
37+
ListNode pre = res, cur = head, next;
38+
res.next = head;
39+
int len = 0;
40+
while(head != null){
41+
len ++;
42+
head = head.next;
43+
}
44+
for (int i = 0; i < len / k; i++) {
45+
for (int j = 0; j < k - 1; j++) {
46+
next = cur.next;
47+
cur.next = next.next;
48+
next.next = pre.next;
49+
pre.next = next;
50+
}
51+
pre = cur;
52+
cur = pre.next;
53+
}
54+
return res.next;
55+
}
56+
}
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
package com.cjl.leetcode;
2+
3+
import java.util.HashMap;
4+
import java.util.HashSet;
5+
import java.util.Map;
6+
import java.util.Set;
7+
8+
/*
9+
4. 寻找两个正序数组的中位数
10+
问题描述:
11+
给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。
12+
示例 1:
13+
输入:nums1 = [1,3], nums2 = [2]
14+
输出:2.00000
15+
解释:合并数组 = [1,2,3] ,中位数 2
16+
示例 2:
17+
输入:nums1 = [1,2], nums2 = [3,4]
18+
输出:2.50000
19+
解释:合并数组 = [1,2,3,4] ,中位数 (2 + 3) / 2 = 2.5
20+
示例 3:
21+
输入:nums1 = [0,0], nums2 = [0,0]
22+
输出:0.00000
23+
示例 4:
24+
输入:nums1 = [], nums2 = [1]
25+
输出:1.00000
26+
示例 5:
27+
输入:nums1 = [2], nums2 = []
28+
输出:2.00000
29+
提示:
30+
nums1.length == m
31+
nums2.length == n
32+
0 <= m <= 1000
33+
0 <= n <= 1000
34+
1 <= m + n <= 2000
35+
-10^6 <= nums1[i], nums2[i] <= 10^6
36+
进阶:
37+
你能设计一个时间复杂度为 O(log (m+n)) 的算法解决此问题吗?
38+
*/
39+
public class Question_4 {
40+
41+
// 遍历求中位数法
42+
// 时间复杂度是O(M+N),空间复杂度是O(1)
43+
public double solution1(int[] nums1, int[] nums2) {
44+
int len = nums1.length + nums2.length;
45+
int left = -1;
46+
int right = -1;
47+
int nums1Start = 0;
48+
int nums2Start = 0;
49+
for (int i = 0; i <= len/2; i++) {
50+
left = right;
51+
if(nums1Start < nums1.length && (nums2Start >= nums2.length || nums1[nums1Start] < nums2[nums2Start])){
52+
right = nums1[nums1Start++];
53+
}else{
54+
right = nums2[nums2Start++];
55+
}
56+
}
57+
if((len & 1) == 0){
58+
return (left + right)/2.0;
59+
}else{
60+
return right;
61+
}
62+
}
63+
64+
// 二分查找法求中位数
65+
// 时间复杂度是O(log(M+N)),空间复杂度是O(1)
66+
public double solution2(int[] nums1, int[] nums2){
67+
int len1 = nums1.length;
68+
int len2 = nums2.length;
69+
int left = (len1 + len2 + 1)/2;
70+
int right = (len1 + len2 + 2)/2;
71+
return (findKth(nums1, 0, nums2, 0, left) + findKth(nums1, 0, nums2, 0, right)) / 2.0;
72+
}
73+
74+
private int findKth(int[] nums1, int nums1Start, int[] nums2, int nums2Start, int k) {
75+
if (nums1Start >= nums1.length) {
76+
//nums1为空数组
77+
return nums2[nums2Start + k - 1];
78+
}
79+
if (nums2Start >= nums2.length) {
80+
//nums2为空数组
81+
return nums1[nums1Start + k - 1];
82+
}
83+
if (k == 1) {
84+
return Math.min(nums1[nums1Start], nums2[nums2Start]);
85+
}
86+
int midVal1 = (nums1Start + k / 2 - 1 < nums1.length) ? nums1[nums1Start + k / 2 - 1] : Integer.MAX_VALUE;
87+
int midVal2 = (nums2Start + k / 2 - 1 < nums2.length) ? nums2[nums2Start + k / 2 - 1] : Integer.MAX_VALUE;
88+
if (midVal1 < midVal2) {
89+
return findKth(nums1, nums1Start + k / 2, nums2, nums2Start, k - k / 2);
90+
} else {
91+
return findKth(nums1, nums1Start, nums2, nums2Start + k / 2, k - k / 2);
92+
}
93+
}
94+
}

0 commit comments

Comments
 (0)