leetcode/merge_sorted_array.rs
1//! # 88. 合并两个有序数组
2//!
3//! 难度 简单
4//!
5//! 给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组。
6//!
7//!
8//!
9//! ## 说明:
10//!
11//! - 初始化 *nums1* 和 *nums2* 的元素数量分别为 *m* 和 *n* 。
12//! - 你可以假设 *nums1* 有足够的空间(空间大小大于或等于 *m + n*)来保存 *nums2* 中的元素。
13//!
14//!
15//! ## 示例:
16//!
17//! ```text
18//! 输入:
19//! nums1 = [1,2,3,0,0,0], m = 3
20//! nums2 = [2,5,6], n = 3
21//!
22//! 输出:[1,2,2,3,5,6]
23//! ```
24//!
25//!
26//! ## 提示:
27//!
28//! - `-10^9 <= nums1[i], nums2[i] <= 10^9`
29//! - `nums1.length == m + n`
30//! - `nums2.length == n`
31//!
32//! See [leetcode](https://leetcode-cn.com/problems/merge-sorted-array/)
33
34pub struct Solution;
35
36impl Solution {
37 pub fn merge(nums1: &mut Vec<i32>, m: i32, nums2: &mut Vec<i32>, n: i32) {
38 assert_eq!(nums1.len(), (m + n) as usize);
39 assert_eq!(nums2.len(), n as usize);
40
41 let mut p = (nums1.len() - 1) as i32;
42 let mut p1 = m - 1;
43 let mut p2 = n - 1;
44
45 while p1 >= 0 && p2 >= 0 {
46 if nums1[p1 as usize] >= nums2[p2 as usize] {
47 nums1[p as usize] = nums1[p1 as usize];
48 p1 -= 1;
49 } else {
50 nums1[p as usize] = nums2[p2 as usize];
51 p2 -= 1;
52 }
53
54 p -= 1;
55 }
56
57 let rest = (p2 + 1) as usize;
58 let _ = &mut nums1[..rest].copy_from_slice(&nums2[..rest]);
59 }
60}
61
62#[cfg(test)]
63mod tests {
64 use super::*;
65
66 #[test]
67 fn test() {
68 let cases: Vec<(Vec<i32>, (Vec<i32>, i32, Vec<i32>, i32))> = vec![
69 // (vec![1,2,2,3,5,6], (vec![1,2,3,0,0,0], 3, vec![2,5,6], 3)),
70 (vec![1,2,2,3,5,6], (vec![2,5,6,0,0,0], 3, vec![1,2,3], 3)),
71 // (vec![1], (vec![0], 0, vec![1], 1)),
72 ];
73
74 for (expect, (mut nums1, m, mut nums2, n)) in cases {
75 Solution::merge(&mut nums1, m, &mut nums2, n);
76 assert_eq!(expect, nums1);
77 }
78 }
79}