You are given two integer arrays nums1 and nums2, sorted in non-decreasing order, and two integers m and n, representing the number of elements in nums1 and nums2 respectively.
Merge nums1 and nums2 into a single array sorted in non-decreasing order.
The final sorted array should not be returned by the function, but instead be stored inside the array nums1. To accommodate this, nums1 has a length of m + n, where the first m elements denote the elements that should be merged, and the last n elements are set to 0 and should be ignored. nums2 has a length of n.
non-decreasing order
: 비 내림차순1 2 2 3 4 5
nums1.length = m + n
만약 이해를 잘못하고 새로운 배열을 만들게 된다면 이는 출제자의 의도를 파악하지 못한것이라 할 수 있습니다.
private void badCase(int[] nums1, int[] nums2) {
int fullLength = nums1.length;
int[] tempArray = new int[fullLength]; // 새로운 배열을 생성함.
int nums1Index = 0;
int nums2Index = 0;
for (int i = 0; i < fullLength; i++) {
if (nums1[nums1Index] != 0 && nums1[nums1Index] <= nums2[nums2Index]) {
tempArray[i] = nums1[nums1Index];
nums1Index++;
} else {
tempArray[i] = nums2[nums2Index];
nums2Index++;
}
}
System.out.println(Arrays.toString(tempArray));
}
앞 부분의 경우에는 원소가 이미 들어가있어 순서를 바꾸기가 까다롭습니다.
그럼 쓰레기 값이 들어있는 뒤에서부터 시도하면 더 괜찮지 않을까요?
뒷부분부터 채워나가기로 했으니 당연히 큰 값을 비교해야겠죠?
시작은 유효한 index인 m - 1
로 시작하겠습니다.
class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
int insertIndex = nums1.length - 1;
int nums1Index = m - 1;
int nums2Index = n - 1;
while (nums2Index >= 0) {
if (nums1Index >= 0 && nums1[nums1Index] > nums2[nums2Index]) {
nums1[insertIndex--] = nums1[nums1Index--];
} else {
nums1[insertIndex--] = nums2[nums2Index--];
}
}
}
}