双指针进阶练习,在做这道题目之前大家可以先做一道这道题目,从这道题目中找思路:
LeetCode链接:88. 合并两个有序数组
1.题目描述
给你两个按 非递减顺序 排列的整数数组 nums1
和 nums2
,另有两个整数 m
和 n
,分别表示 nums1
和 nums2
中的元素数目。
请你 合并 nums2
到 nums1
中,使合并后的数组同样按 非递减顺序 排列。
注意:最终,合并后数组不应由函数返回,而是存储在数组 nums1
中。为了应对这种情况,nums1
的初始长度为 m + n
,其中前 m
个元素表示应合并的元素,后 n
个元素为 0
,应忽略。nums2
的长度为 n
。
示例 1:
1 2 3 4
| 输入:nums1 = , m = 3, nums2 = , n = 3 输出: 解释:需要合并 和 。 合并结果是 ,其中斜体加粗标注的为 nums1 中的元素。
|
示例 2:
1 2 3 4
| 输入:nums1 = , m = 1, nums2 = , n = 0 输出: 解释:需要合并 和 。 合并结果是 。
|
示例 3:
1 2 3 4 5
| 输入:nums1 = , m = 0, nums2 = , n = 1 输出: 解释:需要合并的数组是 和 。 合并结果是 。 注意,因为 m = 0 ,所以 nums1 中没有元素。nums1 中仅存的 0 仅仅是为了确保合并结果可以顺利存放到 nums1 中。
|
提示:
nums1.length == m + n
nums2.length == n
0 <= m, n <= 200
1 <= m + n <= 200
- $-10^9 <= nums1[i], nums2[j] <= 10^9$
进阶:你可以设计实现一个时间复杂度为 O(m + n)
的算法解决此问题吗?
2.题解
2.1 暴力解法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| class Solution { public void merge(int[] nums1, int m, int[] nums2, int n) { for(int i=0;i<n;i++){ nums1[m+i] = nums2[i]; }
for(int i=0;i<nums1.length;i++){ for(int j=i+1;j<nums1.length;j++){ if(nums1[i] > nums1[j]){ int temp = nums1[j]; nums1[j] = nums1[i]; nums1[i] = temp; } } } } }
|
2.2 双指针
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
| class Solution { public void merge(int[] nums1, int m, int[] nums2, int n) { int i = 0, j = 0; int[] result = new int[m + n]; int cur;
while (i < m || j < n) { if (i == m) { cur = nums2[j++]; } else if (j == n) { cur = nums1[i++]; } else if (nums1[i] < nums2[j]) { cur = nums1[i++]; } else { cur = nums2[j++]; } result[i + j - 1] = cur; }
for (int l = 0; l < nums1.length; l++) { nums1[l] = result[l]; } } }
|
2.3 逆向双指针
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| class Solution { public void merge(int[] nums1, int m, int[] nums2, int n) { int i = m - 1, j = n - 1; int tail = m + n - 1; int cur;
while (i >= 0 || j >= 0) { if (i == -1) { cur = nums2[j--]; }else if (j == -1) { cur = nums1[i--]; }else if (nums1[i] > nums2[j]) { cur = nums1[i--]; }else { cur = nums2[j--]; } nums1[tail--] = cur; } } }
|