정렬된 배열 두개가 주어질 때, 합치는 문제입니다.
Input: nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3
Output: [1,2,2,3,5,6]
https://leetcode.com/problems/merge-sorted-array
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
if(n == 0) {return;}
if(m == 0) {
nums1 = nums2;
return;
}
while(m > 0 && n > 0)
{
if(nums1[m-1] > nums2[n-1]){
nums1[m+n-1] =nums1[m-1];
m--;
}else{
nums1[m+n-1] = nums2[n-1];
n--;
}
}
if(n){
for(int i=0;i<n;i++){
nums1[i] = nums2[i];
}
}
}
};
처음에는 swap나 앞에서 부터 계산하는 것을 생각해보았는데
생각보다 복잡하고, 추가로 이미 공간이 주어졌으므로 뒤에서 부터 큰 값을 찾으면 어떨까라고 생각해보고 코드를 구현했습니다.
// 1 2 3 000
// 2 5 6
mn 22->3 6 -> 6 [i+j+1] 123006
mn 21->3 5 -> 5 [i+j+1] 123056
mn 20->3 2 -> 3 [i+j+1] 123356
mn 10->2 2 -> 2 [i+j+1] 122356
mn 00->1 2 -> 2 [i+j+1] 122356
while문이 끝난 후, m이 0이 아니라면 이미 nums2의 값을 모두 넣었다는 뜻이므로 추가 작업이 필요없습니다.
n이 0이 아니라면 nums1의 앞의 나머지 부분은 nums2로 교채해야하므로 if(n) -> n이 0이 아니라면 실행
하는 코드를 만들었습니다.