Given the array nums, for each nums[i] find out how many numbers in the array are smaller than it. That is, for each nums[i] you have to count the number of valid j's such that j != i and nums[j] < nums[i].
Return the answer in an array.
Example 1:
Input: nums = [8,1,2,2,3]Output: [4,0,1,1,3]Explanation:For nums[0]=8 there exist four smaller numbers than it (1, 2, 2 and 3).For nums[1]=1 does not exist any smaller number than it.For nums[2]=2 there exist one smaller number than it (1).For nums[3]=2 there exist one smaller number than it (1).For nums[4]=3 there exist three smaller numbers than it (1, 2 and 2).
Example 2:
Input: nums = [6,5,4,8]Output: [2,1,0,3]
Example 3:
Input: nums = [7,7,7,7]Output: [0,0,0,0]
Constraints:
2 <= nums.length <= 5000 <= nums[i] <= 100
题意
对于一个数组nums中的每一个数nums[i],统计小于nums[i]的数的个数。
思路
- 暴力法。
代码实现 - 暴力法
class Solution {public int[] smallerNumbersThanCurrent(int[] nums) {int[] ans = new int[nums.length];for (int i = 0; i < nums.length; i++) {for (int j = 0; j < nums.length; j++) {if (j != i && nums[j] < nums[i]) {ans[i]++;}}}return ans;}}
代码实现 - Hash
class Solution {public int[] smallerNumbersThanCurrent(int[] nums) {int[] ans = new int[nums.length];Map<Integer, Integer> hash = new TreeMap<>();for (int i = 0; i < nums.length; i++) {if (!hash.containsKey(nums[i])) {hash.put(nums[i], 1);} else {hash.put(nums[i], hash.get(nums[i]) + 1);}}int sum = 0;for (int key : hash.keySet()) {int temp = sum + hash.get(key);hash.put(key, sum);sum = temp;}for (int i = 0; i < ans.length; i++) {ans[i] = hash.get(nums[i]);}return ans;}}
代码实现 - 二分法
class Solution {public int[] smallerNumbersThanCurrent(int[] nums) {int[] ans = new int[nums.length];int[] copy = Arrays.copyOf(nums, nums.length);Arrays.sort(copy);for (int i = 0; i < ans.length; i++) {ans[i] = binarySearch(copy, nums[i]);}return ans;}private int binarySearch(int[] nums, int target) {int left = 0, right = nums.length - 1;while (left < right) {int mid = left + (right - left) / 2;if (nums[mid] < target) {left = mid + 1;} else if (nums[mid] >= target) {right = mid;}}return left;}}
