0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

88 解答

Last updated at Posted at 2022-05-15

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-- が起こる。

参考

学んだことを簡単にまとめているだけなので悪しからず。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?