LeetCode - 두 개의 정렬된 배열 병합
15843 단어 cppleetcodejavascriptgo
문제 설명
감소하지 않는 순서로 정렬된 두 개의 정수 배열 nums1 및 nums2가 제공됩니다.
두 정수 m과 n,
각각 nums1 및 nums2의 요소 수를 나타냅니다.
nums1과 nums2를 감소하지 않는 순서로 정렬된 단일 배열로 병합합니다.
최종 정렬된 배열은 함수에 의해 반환되어서는 안 됩니다.
대신에
배열 nums1 안에 저장됩니다.
이를 수용하기 위해,
nums1의 길이는 m + n이고,
여기서 첫 번째 m 요소는 병합해야 하는 요소를 나타냅니다.
마지막 n개의 요소는 0으로 설정되며 무시해야 합니다.
nums2의 길이는 n입니다.
문제 진술 출처: https://leetcode.com/problems/merge-sorted-array
예 1:
Input: nums1 = [1, 2, 3, 0, 0, 0], m = 3, nums2 = [2, 5, 6], n = 3
Output: [1, 2, 2, 3, 5, 6]
Explanation: The arrays we are merging are [1, 2, 3] and [2, 5, 6].
The result of the merge is [1, 2, 2, 3, 5, 6] with the underlined elements coming from nums1.
예 2:
Input: nums1 = [1], m = 1, nums2 = [], n = 0
Output: [1]
Explanation: The arrays we are merging are [1] and [].
The result of the merge is [1].
예 3:
Input: nums1 = [0], m = 0, nums2 = [1], n = 1
Output: [1]
Explanation: The arrays we are merging are [] and [1].
The result of the merge is [1].
Note that because m = 0, there are no elements in nums1.
The 0 is only there to ensure the merge result can fit in nums1.
제약:
- nums1.length == m + n
- nums2.length == n
- 0 <= m, n <= 200
- 1 <= m + n <= 200
- -10^9 <= nums1[i], nums2[j] <= 10^9
설명
문제에 대한 무차별 접근 방식은 새 어레이를 만드는 것입니다.
nums3에 저장하고 두 개의 정렬된 배열에서 요소를 계속 추가합니다.
nums1 및 nums2의 모든 요소가 nums3에 추가되면
nums3을 nums1에 다시 복사합니다.
그러나 위의 솔루션은 O(m + n)의 추가 공간을 차지합니다.
추가 공간 없이 요소를 정렬해야 합니다.
아이디어는 두 배열을 오른쪽에서 왼쪽으로 반복하는 것입니다.
오른쪽에서 nums1에 요소를 계속 추가합니다.
아래 알고리즘을 확인해 봅시다.
- set i = m - 1, j = n - 1, k = m + n - 1
- loop for i >= 0 && j >= 0
- if nums1[i] > nums2[j]
- set nums1[k] = nums1[i--]
- else
- set nums1[k] = nums2[j--]
- loop while i >= 0
- set nums1[k--] = nums1[i--]
- loop while j >= 0
- set nums1[k--] = nums2[j--]
C++ 솔루션
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
int i = m - 1, j = n - 1, k = m + n - 1;
for(; i >=0 && j >=0; k--){
if(nums1[i] >= nums2[j]){
nums1[k] = nums1[i--];
} else {
nums1[k] = nums2[j--];
}
}
while(i >= 0) {
nums1[k--] = nums1[i--];
}
while(j >= 0) {
nums1[k--] = nums2[j--];
}
}
};
골랑 솔루션
func merge(nums1 []int, m int, nums2 []int, n int) {
i := m - 1
j := n - 1
k := m + n - 1
for ; i >= 0 && j >= 0; k-- {
if nums1[i] >= nums2[j] {
nums1[k] = nums1[i]
i--
} else {
nums1[k] = nums2[j]
j--
}
}
for i >= 0 {
nums1[k] = nums1[i]
k--
i--
}
for j >= 0 {
nums1[k] = nums2[j]
k--
j--
}
}
자바스크립트 솔루션
var merge = function(nums1, m, nums2, n) {
let i, j, k;
for(i = m - 1, j = n - 1, k = m + n - 1; i >= 0 && j >= 0; k--){
if(nums1[i] >= nums2[j]){
nums1[k] = nums1[i--];
} else {
nums1[k] = nums2[j--];
}
}
while(i >= 0) {
nums1[k--] = nums1[i--];
}
while(j >= 0) {
nums1[k--] = nums2[j--];
}
};
솔루션이 어떻게 작동하는지 알아보기 위해 알고리즘을 시험 실행해 보겠습니다.
Input:
nums1 = [1, 2, 3, 0, 0, 0]
m = 3
nums2 = [2, 5, 6]
n = 3
Step 1: i = m - 1
= 3 - 1
= 2
j = n - 1
= 3 - 1
= 2
k = m + n - 1
= 3 + 3 - 1
= 5
Step 2: loop for i >= 0 && j >= 0
2 >= 0 && 2 >= 0
true
if nums1[i] >= nums2[j]
nums1[2] >= nums2[2]
3 > 6
false
nums1[k] = nums2[j--]
nums1[5] = 3
j--
j = 1
k--
k = 4
nums1 = [1, 2, 3, 0, 0, 6]
Step 3: loop for i >= 0 && j >= 0
2 >= 0 && 1 >= 0
true
if nums1[i] >= nums2[j]
nums1[2] >= nums2[1]
3 > 5
false
nums1[k] = nums2[j--]
nums1[4] = 6
j--
j = 0
k--
k = 3
nums1 = [1, 2, 3, 0, 5, 6]
Step 4: loop for i >= 0 && j >= 0
2 >= 0 && 0 >= 0
true
if nums1[i] >= nums2[j]
nums1[2] >= nums2[0]
3 > 2
true
nums1[k] = nums1[i--]
nums1[3] = 3
i--
i = 1
k--
k = 2
nums1 = [1, 2, 3, 3, 5, 6]
Step 5: loop for i >= 0 && j >= 0
1 >= 0 && 0 >= 0
true
if nums1[i] >= nums2[j]
nums1[1] >= nums2[0]
2 >= 2
true
nums1[k] = nums1[i--]
nums1[2] = 2
i--
i = 0
k--
k = 1
nums1 = [1, 2, 2, 3, 5, 6]
Step 6: loop for i >= 0 && j >= 0
0 >= 0 && 0 >= 0
true
if nums1[i] >= nums2[j]
nums1[0] >= nums2[0]
1 >= 2
false
nums1[k] = nums2[j--]
nums1[1] = 2
j--
j= -1
k--
k = 0
nums1 = [1, 2, 2, 3, 5, 6]
Step 7: loop for i >= 0 && j >= 0
0 >= 0 && -1 >= 0
false
Step 8: for i >= 0
0 >= 0
true
nums1[k--] = nums1[i--]
nums1[0] = nums1[0]
nums1[0] = 1
k--
k = -1
i--
i = -1
Step 9: for j >= 0
-1 >= 0
false
So the answer is [1, 2, 2, 3, 5, 6].
Reference
이 문제에 관하여(LeetCode - 두 개의 정렬된 배열 병합), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/_alkesh26/leetcode-merge-two-sorted-array-4mmc텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)