88.合并两个有序数组
1
class Solution {
2
public void merge(int[] nums1, int m, int[] nums2, int n) {
3
//优先对数组nums1进行移动,要进行倒序移动否则例如[1,2,3,0],
4
//正序移动0移动到1会覆盖1的数据。
5
for(int i = m -1;i >= 0;i--){
6
nums1[i + n] = nums1[i];
7
}
8
int i = 0; //视为一个新的数组的索引
9
int i1 = n; //数组nums1的索引
10
int i2 = 0; //数组nums2的索引
11
while(i1 < m + n || i2 < n){
12
//有两种情况取nums1的值
13
//1.当nums1的数据取完并且nums2中还有元素时
14
//2.当两个数组都有元素并且 nums1[i1] < nums2[i2]
15
if(i1 < m + n && (i2 >= n ||( i2 < n && nums1[i1] < nums2[i2]))){
16
nums1[i] = nums1[i1];
17
i1++;
18
}else{
19
nums1[i] = nums2[i2];
20
i2++;
21
}
22
i++;
23
}
24
}
25
}
Copied!
如果倒序先把最大的放到末尾可以不用移位。
1
class Solution {
2
public void merge(int[] nums1, int m, int[] nums2, int n) {
3
int i = m -1;
4
int j = n -1;
5
int k = m + n -1;
6
while(i > -1 || j > -1){
7
if(i > -1 && (j <= -1 ||( j > -1 && nums1[i] > nums2[j]))){
8
nums1[k] = nums1[i];
9
i--;
10
}else{
11
nums1[k] = nums2[j];
12
j--;
13
}
14
k--;
15
}
16
}
17
}
Copied!
优化代码
1
class Solution {
2
public void merge(int[] nums1, int m, int[] nums2, int n) {
3
int i = m -1,j = n -1, k = m + n -1;
4
while(i > -1 || j > -1)
5
nums1[k--]= (i > -1 && (j <= -1 ||( j > -1 && nums1[i] > nums2[j]))) ? nums1[i--]: nums2[j--];
6
}
7
}
Copied!
最近更新 1yr ago
复制链接