您的位置:首页 > 其它

【Leetcode】88. Merge Sorted Array

2016-12-30 09:55 363 查看
方法一:

思路:

(1)逐个处理nums2的每一个节点。

(2)对nums2的每一个节点nums[i],在nums1中查找第一个不小于该节点值的节点,其下标为j。

(3)从nums1的最后一个节点开始逐个后移,将nums2[i]插入到nums1[j]的位置,j++。

(4)注意:每插入一个nums2的元素,nums1当前元素总数m++。

public class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
int j = 0;
for (int i = 0; i < n; i++) {
while (j < m && nums2[i] > nums1[j])
j++;
for (int k = m - 1; k >= j; k--)
nums1[k + 1] = nums1[k];
nums1[j] = nums2[i];
j++;
m++;
}
}
}

Runtime:1ms

方法二:

思路:利用好nums1后n个空闲的空间,从后往前遍历A和B数组,每次把大的数字从A中m+n位置逐步往前放。

(1)k初始化为nums1中最后一个位置的下标,即m+n-1。

(2)处理k+1次,每次处理后k--,若插入的是nums1中元素,则i--;若插入的是nums2中元素,则j--。

(2)若i >= 0 && j < 0,表示nums2中没有待处理元素,插入nums1中元素;若j
>= 0 && i < 0,表示nums1中没有待处理元素,插入nums2中元素;若二者中都有待处理元素,插入较大元素,即若nums1[i]
> nums2[j],则插入nums1[i],否则插入nums2[j]。

public class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
int i = m - 1, j = n - 1, k = m + n - 1;
while (k >= 0) {
if (i >= 0 && j < 0)
nums1[k--] = nums1[i--];
else if (j >= 0 && i < 0)
nums1[k--] = nums2[j--];
else if (nums1[i] > nums2[j])
nums1[k--] = nums1[i--];
else
nums1[k--] = nums2[j--];
}
}
}
Runtime:0ms
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: