给定一个整数数组 nums,按要求返回一个新数组 counts。数组 counts 有该性质: counts[i] 的值是 nums[i] 右侧小于 nums[i] 的元素的数量。
示例:
输入: [5,2,6,1]
输出: [2,1,1,0]
解释:
5 的右侧有 2 个更小的元素 (2 和 1).
2 的右侧仅有 1 个更小的元素 (1).
6 的右侧有 1 个更小的元素 (1).
1 的右侧有 0 个更小的元素.
链接:https://leetcode-cn.com/problems/count-of-smaller-numbers-after-self
/**
* @author ffzs
* @describe
* @date 2020/7/11
*/
public class Solution {
public static List<Integer> countSmaller(int[] nums) {
int len = nums.length;
int[] counter = new int[len];
for (int i = len-2; i >=0 ; --i) {
for (int j = i+1; j < len; ++j) {
if (nums[j] < nums[i]) counter[i]++;
}
}
List<Integer> res = new ArrayList<>(len);
for (int i : counter) res.add(i);
return res;
}
public static void main(String[] args) {
int[] nums = {5,2,6,1};
System.out.println(countSmaller(nums));
}
}
/**
* @author ffzs
* @describe
* @date 2020/7/11
*/
public class Solution2 {
public static List<Integer> countSmaller(int[] nums) {
int len = nums.length;
if (len == 0) return new ArrayList<>();
int[] counter = new int[len];
List<Integer> sorted = new ArrayList<>();
sorted.add(nums[len-1]);
for (int i = len-2; i >=0 ; --i) {
int index = findIndex(nums[i], sorted);
sorted.add(index, nums[i]);
counter[i] = index;
}
List<Integer> res = new ArrayList<>(len);
for (int i : counter) res.add(i);
return res;
}
private static int findIndex (int num, List<Integer> sorted) {
int l = 0, r = sorted.size()-1;
while (l < r) {
int mid = (l + r) >> 1;
if (sorted.get(mid) < num) l = mid + 1;
else r = mid;
}
return sorted.get(l) < num ? l + 1: l;
}
public static void main(String[] args) {
int[] nums = {26,78,27,100,33,67,90,23,66,5,38,7,35,23,52,22,83,51,98,69,81,32,78,28,94,13,2,97,3,76,99,51,9,21,84,66,65,36,100,41};
System.out.println(countSmaller(nums));
}
}
/**
* @author ffzs
* @describe
* @date 2020/7/11
*/
public class Solution3 {
static int[] ns, tmp, is, ctr;
public static List<Integer> countSmaller(int[] nums) {
int len = nums.length;
if (len == 0) return new ArrayList<>();
ctr = new int[len];
tmp = new int[len];
is = new int[len];
for (int i = 0; i < len; i++) is[i] = i;
ns = nums;
split(0, len-1);
List<Integer> res = new ArrayList<>(len);
for (int i : ctr) res.add(i);
return res;
}
private static void split (int l, int r) {
if (l == r) return;
int mid = l + r >> 1;
split(l, mid);
split(mid+1, r);
if (ns[is[mid]] > ns[is[mid+1]]) merge(l ,mid ,r);
}
private static void merge (int l, int mid , int r) {
if (r + 1 - l >= 0) System.arraycopy(is, l, tmp, l, r + 1 - l);
int i = l, j = mid + 1;
for (int k = l; k <= r; ++k) {
if (j > r) {
ctr[tmp[i]] += r - mid;
is[k] = tmp[i++];
}
else if (i > mid)
is[k] = tmp[j++];
else if (ns[tmp[i]] <= ns[tmp[j]]) {
ctr[tmp[i]] += k - i;
is[k] = tmp[i++];
}
else
is[k] = tmp[j++];
}
}
public static void main(String[] args) {
int[] nums = {26,78,27,100,33,67,90,23,66,5,38,7,35,23,52,22,83,51,98,69,81,32,78,28,94,13,2,97,3,76,99,51,9,21,84,66,65,36,100,41};
System.out.println(countSmaller(nums));
}
}
public static int sum(int value, int[] BITree) {
int sum = 0;
while (value > 0) {
sum += BITree[value];
value -= (value & -value);
}
return sum;
}
public static void update(int value, int[] BITree) {
while (value <= BITree.length - 1) {
BITree[value] += 1;
value += (value & -value);
}
}
/**
* @author ffzs
* @describe
* @date 2020/7/11
*/
public class Solution {
public static List<Integer> countSmaller(int[] nums) {
int len = nums.length;
List<Integer> res = new ArrayList<>();
if (len == 0) return res;
int[] counter = new int[len];
int min = nums[0];
for (int num : nums) min = Math.min(min, num);
for (int i = 0; i < nums.length; i++) {
nums[i] = nums[i] - min + 1;
}
int max = nums[0];
for (int num : nums) max = Math.max(max, num);
int[] BIT = new int[max + 1];
for (int i = nums.length - 1; i >= 0; i--) {
int count = sum(nums[i]-1, BIT);
counter[i] = count;
update(nums[i], BIT);
}
for (int i : counter) res.add(i);
return res;
}
private static int lowBit (int val) {
return (val & -val);
}
private static int sum (int val, int[] BIT){
int sum = 0;
for (int i = val; i > 0; i -= lowBit(i)) {
sum += BIT[i];
}
return sum;
}
private static void update (int val, int[] BIT){
for (int i = val; i < BIT.length - 1; i += lowBit(i)) {
BIT[i] += 1;
}
}
public static void main(String[] args) {
int[] nums = {5,2,6,1};
System.out.println(countSmaller(nums));
}
}