leetCode88:Merge Sorted Array
2016-03-15 21:05
309 查看
Given two sorted integer arrays nums1 and nums2, merge nums2 into nums1 as one sorted array.
Note:
You may assume that nums1 has enough space (size that is greater or equal to m + n) to hold additional elements from nums2. The number of elements initialized in nums1and nums2 are m and n respectively.
问题需求:
1,给定两个有序数组,合并成为一个数组,结果数组仍然有序。
2,nums1的长度等于或者大于两个数组长度总和,不用担心nums1的长度不够用的问题。
解题思路:一共想到两类解法,分别牺牲时间或者空间,细说如下。
解法一:
1,先将两个数组直接合并,就是直接将nums2数组里的所有元素,都拷贝到nums1数组的剩余空间里面。
2,任意选择一类排序方法,对nums1数组进行排序(本例所用的方法是选择排序)。
3,时间复杂度:取决于你选择的排序方式了,空间复杂度=O(1)。
解法二:
1,重新申请一段长度=m+n的空间,将两数组里的元素按照顺序拷贝到新的空间里。
2,将新空间里的元素重新拷贝到原来的nums数组里面。
3,时间复杂度=O(n),因为只要遍历两次整个数组就可以了,空间复杂度=O(n)。
解法一的示例代码:
解法二的示例代码
Note:
You may assume that nums1 has enough space (size that is greater or equal to m + n) to hold additional elements from nums2. The number of elements initialized in nums1and nums2 are m and n respectively.
问题需求:
1,给定两个有序数组,合并成为一个数组,结果数组仍然有序。
2,nums1的长度等于或者大于两个数组长度总和,不用担心nums1的长度不够用的问题。
解题思路:一共想到两类解法,分别牺牲时间或者空间,细说如下。
解法一:
1,先将两个数组直接合并,就是直接将nums2数组里的所有元素,都拷贝到nums1数组的剩余空间里面。
2,任意选择一类排序方法,对nums1数组进行排序(本例所用的方法是选择排序)。
3,时间复杂度:取决于你选择的排序方式了,空间复杂度=O(1)。
解法二:
1,重新申请一段长度=m+n的空间,将两数组里的元素按照顺序拷贝到新的空间里。
2,将新空间里的元素重新拷贝到原来的nums数组里面。
3,时间复杂度=O(n),因为只要遍历两次整个数组就可以了,空间复杂度=O(n)。
解法一的示例代码:
void merge(int* nums1, int m, int* nums2, int n) { /* 1,先将两个数组直接拷贝到一起去。 2,对新数组进行排序,任选一个排序方式即可 */ int p = 0,q = 0,min = 0,temp = 0;//定义两个工作指针 if(n==0) return;//边界 if(m==0){//边界 for(int i = 0;i<n;i++){ nums1[i] = nums2[i]; } return; } //先将数组元素拷贝到一起去 //然后进行一轮排序 p = m; //拷贝 while(q<n){ nums1[p] = nums2[q]; p++; q++; } //排序 for(p = 0;p<n+m;p++){ min = p; for(q = p;q<n+m;q++){ if(nums1[q]<nums1[min]) min = q; } if(min!=p){ temp = nums1[min]; nums1[min] = nums1[p]; nums1[p] = temp; } } }
解法二的示例代码
void merge(int* nums1, int m, int* nums2, int n) { int p = 0,q = 0,num = 0,temp = 0; int* nums = NULL; if(n==0) return;//边界 if(m==0){//边界 for(int i = 0;i<n;i++){ nums1[i] = nums2[i]; } return; } nums = (int*)malloc((n+m)*sizeof(int));//申请新的内存空间作为缓存 //将两数组按照顺序拷贝到新空间里面 while(p<m&&q<n){ if(nums1[p]<=nums2[q]){ nums[num] = nums1[p]; p++; }else{ nums[num] = nums2[q]; q++; } num++; } //将其中的一个数组剩余元素都拷过去 if(p==m){ while(num<n+m){ nums[num] = nums2[q]; num++; q++; } }else{ while(num<n+m){ nums[num] = nums1[p]; num++; p++; } } //将缓存区所有元素考到原来数组里面 p = 0; while(p<n+m){ nums1[p] = nums[p]; p++; } }
相关文章推荐
- 78.动态规划(导弹拦截问题)
- android-个性化进度条
- 前端上路第二弹
- 028_MapReduce中的计数器Counter的使用
- 78.动态规划(导弹拦截问题)
- codeForces-Longest Subsequence
- UML 类图 class diagram
- Linux 设备驱动中的 I/O模型(一)—— 阻塞和非阻塞I/O
- tar.xz文件解压命令
- Oracle 存储过程遇到的问题
- 适配器模式
- ELasticsearch
- doc-remote-debugging.html
- webpack 使用优化指南
- java内部类学习笔记
- Android.mk小结
- Win7 下基于 Oracle VM VirtualBox 安装 Ubuntu desktop 12.04
- UML 用例图 use case diagram
- 轻松学习Ionic (四) 修改应用图标及添加启动画面(更新官方命令行工具自动生成)
- miniui 结束日期不能小于起始日期