Count of Smaller Numbers After Self
题目地址:
https://leetcode.com/problems/count-of-smaller-numbers-after-self/description/
题目:
You are given an integer array nums and you have to return a new counts array. The counts array has the property where
counts[i] is the number of smaller elements to the right of nums[i].
Example:
Given nums = [5, 2, 6, 1] To the right of 5 there are 2 smaller elements (2 and 1). To the right of 2 there is only 1 smaller element (1). To the right of 6 there is 1 smaller element (1). To the right of 1 there is 0 smaller element.
Return the array
[2, 1, 1, 0].
解题思路:
merge sort的思想。
代码:
int[] count; public List<Integer> countSmaller(int[] nums) { List<Integer> res = new ArrayList<Integer>(); count = new int[nums.length]; int[] indexes = new int[nums.length]; for(int i = 0; i < nums.length; i++){ indexes[i] = i; } mergesort(nums, indexes, 0, nums.length - 1); for(int i = 0; i < count.length; i++){ res.add(count[i]); } return res; } private void mergesort(int[] nums, int[] indexes, int start, int end){ if(end <= start){ return; } int mid = (start + end) / 2; mergesort(nums, indexes, start, mid); mergesort(nums, indexes, mid + 1, end); merge(nums, indexes, start, end); } private void merge(int[] nums, int[] indexes, int start, int end){ int mid = (start + end) / 2; int left_index = start; int right_index = mid+1; int rightcount = 0; int[] new_indexes = new int[end - start + 1]; int sort_index = 0; while(left_index <= mid && right_index <= end){ if(nums[indexes[right_index]] < nums[indexes[left_index]]){ new_indexes[sort_index] = indexes[right_index]; rightcount++; right_index++; }else{ new_indexes[sort_index] = indexes[left_index]; count[indexes[left_index]] += rightcount; left_index++; } sort_index++; } while(left_index <= mid){ new_indexes[sort_index] = indexes[left_index]; count[indexes[left_index]] += rightcount; left_index++; sort_index++; } while(right_index <= end){ new_indexes[sort_index++] = indexes[right_index++]; } for(int i = start; i <= end; i++){ indexes[i] = new_indexes[i - start]; } }

Comments
Post a Comment