作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/sorted-merge-lcci/solution/mian-shi-ti-1001-he-bing-pai-xu-de-shu-zu-by-leetc/
逆向双指针(微调)
class Solution {
public:
void merge(vector<int>& A, int m, vector<int>& B, int n) {
int i=m-1,j=n-1;
while(i>=0||j>=0){
if(i<0){
A[i+j+1]=B[j]; // 不可合并为A[i+j+1]=B[j--];这样的话左边的i+j+1中的j已经-1了
j--;
}
else if(j<0){
break; // B中的元素已经插入完毕,则可剪枝
}
else if(A[i]>B[j]){
A[i+j+1]=A[i];
i--;
}
else{
A[i+j+1]=B[j];
j--;
}
}
}
};
但可合并为 A[i+j+2]=B[j–];
class Solution {
public:
void merge(vector<int>& A, int m, vector<int>& B, int n) {
int i=m-1,j=n-1;
while(i>=0||j>=0){
if(i<0) A[i+j+2]=B[j--];
else if(j<0) break;
else if(A[i]>B[j]) A[i+j+2]=A[i--];
else A[i+j+2]=B[j--];
}
}
};
再丧心病狂一点!
class Solution {
public:
void merge(vector<int>& A, int m, vector<int>& B, int n) {
while(m>0&&n>0)
A[m+n]=A[m-1]>B[n-1]?A[m-- -1]:B[n-- -1];
while(n>0)
A[n]=B[--n];
}
};
官方逆双指针
class Solution {
public:
void merge(vector<int>& A, int m, vector<int>& B, int n) {
int pa = m - 1, pb = n - 1;
int tail = m + n - 1;
int cur;
while (pa >= 0 || pb >= 0) {
if (pa == -1)
cur = B[pb--];
else if (pb == -1)
break;
else if (A[pa] > B[pb])
cur = A[pa--];
else
cur = B[pb--];
A[tail--] = cur;
}
}
};
一般思路(看看就好)
class Solution {
public:
void merge(vector<int>& A, int m, vector<int>& B, int n) {
int pa = 0, pb = 0;
int sorted[m + n];
int cur;
while (pa < m || pb < n) {
if (pa == m)
cur = B[pb++];
else if (pb == n)
cur = A[pa++];
else if (A[pa] < B[pb])
cur = A[pa++];
else
cur = B[pb++];
sorted[pa + pb - 1] = cur;
}
for (int i = 0; i != m + n; ++i)
A[i] = sorted[i];
}
};