LeetCode[315]计算右侧小于当前元素的个数

这篇具有很好参考价值的文章主要介绍了LeetCode[315]计算右侧小于当前元素的个数。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

难度:Hard

题目:

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


示例 1:

输入:nums = [5,2,6,1]
输出:[2,1,1,0] 
解释:
5 的右侧有 2 个更小的元素 (2 和 1)
2 的右侧仅有 1 个更小的元素 (1)
6 的右侧有 1 个更小的元素 (1)
1 的右侧有 0 个更小的元素

 示例 2:

输入:nums = [-1]
输出:[0]

 示例 3:

输入:nums = [-1,-1]
输出:[0,0]

提示:

  • 1 <= nums.length <= 105
  • -104 <= nums[i] <= 104

 Related Topics

  • 树状数组
  • 线段树
  • 数组
  • 二分查找
  • 分治
  • 有序集合
  • 归并排序

重点!!!解题思路

明确解题思路:

        题中要求求出右侧小于当前元素的数量,如果将数组拆分开来,左右两边都是降序排列,如果当左边数组有一个值大于右边数组的其中一个值,那么就意味着比当前左边这个数小的元素有右边那个数到右边数组末尾那么多个,即题目可使用归并排序来解决。

源码+讲解:

    class Solution {
        class Data {  //因为你要记录每个值所对应得右边元素个数,hashmap太麻烦,我们直接封装一个内部类
            int ind, val, cnt;  //对应下标,值,右边对应得元素

            public Data(int ind, int val) {  //初始化
                this.ind = ind;
                this.val = val;
                cnt = 0;
            }
        }

        Data[] temp;  //归并排序的克隆数组

        public List<Integer> countSmaller(int[] nums) {
            temp = new Data[nums.length];
            Data[] data = new Data[nums.length];  //待排序数组
            for (int i = 0; i < nums.length; i++) {  //将每个元素封装到类中
                data[i] = new Data(i, nums[i]);
            }
            merge_sort(data, 0, data.length - 1);  //开始归并排序
            Arrays.sort(data, new Comparator<Data>() {  //当归并排序后,我们需要每个数组下标从小到大来输出,那么我们就需要一个小顶堆
                @Override
                public int compare(Data o1, Data o2) {
                    return o1.ind - o2.ind;
                }
            });
            List<Integer> res = new ArrayList<>();  //集合结果用来还原堆中的值
            for (Data datum : data) {
                res.add(datum.cnt);
            }
            return res;
        }

        //很基础的一个归并排序解法 如果有不懂得朋友 可以看看我前面发的题
        public void merge_sort(Data[] data, int l, int r) {
            if (l >= r) return;
            int mid = (l + r) >> 1;
            merge_sort(data, l, mid);
            merge_sort(data, mid + 1, r);
            int k = l, p1 = l, p2 = mid + 1;
            while (p1 <= mid || p2 <= r) {
                if (p2 > r || (p1 <= mid && data[p1].val > data[p2].val)) {
                    data[p1].cnt+=(r-p2+1);
                    temp[k++] = data[p1++];
                } else {
                    temp[k++] = data[p2++];
                }
            }
            for (int i=l;i<=r;i++) data[i]=temp[i];
        }
    }

 运行结果:

LeetCode[315]计算右侧小于当前元素的个数,算法刷题篇,快速排序,# 归并排序(Merge-Sort):从二路到多路,leetcode,算法,排序算法

如果您还有什么疑问或解答有问题,可在下方评论,我会及时回复。

系列持续更新中,点个订阅吧,喜欢练习算法那就点个攒吧 文章来源地址https://www.toymoban.com/news/detail-610294.html

到了这里,关于LeetCode[315]计算右侧小于当前元素的个数的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • uniapp使用uni-swipe-action后右侧多了小于1px的间隙

    问题:uniapp使用uni-swipe-action后右侧多了小于1px的间隙。且在真机上没有问题,但是在微信开发者工具中有问题。 代码如下:在滑动滑块或者点击这个区域时,就会出现问题。   怀疑是,父级容器cart-box和子级uni-swipe-action宽度没有完全相等导致。而容器都没有设置固定宽度值

    2024年02月15日
    浏览(43)
  • LeetCode算法二叉树—222. 完全二叉树的节点个数

    目录 222. 完全二叉树的节点个数 - 力扣(LeetCode) 代码: 运行结果:  给你一棵  完全二叉树  的根节点  root  ,求出该树的节点个数。 完全二叉树 的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集

    2024年02月07日
    浏览(42)
  • 【算法与数据结构】222、LeetCode完全二叉树的节点个数

    所有的LeetCode题解索引,可以看这篇文章——【算法和数据结构】LeetCode题解。    思路分析 :利用层序遍历,然后用num++记录节点数量。其他的例如递归法和迭代法也是如此。    层序遍历程序如下 : 复杂度分析: 时间复杂度: O ( n ) O(n) O ( n ) 。 空间复杂度: O ( n )

    2024年02月15日
    浏览(47)
  • vue+elementui实现鼠标触及当前页面右边缘,右侧弹出新的对话框

    目前项目中需要自定义大屏,但是大屏右侧显示矩形对话框有一点突兀,所以做成鼠标靠近页面右侧边缘的时候对话框弹出,点击对话框上的回缩按钮后,对话框隐藏。 效果如图所示 对话框使用 elemetui 自带的 el-drawer ,设置其是否展示参数初始化为 false 在最外层的div标签添

    2024年02月02日
    浏览(38)
  • Practice1|1207. 独一无二的出现次数、1365. 有多少小于当前数字的数字、941. 有效的山脉数组

    1.题目: 给你一个整数数组 arr,请你帮忙统计数组中每个数的出现次数。 如果每个数的出现次数都是独一无二的,就返回 true;否则返回 false。 示例 1: 输入:arr = [1,2,2,1,1,3] 输出:true 解释:在该数组中,1 出现了 3 次,2 出现了 2 次,3 只出现了 1 次。没有两个数的出现

    2024年02月15日
    浏览(39)
  • 力扣(LeetCode)算法_C++—— 存在重复元素

    给你一个整数数组 nums 。如果任一值在数组中出现 至少两次 ,返回 true ;如果数组中每个元素互不相同,返回 false 。 示例 1: 输入:nums = [1,2,3,1] 输出:true 示例 2: 输入:nums = [1,2,3,4] 输出:false 示例 3: 输入:nums = [1,1,1,3,3,4,3,2,4,2] 输出:true 提示: 1 = nums.length = 105 -1

    2024年02月09日
    浏览(45)
  • 算法训练day16Leetcode104二叉树最大深度111二叉树最小深度222完全二叉树的节点个数

    https://www.bilibili.com/video/BV1Gd4y1V75u/?vd_source=8272bd48fee17396a4a1746c256ab0ae 用递归,但是什么顺序没想清楚 二叉树节点的深度:指从根节点到该节点的最长简单路径边的条数或者节点数(取决于深度从0开始还是从1开始) 二叉树节点的高度:指从该节点到叶子节点的最长简单路径边

    2024年01月16日
    浏览(43)
  • 力扣(LeetCode)算法_C++——存在重复元素 II

    存在重复元素 II 给你一个整数数组 nums 和一个整数 k ,判断数组中是否存在两个 不同的索引 i 和 j ,满足 nums[i] == nums[j] 且 abs(i - j) = k 。如果存在,返回 true ;否则,返回 false 。 示例 1: 输入:nums = [1,2,3,1], k = 3 输出:true 示例 2: 输入:nums = [1,0,1,1], k = 1 输出:true 示例

    2024年02月09日
    浏览(34)
  • element-ui的年份范围选择器,选择的年份需等于或小于当前年份,选择的年份范围必须在三年之内

    日期限制处理(禁用),下面我以我这边的需求为例, 选择的年份需等于或小于当前年份 选择的年份范围必须在三年之内 1.限制起始日期小于截止日期 1)根据用户选中的开始日期,置灰不可选的日期范围; 2)如果用户先选择截止日期,再选择的开始日期,且开始日期大于

    2024年04月14日
    浏览(36)
  • 二叉树算法思想和原理:介绍通过递归算法计算二叉树结点个数的基本思路及C#、C++代码示例

    二叉树是一种非常常见的数据结构,它由结点组成,每个结点最多有两个子结点,分别称为左子结点和右子结点。在二叉树中,每个结点都有一个数据域和一个指针域,指针域分别指向左子结点和右子结点。二叉树有很多种不同的类型,如满二叉树、完全二叉树、平衡二叉树

    2024年01月21日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包