0%

双指针:两个输入,两个都需要遍历(快慢指针)

2.双指针:两个输入,两个都需要遍历(快慢指针)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
let fn = (arr1, arr2) => {
let i = 0, j = 0, ans = 0;

while(i < arr1.length && j < arr2.length){
//根据题意补充代码
if(){
i++;
}else{
j++;
}
while(i < arr1.length){
//
i++;
}
while(j < arr2.length){
//
j++;
}
return ans;
}
}

例题

88. 合并两个有序数组

给你两个按 非递减顺序 排列的整数数组 nums1nums2,另有两个整数 mn ,分别表示 nums1nums2 中的元素数目。

请你 合并 nums2nums1 中,使合并后的数组同样按 非递减顺序 排列。

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

示例 1:

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

示例 2:

1
2
3
4
输入:nums1 = [1], m = 1, nums2 = [], n = 0
输出:[1]
解释:需要合并 [1] 和 [] 。
合并结果是 [1] 。

示例 3:

1
2
3
4
5
输入:nums1 = [0], m = 0, nums2 = [1], n = 1
输出:[1]
解释:需要合并的数组是 [] 和 [1] 。
合并结果是 [1] 。
注意,因为 m = 0 ,所以 nums1 中没有元素。nums1 中仅存的 0 仅仅是为了确保合并结果可以顺利存放到 nums1 中。

思路一:双指针,但是不借助额外的数组,原数组nums1的值就会被覆盖,但是题目没有说不能借助额外数组,所以就先放到新的数组里面,在把新数组赋值给nuns1

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
/**
* @param {number[]} nums1
* @param {number} m
* @param {number[]} nums2
* @param {number} n
* @return {void} Do not return anything, modify nums1 in-place instead.
*/
var merge = function(nums1, m, nums2, n) {

let i = 0, j = 0;
//思路一:双指针,但是不借助额外的数组,原数组nums1的值就会被覆盖,但是题目没有说不能借助额外数组,所以就先放到新的数组里面,在把新数组赋值给nuns1
let newArr = new Array(m + n);
let k = 0;
while(i < m && j < n){
if(nums2[j] <= nums1[i]){
newArr[k++] = nums2[j++];
}else{
newArr[k++] = nums1[i++];
}
}
while(i < m) newArr[k++] = nums1[i++];
while(j < n) newArr[k++] = nums2[j++];
for(let p = 0; p < m + n; p++){
nums1[p] = newArr[p];
}
return nums1;
};

思路二:逆向双指针,因为num1的数组的末尾m个都是0,是不害怕被覆盖的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/**
* @param {number[]} nums1
* @param {number} m
* @param {number[]} nums2
* @param {number} n
* @return {void} Do not return anything, modify nums1 in-place instead.
*/
var merge = function(nums1, m, nums2, n) {
let i = m - 1, j = n - 1, k = m + n - 1;
while(i >= 0 && j >= 0){
if(nums1[i] >= nums2[j]){
nums1[k--] = nums1[i--];
}else{
nums1[k--] = nums2[j--];
}
}
while(i >= 0) nums1[k--] = nums1[i--];
while(j >= 0) nums1[k--] = nums2[j--];
return nums1;
};
-------------本文结束感谢您的阅读-------------
原创技术分享,您的支持将鼓励我继续创作