【问题描述】[中等]

【解答思路】

1. 暴力 (超时)

时间复杂度:O(N^2) 空间复杂度:O(1)

public List<Integer> countSmaller(int[] nums) {List<Integer> ans =  new ArrayList<Integer>();int n = nums.length;if(n==0){return ans;}for(int i=0;i<n-1;i++ ){int num=0;for(int j =i;j<n;j++ ){if(nums[j]<nums[i]){num++;}}ans.add(num);}//最后一个必为 0ans.add(0);return ans;}
2. 归并排序+索引数组



时间复杂度:O(NlogN) 空间复杂度:O(N)

import java.util.ArrayList;
import java.util.List;public class Solution {private int[] temp;private int[] counter;private int[] indexes;public List<Integer> countSmaller(int[] nums) {List<Integer> res = new ArrayList<>();int len = nums.length;if (len == 0) {return res;}temp = new int[len];counter = new int[len];indexes = new int[len];for (int i = 0; i < len; i++) {indexes[i] = i;}mergeAndCountSmaller(nums, 0, len - 1);for (int i = 0; i < len; i++) {res.add(counter[i]);}return res;}/*** 针对数组 nums 指定的区间 [l, r] 进行归并排序,在排序的过程中完成统计任务** @param nums* @param l* @param r*/private void mergeAndCountSmaller(int[] nums, int l, int r) {if (l == r) {// 数组只有一个元素的时候,没有比较,不统计return;}int mid = l + (r - l) / 2;mergeAndCountSmaller(nums, l, mid);mergeAndCountSmaller(nums, mid + 1, r);// 归并排序的优化,同样适用于该问题// 如果索引数组有序,就没有必要再继续计算了if (nums[indexes[mid]] > nums[indexes[mid + 1]]) {mergeOfTwoSortedArrAndCountSmaller(nums, l, mid, r);}}/*** [l, mid] 是排好序的* [mid + 1, r] 是排好序的** @param nums* @param l* @param mid* @param r*/private void mergeOfTwoSortedArrAndCountSmaller(int[] nums, int l, int mid, int r) {// 3,4  1,2//[left,mid],[mid+1,right]有序for (int i = l; i <= r; i++) {temp[i] = indexes[i];}int i = l;int j = mid + 1;// 左边出列的时候,计数for (int k = l; k <= r; k++) {//[left,mid]用完了,没有与[j,right]组成逆序的元素了if (i > mid) {indexes[k] = temp[j];j++;}//[mid+1,right]用完了,每个[i,mid]中的元素都能与[mid+1,right]成逆序else if (j > r) {indexes[k] = temp[i];i++;// 此时 j 用完了,[7,8,9 | 1,2,3]// 之前的数就和后面的区间长度构成逆序counter[indexes[k]] += (r - mid);} //所有小于temp[i]映射的元素,即[mid+1,j-1]中的元素成逆序else if (nums[temp[i]] <= nums[temp[j]]) {indexes[k] = temp[i];i++;// 此时 [4,5, 6   | 1,2,3 10 12 13]//           mid          j// //(j-1)-(mid+1)+1 = j-mid-1counter[indexes[k]] += (j - mid - 1);}//严格小于temp[i]映射的元素,移动j else {// nums[indexes[i]] > nums[indexes[j]] 构成逆序indexes[k] = temp[j];j++;}}}public static void main(String[] args) {int[] nums = new int[]{5, 2, 6, 1};Solution solution = new Solution();List<Integer> countSmaller = solution.countSmaller(nums);System.out.println(countSmaller);}
}

【总结】

1. “归并排序” 的细节

1、如果 “前有序数组” 和 “后有序数组” 直接合并的时候,就有序,就不必归并;

2、在 “归并” 的时候,全局使用一个临时存储数组,而不必每一个归并都新建临时的存储空间。

2.出列一个元素的时候,马上得到右边比自己小的元素的个数,是通过不同的指针之间的距离得到的。

在编码的时候,建议在草稿纸上写写画画,用具体的数值带进去,才能确保你计算的指针之间的距离正确。

3.如果你写过 “逆序数” 的计算的代码,你就会发现,“逆序数” 的计算可以在 “前有序数组” 元素出列的时候计算逆序数,也可以在 “后有序数组” 元素出列的时候计算逆序数,你可以比较一下它们在编码时候的不同之处。

转载链接:https://leetcode-cn.com/problems/count-of-smaller-numbers-after-self/solution/gui-bing-pai-xu-suo-yin-shu-zu-python-dai-ma-java-/

[Leetcode][第315题][JAVA][计算右侧小于当前元素的个数][暴力][归并排序+索引数组]相关推荐

  1. 315. 计算右侧小于当前元素的个数

    315. 计算右侧小于当前元素的个数 给定一个整数数组 nums,按要求返回一个新数组 counts.数组 counts 有该性质: counts[i] 的值是 nums[i] 右侧小于 nums[i ...

  2. 当前元素_leetcode315. 计算右侧小于当前元素的个数

    leetcode315. 计算右侧小于当前元素的个数 给定一个整数数组 nums,按要求返回一个新数组 counts.数组 counts 有该性质: counts[i] 的值是 nums[i] 右侧小 ...

  3. LeetCode 315. 计算右侧小于当前元素的个数(Count of Smaller Numbers After Self)

    题目描述: 给定一个整数数组 nums,按要求返回一个新数组 counts.数组 counts 有该性质: counts[i] 的值是  nums[i] 右侧小于 nums[i] 的元素的数量. 示例 ...

  4. leetcode315. 计算右侧小于当前元素的个数(树状数组解法)

    leetcode315. 计算右侧小于当前元素的个数(树状数组解法) 题目:给定一个整数数组 nums,按要求返回一个新数组 counts.数组 counts 有该性质: counts[i] 的值是 ...

  5. LeetCode 315. 计算右侧小于当前元素的个数(二叉查找树二分查找归并排序逆序数总结)

    文章目录 1. 题目 2. 解题 2.1 二叉查找树 2.2 二分插入 2.3 归并排序 1. 题目 给定一个整数数组 nums,按要求返回一个新数组 counts.数组 counts 有该性质: c ...

  6. 求栈中元素个数算法_每日算法系列【LeetCode 315】计算右侧小于当前元素的个数...

    题目描述 给定一个整数数组 nums ,按要求返回一个新数组 counts .数组 counts 有该性质: counts[i] 的值是 nums[i] 右侧小于 nums[i] 的元素的数量. 示例 ...

  7. 315. Count of Smaller Numbers After Self 计算右侧小于当前元素的个数

    Title 给定一个整数数组 nums,按要求返回一个新数组 counts.数组 counts 有该性质: counts[i] 的值是 nums[i] 右侧小于 nums[i] 的元素的数量. 示例: ...

  8. 力扣——315. 计算右侧小于当前元素的个数

    目录 问题描述 问题分析 问题描述 问题分析 本题采用分治思想进行处理,单独处理较长数组算法复杂度过大,先拆分为短对象进行处理,最后将结果进行合并. 针对拆分出来的较短数组的处理: class Sol ...

  9. [Leetcode][第696题][JAVA][计算二进制子串][分组]

    [问题描述][简单] [解答思路] 1. 按字符分组 将字符串 ss 按照 00 和 11 的连续段分组,存在counts 数组中,例如 s = 00111011,可以得到这样的counts 数组:c ...

最新文章

  1. 【Verilog HDL 训练】第 12 天(数据通路)
  2. C# Winform小程序:局域网设置NTP服务器、实现时间同步
  3. 神策 2021 数据驱动大会,与“现代营销之父”科特勒的认知同行
  4. boost::mpi模块all_to_all() 集合的测试
  5. 解题报告 Number
  6. 2013年蓝桥杯模拟赛答案
  7. OGG迁移大库注意要点之impdp导入产生大量归档
  8. 如何启动一个本地静态服务器
  9. 从最小样本中识别鸟类
  10. jdk下载和安装教程
  11. mysql错误:Table XXX is marked as crashed and should be repaire
  12. 电容在计算机运用原理,隔直电容的作用及原理 - 全文
  13. 凝思系统激活序列号_安装凝思linux操作系统.doc
  14. 关于python的经典书籍推荐_5本Python经典书籍推荐,你都读过吗?
  15. 股市投资时,寻找低市盈率标的
  16. Android发展历程
  17. 二维数组与指向指针的指针
  18. 举个栗子!Tableau 技巧(158):如何实现双域的服务器单点登录
  19. 我也玩android了
  20. 【2022年上半年信息系统管理综合知识】

热门文章

  1. jquery在选择器中使用变量及innerText问题(转载)
  2. 面试必备:HashMap底层数据结构?jdk1.8算法优化,hash冲突,扩容等问题
  3. Android studio 导入module方法
  4. Android 自动检测更新,自动下载apk更新版本
  5. vs2010编写的net3.5用vs2008打开
  6. 计算机硬件基础大纲,计算机硬件基础教学大纲..docx
  7. 数据结构实验六 综合数据处理
  8. Java中的注解以及应用 @Deprecated @SupressWarning @Override
  9. lgg8配置_LGG8XThinQ参数配置-LG G8X ThinQ详细性能评测
  10. Java预编译和批处理