本文收集了一些LeetCode的一些较难的题目。

找出两个正序数组的中位数

给定两个大小为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出这两个正序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。 (归并、快速排序 n.log(n))。假设 nums1 和 nums2 不会同时为空。
示例 1: nums1 = [1, 3] nums2 = [2] 则中位数是 2.0
示例 2: nums1 = [1, 2] nums2 = [3, 4] 则中位数是 (2 + 3)/2 = 2.5

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
public static double problem1(int[] nums1, int[] nums2){
int i = 0,j = 0,count = 0;
int left = 0, right = 0;
// 偶数个 排序后 找下标 (nums1.length + nums2.length) / 2 和 (nums1.length + nums2.length) / 2 - 1
if((nums1.length + nums2.length) % 2 == 0 ){
while(i < nums1.length && j < nums2.length && count < (nums1.length + nums2.length) / 2 + 1){
// 相同长度部分
if(nums1[i] <= nums2[j]){
count++;
if(count == (nums1.length + nums2.length) / 2){ // left
left = nums1[i];
}
if(count == (nums1.length + nums2.length) / 2 + 1){ // right
right = nums1[i];
}
System.out.print(nums1[i] +" ( 第"+ count +"个 )" + " ->");
i++;
}else{
count++;
if(count == (nums1.length + nums2.length) / 2){ // left
left = nums2[j];
}
if(count == (nums1.length + nums2.length) / 2 + 1){ // right
right = nums2[j];
}
System.out.print(nums2[j] +" ( 第"+ count +"个 )" + "->");
j++;
}
}
while(i < nums1.length && count < (nums1.length + nums2.length) / 2 + 1){ // 数组1 多的部分
count++;
if(count == (nums1.length + nums2.length) / 2){ // left
left = nums1[i];
}
if(count == (nums1.length + nums2.length) / 2 + 1){ // right
right = nums1[i];
}
System.out.print(nums1[i] +" ( 第"+ count +"个 )" + "->");
i++;
}
while(j < nums2.length && count < (nums1.length + nums2.length) / 2 + 1){ // 数组2 多的部分
count++;
if(count == (nums1.length + nums2.length) / 2){ // left
left = nums2[j];
}
if(count == (nums1.length + nums2.length) / 2 + 1){ // right
right = nums2[j];
}
System.out.print(nums2[j] +" ( 第"+ count +"个 )" + "->");
j++;
}
return (left + right) 1.0 / 2;

// 奇数个 找下标 (nums1.length + nums2.length - 1) / 2
}else{
while(i < nums1.length && j < nums2.length && count < (nums1.length + nums2.length) / 2 + 1){
// 相同长度部分
if(nums1[i] <= nums2[j]){
count++;
if(count == (nums1.length + nums2.length) / 2 + 1){ // left
left = nums1[i];
}
System.out.print(nums1[i] +" ( 第"+ count +"个 )" + "->");
i++;
}else{
count++;
if(count == (nums1.length + nums2.length) / 2 + 1){ // left
left = nums2[j];
}
System.out.print(nums2[j] +" ( 第"+ count +"个 )" + "->");
j++;
}
}
while(i < nums1.length && count < (nums1.length + nums2.length) / 2 + 1){ // 数组1 多的部分
count++;
if(count == (nums1.length + nums2.length) / 2 + 1){ // left
left = nums1[i];
}
System.out.print(nums1[i] +" ( 第"+ count +"个 )" + "->");
i++;
}
while(j < nums2.length && count < (nums1.length + nums2.length) / 2 + 1){ // 数组2 多的部分
count++;
if(count == (nums1.length + nums2.length) / 2 + 1){ // left
left = nums2[j];
}
System.out.print(nums2[j] +" ( 第"+ count +"个 )" + "->");
j++;
}
return left;
}
}

支持’.‘和’*'的正则表达式匹配

给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 '.''*' 的正则表达式匹配。'.' 匹配任意单个字符;'*' 匹配零个或多个前面的那一个元素所谓匹配,是要涵盖整个字符串 s的,而不是部分字符串。
说明:s 可能为空,且只包含从 a-z 的小写字母。p 可能为空,且只包含从 a-z 的小写字母,以及字符 . 和
示例 1:输入: s = “aa” p = “a” 输出: false。解释: “a” 无法匹配 “aa” 整个字符串。
示例 2:输入: s = “aa” p = "a
" 输出: true。
解释: ‘’ 代表可匹配零个或多个前面的那一个元素, 在这里前面的元素就是 ‘a’。因此,字符串 “aa” 可被视为 ‘a’ 重复了一次。
示例 3:输入: s = “ab” p = ".
" 输出: true。解释: "." 表示可匹配零个或多个('’)任意字符(‘.’)。
示例 4:输入: s = “aab” p = “cab” 输出: true。
解释: 因为 '’ 表示零个或多个,这里 ‘c’ 为 0 个, ‘a’ 被重复一次。因此可以匹配字符串 “aab”。
示例 5:输入:s = “mississippi” p = "mis
isp." 输出: false。

1
2
3
4
5
6
7
8
9
public static boolean problem2(String s, String p){
if((s.length() == 0 || s == null) && (p.length() == 0 || p == null)){
return true;
}if((p == null && s != null) || (p != null && s == null)){
return false;
}

return false;
}