Skip to content

Commit 964f811

Browse files
committed
二刷88
1 parent 5bb814f commit 964f811

File tree

4 files changed

+107
-14
lines changed

4 files changed

+107
-14
lines changed

docs/0088-merge-sorted-array.adoc

Lines changed: 66 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,83 @@
11
[#0088-merge-sorted-array]
2-
= 88. Merge Sorted Array
2+
= 88. 合并两个有序数组
33

4-
{leetcode}/problems/merge-sorted-array/[LeetCode - Merge Sorted Array^]
4+
https://leetcode.cn/problems/merge-sorted-array/[LeetCode - 88. 合并两个有序数组 ^]
55

6-
Given two sorted integer arrays _nums1_ and _nums2_, merge _nums2_ into _nums1_ as one sorted array.
6+
给你两个按 *非递减顺序* 排列的整数数组 `nums1``nums2`,另有两个整数 `m``n` ,分别表示 `nums1``nums2` 中的元素数目。
77

8-
*Note:*
8+
请你 *合并* `nums2``nums1` 中,使合并后的数组同样按 *非递减顺序* 排列。
99

10+
**注意:**最终,合并后数组不应由函数返回,而是存储在数组 `nums1` 中。为了应对这种情况,`nums1` 的初始长度为 `m + n`,其中前 `m` 个元素表示应合并的元素,后 `n` 个元素为 `0` ,应忽略。`nums2` 的长度为 `n`
1011

11-
* The number of elements initialized in _nums1_ and _nums2_ are _m_ and _n_ respectively.
12-
* You may assume that _nums1_ has enough space (size that is greater or equal to _m_ + _n_) to hold additional elements from _nums2_.
12+
*示例 1:*
1313

14+
....
15+
输入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3
16+
输出:[1,2,2,3,5,6]
17+
解释:需要合并 [1,2,3] 和 [2,5,6] 。
18+
合并结果是 [1,2,2,3,5,6] ,其中斜体加粗标注的为 nums1 中的元素。
19+
....
1420

15-
*Example:*
21+
*示例 2:*
1622

17-
[subs="verbatim,quotes,macros"]
18-
----
19-
*Input:*
20-
nums1 = [1,2,3,0,0,0], m = 3
21-
nums2 = [2,5,6], n = 3
23+
....
24+
输入:nums1 = [1], m = 1, nums2 = [], n = 0
25+
输出:[1]
26+
解释:需要合并 [1] 和 [] 。
27+
合并结果是 [1] 。
28+
....
29+
30+
*示例 3:*
31+
32+
....
33+
输入:nums1 = [0], m = 0, nums2 = [1], n = 1
34+
输出:[1]
35+
解释:需要合并的数组是 [] 和 [1] 。
36+
合并结果是 [1] 。
37+
注意,因为 m = 0 ,所以 nums1 中没有元素。nums1 中仅存的 0 仅仅是为了确保合并结果可以顺利存放到 nums1 中。
38+
....
39+
40+
*提示:*
41+
42+
* `nums1.length == m + n`
43+
* `nums2.length == n`
44+
* `+0 <= m, n <= 200+`
45+
* `+1 <= m + n <= 200+`
46+
* `-10^9^ \<= nums1[i], nums2[j] \<= 10^9^`
47+
48+
**进阶:**你可以设计实现一个时间复杂度为 stem:[O(m + n)] 的算法解决此问题吗?
49+
50+
51+
== 思路分析
52+
53+
`num1` 后面空着,就从后向前逐个填充 `num1` 即可。
2254

23-
*Output:* [1,2,2,3,5,6]
24-
----
2555

2656
[[src-0088]]
57+
[tabs]
58+
====
59+
一刷::
60+
+
61+
--
2762
[{java_src_attr}]
2863
----
2964
include::{sourcedir}/_0088_MergeSortedArray.java[tag=answer]
3065
----
66+
--
67+
68+
二刷::
69+
+
70+
--
71+
[{java_src_attr}]
72+
----
73+
include::{sourcedir}/_0088_MergeSortedArray_2.java[tag=answer]
74+
----
75+
--
76+
====
77+
78+
79+
== 参考资料
80+
81+
82+
3183

logbook/202503.adoc

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,11 @@ endif::[]
180180
|{doc_base_url}/0231-power-of-two.adoc[题解]
181181
|✅ 更巧妙的解法是位运算,如果 `n``2` 的幂,则二进制只有第一位是 `1`,减一则二进制都是 `1`,相与 `n & (n - 1)` 则为 `0`
182182

183+
|{counter:codes2503}
184+
|{leetcode_base_url}/merge-sorted-array/[88. 合并两个有序数组^]
185+
|{doc_base_url}/0088-merge-sorted-array.adoc[题解]
186+
|✅ `num1` 后面空着,则从后向前合并。
187+
183188
|===
184189

185190
截止目前,本轮练习一共完成 {codes2503} 道题。

src/main/java/com/diguage/algo/leetcode/_0088_MergeSortedArray.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,9 @@ public class _0088_MergeSortedArray {
3333
* Runtime: 0 ms, faster than 100.00% of Java online submissions for Merge Sorted Array.
3434
*
3535
* Memory Usage: 36.5 MB, less than 100.00% of Java online submissions for Merge Sorted Array.
36+
*
37+
* @author D瓜哥 · https://www.diguage.com
38+
* @since 2019-10-25 00:43
3639
*/
3740
public void merge(int[] nums1, int m, int[] nums2, int n) {
3841
if (n == 0) {
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package com.diguage.algo.leetcode;
2+
3+
public class _0088_MergeSortedArray_2 {
4+
// tag::answer[]
5+
/**
6+
* @author D瓜哥 · https://www.diguage.com
7+
* @since 2025-04-07 12:17:09
8+
*/
9+
public void merge(int[] nums1, int m, int[] nums2, int n) {
10+
int mt = m - 1, nt = nums2.length - 1;
11+
int idx = nums1.length - 1;
12+
while (0 <= mt || 0 <= nt) {
13+
if (0 <= mt && 0 <= nt) {
14+
if (nums2[nt] <= nums1[mt]) {
15+
nums1[idx] = nums1[mt];
16+
mt--;
17+
18+
} else {
19+
nums1[idx] = nums2[nt];
20+
nt--;
21+
}
22+
} else if (0 <= mt) {
23+
nums1[idx] = nums1[mt];
24+
mt--;
25+
} else if (0 <= nt) {
26+
nums1[idx] = nums2[nt];
27+
nt--;
28+
}
29+
idx--;
30+
}
31+
}
32+
// end::answer[]
33+
}

0 commit comments

Comments
 (0)