315. Count of Smaller Numbers After Self

文章目录

  • 1 题目理解
  • 2 暴力解法
  • 3 分治法

1 题目理解

输入:int[] nums
输出:计数的数组int[] counts
规则:counts[i]表示nums中下标大于i,值小于nums[i]的个数
Example 1:
Input: nums = [5,2,6,1]
Output: [2,1,1,0]
Explanation:
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.

2 暴力解法

对于处理每个元素nums[i],依次数一数从i+1到n,小于nums[i]的数有多少个。

class Solution {public List<Integer> countSmaller(int[] nums) {List<Integer> list = new ArrayList<Integer>();for(int i=0;i<nums.length;i++){int c = 0;for(int j=i+1;j<nums.length;j++){if(nums[j]<nums[i]){c++;}}list.add(c);}return list;}
}

时间复杂度O(n2)O(n^2)O(n2)

3 分治法

以下内容来自力扣官网。
数一数在右侧,比自己小的元素个数,这实际上就是在求逆序对。在学习算法过程中遇到过,利用归并排序计算逆序对个数。

我们还是要在「归并排序」的「并」中做文章。我们通过一个实例来看看。假设我们有两个已排序的序列等待合并,分别是 L = { 8, 12, 16, 22, 100 } 和 R = { 7, 26, 55, 64, 91 }。一开始我们用指针 lPtr = 0 指向 L 的头部,rPtr = 0 指向 R 的头部。记已经合并好的部分为 M。
在这里插入图片描述
我们发现 lPtr 指向的元素大于 rPtr 指向的元素,于是把 rPtr 指向的元素放入答案,并把 rPtr 后移一位。
在这里插入图片描述
接着我们继续合并:
在这里插入图片描述
此时 lPtr 比 rPtr 小,把 lPtr 对应的数加入答案。如果我们要统计 8 的右边比 8 小的元素,这里 7 对它做了一次贡献。如果待合并的序列 L = { 8, 12, 16, 22, 100 },R = { 7, 7, 7, 26, 55, 64, 91},那么一定有一个时刻,lPtr 和 rPtr 分别指向这些对应的位置:
在这里插入图片描述
下一步我们就是把 8 加入 M 中,此时三个 7 对 8 的右边比 8 小的元素的贡献为 3。以此类推,我们可以一边合并一边计算 R 的头部到 rPtr 前一个数字对当前 lPtr 指向的数字的贡献。

我们发现用这种「算贡献」的思想在合并的过程中计算逆序对的数量的时候,只在 lPtr 右移的时候计算,是基于这样的事实:当前 lPtr 指向的数字比 rPtr 小,但是比 R 中 [0 … rPtr - 1] 的其他数字大,[0 … rPtr - 1] 的数字是在 lPtr 右边但是比 lPtr 对应数小的数字,贡献为这些数字的个数。

但是我们又遇到了新的问题,在「并」的过程中 88 的位置一直在发生改变,我们应该把计算的贡献保存到哪里呢?这个时候我们引入一个新的数组,来记录每个数字对应的原数组中的下标,例如:
在这里插入图片描述
排序的时候原数组和这个下标数组同时变化,则排序后我们得到这样的两个数组:

在这里插入图片描述
我们用一个数组 ans 来记录贡献。我们对某个元素计算贡献的时候,如果它对应的下标为 p,我们只需要在 ans[p] 上加上贡献即可。

class Solution {private int[] index;private int[] temp;private int[] tempIndex;private int[] ans;private Map<Integer,Integer> valueIndexMap;public List<Integer> countSmaller(int[] nums) {this.index = new int[nums.length];this.temp = new int[nums.length];this.tempIndex = new int[nums.length];this.ans = new int[nums.length];valueIndexMap = new HashMap<Integer,Integer>();for(int i=0;i<nums.length;i++){valueIndexMap.put(nums[i],i);}for (int i = 0; i < nums.length; ++i) {index[i] = i;}int l = 0, r = nums.length - 1;mergeSort(nums, l, r);List<Integer> list = new ArrayList<Integer>();for (int num : ans) {list.add(num);}return list;}public void mergeSort(int[] a, int l, int r) {if (l >= r) {return;}int mid = (l + r) >> 1;mergeSort(a, l, mid);mergeSort(a, mid + 1, r);merge(a, l, mid, r);}public void merge(int[] a, int l, int mid, int r) {int i = l, j = mid + 1, p = l;while (i <= mid && j <= r) {if (a[i] <= a[j]) {temp[p] = a[i];tempIndex[p] = index[i];ans[valueIndexMap.get(a[i])] += (j - mid - 1);++i;++p;} else {temp[p] = a[j];tempIndex[p] = index[j];++j;++p;}}while (i <= mid)  {temp[p] = a[i];tempIndex[p] = index[i];ans[valueIndexMap.get(a[i])] += (j - mid - 1);++i;++p;}while (j <= r) {temp[p] = a[j];tempIndex[p] = index[j];++j;++p;}for (int k = l; k <= r; ++k) {index[k] = tempIndex[k];a[k] = temp[k];}}
}

时间复杂度O(nlogn)O(nlogn)O(nlogn)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/424166.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SQL Server执行计划那些事儿(3)——书签查找

接下来的文章是记录自己曾经的盲点&#xff0c;同时也透漏了自己的发展历程&#xff08;可能发展也算不上&#xff0c;只能说是瞎混&#xff09;。当然&#xff0c;一些盲点也在工作和探究过程中慢慢有些眉目&#xff0c;现在也愿意发扬博客园的奉献精神&#xff0c;拿出来和大…

博客堂怎么连个搜索功能都没有

今天想去博客堂搜索下文章看看&#xff0c;结果找了半天&#xff0c;差点把显示器翻过来看也没找到个搜索的功能。是我真的没找到&#xff0c;还是博客堂觉的搜索功能没必要啊??? 转载于:https://www.cnblogs.com/BearsTaR/archive/2006/06/07/419837.html

1218. 最长定差子序列

文章目录1 题目理解2 开始思考1 题目理解 给你一个整数数组 arr 和一个整数 difference&#xff0c;请你找出并返回 arr 中最长等差子序列的长度&#xff0c;该子序列中相邻元素之间的差等于 difference 。 输入&#xff1a;整数数组arr&#xff0c; 整数difference 输出&…

第一百零九期:双十一光棍节调试一个商城必备功能,Java Springboot开源秒杀系统

秒杀系统在电商系统中是非常重要的&#xff0c;不是因为秒杀这个功能重要&#xff0c;而是因为秒杀提现的是一个系统的并发负载能力。例如阿里巴巴或者京东&#xff0c;每年的双十一的峰值&#xff0c;其实就是下一年的常态&#xff0c;双十一各项技术指标&#xff0c;已经作为…

【名额有限】云开发AI拓展能力等你来体验!

这次来了个超厉害的新能力&#xff01; 人脸智能打马赛克、人脸智能裁剪……各种操作&#xff0c;都能一步到位! 迫不及待想体验&#xff0c;戳链接&#xff1a;https://wj.qq.com/s2/3986990/e0ef/ 还没有搞懂&#xff0c;继续往下看—— 基于云开发&#xff0b;AI人脸检测与分…

第一百一十期:详解SpringBoot应用跨域访问解决方案

说到跨域访问&#xff0c;必须先解释一个名词&#xff1a;同源策略。所谓同源策略就是在浏览器端出于安全考量&#xff0c;向服务端发起请求必须满足&#xff1a;协议相同、Host(ip)相同、端口相同的条件&#xff0c;否则访问将被禁止&#xff0c;该访问也就被称为跨域访问。 …

【REPERTOIRE】Rastaman Vibration

上周四的晚上跟项目里的同事一起去吃饭&#xff0c;去的是城外面一个叫Aussonne小镇上的Restaurant du Lac&#xff0c;左近真的有个湖。 当晚又充分体现了法国人吃晚饭的功夫&#xff0c;我们到凌晨一点才回城&#xff0c;接下来的几天昏昏沉沉&#xff0c;用了周末才恢复&…

63. Unique Paths II and 64. Minimum Path Sum

文章目录1 63 Unique Paths II1.1 题目描述1.2 动态规划解决2 64. Minimum Path Sum2.1 题目理解2.2 动态规划这一遍刷dp的题目就很轻松了。1 63 Unique Paths II 1.1 题目描述 A robot is located at the top-left corner of a m x n grid (marked ‘Start’ in the diagram…

LCA模板(数剖实现)

题目链接&#xff1a;https://www.luogu.org/problemnew/show/P3379 题意&#xff1a;LCA模板题。 思路&#xff1a;今天开始学树剖&#xff0c;先拿lca练练。树剖解lca&#xff0c;两次dfs复杂度均为O(n)&#xff0c;每次查询为logn&#xff0c;因此总复杂度为&#xff1a;O(2…

spring mvc学习(23):eclipse创建Maven项目没有src/main/java并不能新建的问题

eclipse里第一次创建Maven项目时&#xff0c;src/main/java与src/test/java目录都不会出现&#xff0c;这是因为eclipse里的一个默认配置。这两个目录是真实存在的&#xff0c;只是隐藏了。 这时候想要让这两个目录出现&#xff0c;就需要修改以下配置&#xff1a; 右击项目-…

Servlet技术简介与编写、编译Servlet程序

1&#xff0e;Servlet技术简介Servlet技术是Sun公司提供的一种实现动态网页的解决方案&#xff0c;它是基于Java编程语言的WEB服务器端编程技术&#xff0c;主要用于在WEB服务器端获得客户端的访问请求信息和动态生成对客户端的响应消息。Servlet技术也是JSP技术&#xff08;另…

spring mvc学习(24):配置maven环境和创建maven项目(建议收藏,超全超详细)

1本次歌谣就对如何创建一个maven项目做一个详细的讲解&#xff0c;毕竟卡了我三天&#xff0c;久久不能入眠&#xff0c;也搜了网上很多的博客 都没有顺利的解决maven项目的创建。这篇建议大家收藏&#xff0c;总会用到的。不然大家看网上的博客也是一脸懵逼。 2首先工具使用…

120. Triangle

文章目录1 题目理解2 解题2.1 动态规划2.2 优化空间2.3进一步优化空间1 题目理解 Given a triangle array, return the minimum path sum from top to bottom. For each step, you may move to an adjacent number on the row below. 输入&#xff1a;一个三角形数组List<…

Torque2D MIT 实战记录: 塔防进度(1)

前言 Torque2D虽然工具不齐全,而且加入MIT不久,但是有老底在,所以即使是第一版也是非常好用和完善的,这几天准备开发一款塔防类的游戏. :) 熟悉了TorqueScript的用法后,写东西还是很快的. 进度 1. 完成了道具库模块 2. 场景系统 3. 阵营逻辑 4. 攻击系统雏形 截图 效果还不错吧…

三十岁前不要去在乎的18件事

1&#xff0e;放弃 把握的反面就是放弃&#xff0c;选择了一个机会&#xff0c;就等于放弃了其它所有的可能。当新的机会摆在面前的时候&#xff0c;敢于放弃已经获得的一切&#xff0c;这不是功亏一篑&#xff0c;这不是半途而废&#xff0c;这是为了谋求更大的发展空间&#…

第一百一十一期:思考 | 一文说透秒杀系统如何设计

秒杀大家都不陌生。自2011年首次出现以来&#xff0c;无论是双十一购物还是 12306 抢票&#xff0c;秒杀场景已随处可见。简单来说&#xff0c;秒杀就是在同一时刻大量请求争抢购买同一商品并完成交易的过程。从架构视角来看&#xff0c;秒杀系统本质是一个高性能、高一致、高可…

TcpClient.Connect函数连接超时的问题(转载)

TcpClient.Connect函数连接超时的问题 问题原述&#xff1a; http://topic.csdn.net/t/20060616/15/4825920.html 调用TcpClient.Connect函数连接其他机器。我在一台机器上测试程序&#xff0c;对于连接根本无法连接&#xff08;物理连接不通&#xff09;的机器&#xff0c;该函…

Programming MS Office 2000 Web Components第二章第一节(第二部分)

排序和过滤 阅读本节时&#xff0c;如果您打开随书光盘Samples\Chap02目录下的SortFilterExample.htm文件。您会发现这个例子很有用。本节展示的代码和描述的特定环境来自这个文件。 电子表格组件支持Excel中的基础的排序和过滤功能&#xff0c;并且通过编程模型和用户界面来提…

309. Best Time to Buy and Sell Stock with Cooldown

1 题目理解 Say you have an array for which the ith element is the price of a given stock on day i. Design an algorithm to find the maximum profit. You may complete as many transactions as you like (ie, buy one and sell one share of the stock multiple tim…

第一百一十二期:96秒100亿!如何抗住双11高并发流量?

今年双 11 全民购物狂欢节进入第十一个年头&#xff0c;1 分 36 秒&#xff0c;交易额冲到 100 亿 !比 2018 年快了近 30 秒&#xff0c;比 2017 年快了近 1 分半!这个速度再次刷新天猫双 11 成交总额破 100 亿的纪录。 作者&#xff1a;邴越 今年双 11 全民购物狂欢节进入第…