Leetcodeというサイトで912. Sort an Arrayという問題を解いています。
912. Sort an Array
Example 1:
Input: nums = [5,2,3,1]
Output: [1,2,3,5]
Example 2:Input: nums = [5,1,1,2,0,0]
Output: [0,0,1,1,2,5]
これに対する一つの回答例として、配列を細かく分割してから、マージする以下のやり方が記載されていましたが、
mergeのメソッドの部分が理解できないので、以下の質問をさせてください。
1: int[] tmp = new int[r - l + 1];
の部分についてr - l + 1はこれまでの配列の要素と新しい要素比較する要素を比べるために+ 1としているのでしょうか?
2:int i = l, j = mid + 1, k = 0;
ですがj = mid + 1で+1するのは何故なのでしょうか、
分割前の配列を2つに分ける場合、lからmidまでが一つの配列、配列を分割した地点+1(mid + 1からr)がもう一つの配列、という理解で良いのでしょうか?
3:while (i <= mid || j <= r)とするのはなぜなのでしょうか。ループする際に、分割された各々の配列の長さを超えないため、という理解で良いのでしょうか。
4:if (i > mid || j <= r && nums[i] > nums[j])について
nums[i] > nums[j]については要素の比較なのでわかるのですが、i > midの存在意義がいまいちピンときていません。
java
1class Solution { 2 public int[] sortArray(int[] nums) { 3 int[] res = new int[nums.length]; 4 if (nums == null || nums.length == 0) return res; 5 mergeSort(nums, 0, nums.length - 1); 6 return nums; 7 } 8 private void mergeSort(int[] nums, int l, int r) { 9 if (l >= r) return; 10 int mid = l + (r - l) / 2; 11 mergeSort(nums, l, mid); 12 mergeSort(nums, mid + 1, r); 13 merge(nums, l, r); 14 } 15 private void merge(int[] nums, int l, int r) { 16 int mid = l + (r - l) / 2; 17 int[] tmp = new int[r - l + 1]; 18 int i = l, j = mid + 1, k = 0; 19 while (i <= mid || j <= r) { 20 if (i > mid || j <= r && nums[i] > nums[j]) { 21 tmp[k++] = nums[j++]; 22 } else { 23 tmp[k++] = nums[i++]; 24 } 25 } 26 System.arraycopy(tmp, 0, nums, l, r - l + 1); 27 } 28}
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/06/30 21:41