LeetCode 88. 合并两个有序数组(Merge Sorted Array)
生活随笔
收集整理的這篇文章主要介紹了
LeetCode 88. 合并两个有序数组(Merge Sorted Array)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
?首先,這個題中給出的函數沒有返回值,所以就意味著我們不能另建一個數組來做合并!
第一種思路:
第一步:比較nums1和nums2,使nums2最小值大于nums1的最大值,而在這個過程要保持nums2有序!
第二步:把nums2加到nums1后面。
代碼:
nums1中有1個元素時,保證nums2最小值大于nums1的最大值;
nums1中有2個元素時,保證nums2最小值大于nums1的最大值;
。。。
nums1中有m個元素時,保證nums2最小值大于nums1的最大值;
在這個過程中保持nums2有序!
class Solution { public:void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {//如果nums2為空if (n == 0) return;//如果nums2不為空int k = 0;int i = 0;for (i = 0; i < m; i++){while (nums1[i] > nums2[0]){k = 0;while (k < n && nums1[i] > nums2[k]){k++;}int temp = nums1[i];nums1[i] = nums2[k-1];nums2[k-1] = temp;}}k = 0;while (k < n){nums1[i++] = nums2[k++];}} };第二種思路:利用nums1中的后半部分空間。
第一種思路有一個很明顯的問題沒有利用nums1的后半部分0元素空間,而是在前半部分做了大量交換。
思路:
從最大值開始填,這樣就可以避免在nums1和nums2中做交換。
class Solution { public:void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {int i = m - 1;int j = n - 1;for (; i >= 0 && j >= 0;) {if (nums1[i] >= nums2[j]) {nums1[i + j + 1] = nums1[i];i--;} else {nums1[i + j + 1] = nums2[j];--j;}}if (j >= 0) {for (; j >= 0; --j) {nums1[j] = nums2[j];}}} };?
總結
以上是生活随笔為你收集整理的LeetCode 88. 合并两个有序数组(Merge Sorted Array)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Element-UI Form表单 re
- 下一篇: JimuReport积木报表 — API