Problem
Two integer arrays
nums1
and
nums2
are sorted in non-decreasing order, and two integers
m
and
n
are supplied representing the number of integers in
nums1
and
nums2
correspondingly. In a single pass, merge
nums1
and
nums2
into a single array. The final classified array should be kept inside the array
nums1
rather than returned by the function. To do this,
nums1
has a length of
m
+
n
where the elements of the first
m
indicate the items of
nums1
. The length of
nums2
is
n
.
Brute force approach
We can copy all the elements of nums2 into nums1 and then sort the entire array. This is an easy yet inefficient solution as this is not in-place and takes O(( m + n )log( m + n )) time.
Efficient Approach
We can follow a 3 pointers approach. We place one pointer at the ending element of the first array and the second pointer at the ending element of the second array. Let’s say pointers are
one
and
two
respectively. The third pointer tells the next available index to place the element. This is initialized to the
(
size of
nums1
-1)
.
Let’s call this variable as
finish
.
We then compare these two elements. If
nums1
[one] >=
nums2
[two]
,
we place this element at the last index of
nums1
and decrease
finish
and vice versa. We do this until all the pointers are greater than or equal to 0. This is an in-place solution and takes O(
m
+
n
) time.
C++
#include <iostream> #include <algorithm> using namespace std; void solve(int a[], int b[], int m, int n) { for (int i = 0; i < m; i++) { if (a[i] > b[0]) { swap(a[i], b[0]); int first = b[0]; int k; for (k = 1; k < n && b[k] < first; k++) { b[k - 1] = b[k]; } b[k - 1] = first; } } } int main() { int a[] = { 1, 3, 4, 5 }; int b[] = { 2, 3, 10 }; int m = sizeof(a) / sizeof(a[0]); int n = sizeof(b) / sizeof(b[0]); solve(a, b, m, n); for(int i=0;i<m;i++) cout<<a[i]<<" "; cout<<"\n"; for(int i=0;i<n;i++) cout<<b[i]<<" "; return 0; }
Python
def solve(a, b): m = len(a) n = len(b) for i in range(m): if a[i] > b[0]: temp = a[i] a[i] = b[0] b[0] = temp first = b[0] k = 1 while k < n and b[k] < first: b[k - 1] = b[k] k = k + 1 b[k - 1] = first a = [1, 4, 7, 8, 10] b = [2, 3, 9] solve(a, b) print(a) print(b)
C
void solve(int a[], int b[], int m, int n) { for (int i = 0; i < m; i++) { if (a[i] > b[0]) { int temp = a[i]; a[i]=b[0]; b[0]=temp; int first = b[0]; int k; for (k = 1; k < n && b[k] < first; k++) { b[k - 1] = b[k]; } b[k - 1] = first; } } } int main() { int a[] = { 1, 3, 4, 5 }; int b[] = { 2, 3, 10 }; int m = sizeof(a)/sizeof(a[0]); int n = sizeof(b)/sizeof(b[0]); solve(a, b, m, n); for(int i=0;i<m;i++) printf("%d ",a[i]); printf("\n"); for(int i=0;i<n;i++) printf("%d ",b[i]); return 0; }
Output
[1, 2, 3, 4, 7] [8, 9, 10]
People are also reading:
- WAP to Count no. of alphabets, digits and spaces present in a file
- The Stock Span Problem
- Find maximum of minimum for every window size in a given array
- WAP to Print Triangle Using * Character
- Find ancestors of a given node in a Binary Tree
- Subset Sum Problem
- Maximum size square sub-matrices with all 1’s
- Merge Sort for Linked Lists
- Move all zeros present in an array to the end
- Program to Find LCM and HCF of two numbers
Leave a Comment on this Post