与上篇思想一样,或者说是替换数字的另一种版本吧,题目如下:
有两个已经排好的数组A1和A2,A1的末尾有足够的空间来容纳A2,我们将A2数组插入到A1中,继续保持已经排序;
这样看来就和替换空格相似了,如果我们在A1数组从头到尾复制数字,这样导致A1数组后面的数一直不断往后移动,复杂度一样是O(n2),所以,我们来举一反三:
//2014-5-18 //举一反三,合并数组 #include <iostream> using namespace std; const int length = 50; void MergeArray(int *arr1, int *arr2, int len1, int len2) { if(arr2 == NULL || len1 + len2 > length || len2 < 1) return; for(int i = len1 + len2 - 1; i > len1 - 1 && len1 > 0; i--) //与len1 - 1比较是为了防止无效复制,即复制自己 { if(arr2[len2 - 1] > arr1[len1 - 1]) { arr1[i] = arr2[len2 - 1]; len2--; } else { arr1[i] = arr1[len1 - 1]; len1--; } } if(len1 == 0) //A2数组还有个别未复制成功 { for(int i = 0; i < len2; i++) arr1[i] = arr2[i]; } } void display(int *arr, int len) { if(arr == NULL || len < 0) return; for(int i = 0; i < len; i++) cout << arr[i] << " "; cout << endl; } int main() { int *arr1 = new int[length]; int *arr2 = new int[length]; int len1 = 0, len2 = 0; cout << "请输入数组1的数据(-1结束):" << endl; int temp; cin >> temp; while(temp != -1) { arr1[len1++] = temp; cin >> temp; } cout << "请输入数组2的数据(-1结束):" << endl; cin >> temp; while(temp != -1) { arr2[len2++] = temp; cin >> temp; } MergeArray(arr1, arr2, len1, len2); display(arr1, len1 + len2); return 0; }
测试1:
测试2:
测试3:
三个测试点分别为两个数组大小互相嵌套,A1数组数据<A2数组数据,A1数据>A2数据
O(∩_∩)O欢迎指教。。。
“举一反三”合并数组--《剑指offer》,布布扣,bubuko.com
原文地址:http://blog.csdn.net/xjm199/article/details/26149891