一.题目描写叙述

二.解题技巧

这道题不存在复杂的分析过程和边界条件。假设单纯得考虑从小到大地将两个数组进行合并的话。每次在num1中插入一个数的话,须要将后面的元素都向后移动一位。这样。整个处理过程的时间复杂度为O(m*n)。

因为两个数组的元素的个数是知道的。同一时候,合并后的数组也是递增排序的,也就是说,排序之后的数组的最大值是放在最后面的。因此,我们能够从后往前遍历,也就是将最大值放在第一个数组的m+n-1位置。然后将次最大值放在m+n-2位置,依次类推。这样在将元素放置到合适位置的时候,就不须要移动元素,这种方法的时间复杂度为O(m+n)。

三.演示样例代码

// 时间复杂度O(m+n),空间复杂度O(1)
class Solution {
public:
void merge(int A[], int m, int B[], int n) {
int ia = m - 1, ib = n - 1, icur = m + n - 1;
while (ia >= 0 && ib >= 0) {
A[icur--] = A[ia] >= B[ib] ? A[ia--] : B[ib--];
}
while (ib >= 0) {
A[icur--] = B[ib--];
}
}
};
// 使用STL
#include <iostream>
#include <vector> using std::vector; class Solution
{
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n)
{
int ResultIndex = m + n - 1;
m--;
n--;
while (m >= 0 || n >= 0)
{
if (m < 0)
{
nums1[ResultIndex--] = nums2[n--];
continue;
} if (n < 0)
{
nums1[ResultIndex--] = nums1[m--];
continue;
} if (m >= 0 && n >= 0)
{
if (nums1[m] > nums2[n])
{
nums1[ResultIndex--] = nums1[m--];
continue;
}
else
{
nums1[ResultIndex--] = nums2[n--];
continue;
}
}
}
}
};

最新文章

  1. 关于URI URL URN
  2. jdbc/ojdbc连oracle的三种方式(转)
  3. json_encode
  4. 移动端HTML5资源整理
  5. 【系统移植】JNI
  6. mysql西文字符大小写重复键问题的解决方法
  7. Vue.js学习 Item7 -- 条件渲染与列表渲染
  8. 济南学习 Day 4 T1 pm
  9. Wix: Using Patch Creation Properties - Small Update
  10. 随手写了一个linux服务端与window客户端的epoll程序,当做练习把。
  11. mybatis通用DAO
  12. join多表连接和group by分组
  13. 2018年最新JAVA面试题总结之框架(4)
  14. 通过Docker发布RestAPI遇到的种种问题
  15. [wordpress]WordPress地址(URL)错误,修改解决方案
  16. C#核心基础--类的继承
  17. HTML 基础知识汇总(一)
  18. 【Java基础】11、java方法中只有值传递,没有引用传递
  19. 给iOS开发者的Android开发建议
  20. 使用axios请求数据,post请求出错。因为axios传递的请求参数是json格式,而后端接口要求是formData

热门文章

  1. Golang-import-introduce
  2. webpack基础知识点
  3. arXiv 2015深度学习年度十大论文
  4. javascript-js中技巧集合
  5. Android自己定义TabActivity(实现仿新浪微博底部菜单更新UI)
  6. vuex3
  7. RAC IP 地址修改
  8. POJ 3213 矩阵乘法(优化)
  9. Hbase项目(完整版)
  10. C# 位域[flags]