就是用merge sort,写完了看了这个才发觉自己二了,不需要用HashMap来存“比某个index的数小的数”的个数,用数组够了。
public class Solution { public List<Integer> countSmaller(int[] nums) { List<Integer> countOfSmallerNumbers = new ArrayList<Integer>(); if (nums == null || nums.length == 0) return countOfSmallerNumbers; int[] indexTrack = new int[nums.length]; HashMap<Integer, Integer> smallerNumberTrack = new HashMap<Integer, Integer>(); for (int i = 0; i < nums.length; i++) { indexTrack[i] = i; smallerNumberTrack.put(i, 0); } mergeSort(nums, indexTrack, 0, nums.length - 1, smallerNumberTrack); for (int i = 0; i < nums.length; i++) { countOfSmallerNumbers.add(smallerNumberTrack.get(i)); } return countOfSmallerNumbers; } private void mergeSort(int[] nums, int[] indexTrack, int start, int end, HashMap<Integer, Integer> smallerNumberTrack) { if (start >= end) return; int mid = (start + end) / 2; mergeSort(nums, indexTrack, start, mid, smallerNumberTrack); mergeSort(nums, indexTrack, mid + 1, end, smallerNumberTrack); int[] left = new int[mid - start + 1]; int[] right = new int[end - mid]; for (int i = 0; i <= mid - start; i++) left[i] = indexTrack[start + i]; for (int i = 0; i < end - mid; i++) right[i] = indexTrack[mid + 1 + i]; int leftIndex = 0, rightIndex = 0, current = start; while (current <= end) { if (rightIndex >= end - mid || (leftIndex <= mid - start && nums[left[leftIndex]] <= nums[right[rightIndex]])) { smallerNumberTrack.put(left[leftIndex], smallerNumberTrack.get(left[leftIndex]) + rightIndex); indexTrack[current] = left[leftIndex++]; } else { indexTrack[current] = right[rightIndex++]; } current++; } } }
No comments:
Post a Comment