912.排序数组
归并排序
int[] temp;
public int[] sortArray(int[] nums) {
temp = new int[nums.length];
mergesort(0, nums.length - 1, nums);
return nums;
}
private void mergesort(int left, int right, int[] nums){
if(left >= right) return;
int mid = (left + right) >>> 1;
mergesort(left, mid, nums);
mergesort(mid + 1, right, nums);
int i = left, j = mid + 1;
int cnt = 0;
while(i<=mid&&j<=right){
if(nums[i]<=nums[j]){
temp[cnt++] = nums[i++];
}else{
temp[cnt++] = nums[j++];
}
}
while(i<=mid) temp[cnt++] = nums[i++];
while(j<=right) temp[cnt++] = nums[j++];
for(int k=left;k<=right;k++){
nums[k] = temp[k - left];
}
}
固定一下模板,可以直接应用于求数组逆序对的数量
class Solution {
int[] temp;
public int[] sortArray(int[] nums) {
temp = new int[nums.length];
mergesort(0, nums.length - 1, nums);
return nums;
}
private void mergesort(int left, int right, int[] nums){
if(left >= right) return;
int mid = (left + right) >>> 1;
mergesort(left, mid, nums);
mergesort(mid + 1, right, nums);
if(nums[mid] <= nums[mid + 1]) return;
merge(left, mid, right, nums);
return;
}
private void merge(int left, int mid, int right, int[] nums){
for(int i = left; i <= right; i++){
temp[i] = nums[i];
}
int i = left, j = mid + 1;
for(int k = left; k <= right; k++){
if(i == mid + 1) nums[k] = temp[j++];
else if (j == right + 1) nums[k] = temp[i++];
else if (temp[i] <= temp[j]) nums[k] = temp[i++];
else nums[k] = temp[j++];
}
return;
}
}
合并K个升序链表
class Solution {
public ListNode mergeKLists(ListNode[] lists) {
return merge(lists, 0, lists.length - 1);
}
public ListNode merge(ListNode[] lists, int l, int r) {
if (l == r) {
return lists[l];
}
if (l > r) {
return null;
}
int mid = (l + r) >> 1;
ListNode a = merge(lists, l, mid);
ListNode b = merge(lists, mid + 1, r);
if (a == null || b == null) {
return a != null ? a : b;
}
ListNode head = new ListNode(0);
ListNode tail = head, aPtr = a, bPtr = b;
while (aPtr != null && bPtr != null) {
if (aPtr.val < bPtr.val) {
tail.next = aPtr;
aPtr = aPtr.next;
} else {
tail.next = bPtr;
bPtr = bPtr.next;
}
tail = tail.next;
}
tail.next = (aPtr != null ? aPtr : bPtr);
return head.next;
}
}