Aceptedされたがダメそうな解答
問題文にソートされた配列はnums1に入れとかなくてはいけないと書いていたので、わざわざソートした combinedArray をnums1 にもういちど入れなおしている。
しかし、そもそもソートされた配列を関数で返してはいけないと書いてあるので間違いだと思う。
public void merge(int[] nums1, int m, int[] nums2, int n) {
int[] combinedArray = new int[m + n];
int index = 0;
for (int i = 0; i < m; i++) {
combinedArray[i] = nums1[i];
index++;
}
for (int i = 0; i < n; i++) {
combinedArray[index] = nums2[i];
index++;
}
Arrays.sort(combinedArray);
for(int i = 0; i < m+n; i++) {
nums1[i] = combinedArray[i];
}
System.out.println(Arrays.toString(nums1));
}
正攻法
もともとsortedされた二つの配列なので、nums1 の最後(0以外の)要素とnums2の最後の要素を比べて大きいほうをnums2の最後に入れる。
これを繰り返す。
public void merge(int[] nums1, int m, int[] nums2, int n) {
int nums1Length = m - 1; // 配列nums1の要素数
int nums2Length = n - 1; // 配列nums2の要素数
int index = m + n - 1; // nums1, nums2を合わせた配列の要素数
while (nums2Length >= 0) {
if (nums1Length >= 0 && nums1[nums1Length] > nums2[nums2Length]) {
nums1[index--] = nums1[nums1Length--];
//index--;
} else {
nums1[index--] = nums2[nums2Length--];
//index--;
}
}
}
nums1[index--];
上記の場合、nums1[index] が起こってから index-- が起こる。
学んだことを簡単にまとめているだけなので悪しからず。