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

【问题描述】[中等]

在这里插入图片描述

【解答思路】

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-/

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

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

相关文章

61setproperty对象

建立一个users类 package srever;public class Users {private String username;private String password;public Users() {}public String getUsername() {return username;}public void setUsername(String username) {this.username username;}public String getPassword(…

关于sin的导数的证明

引自JetTangs的博客 几何证明: AC切圆O于C AO交圆O于B CD、OF为水平线 BF为垂直线 令∠EOF θ 求证sinθ的导数为cosθ 证: 设∠AOC的角度为x, 由弦切角定理可知∠ACB 12x 而且∠ECDθ 则∠BCD 90-θ-12x 于是 limx→0sin(90−θ−12x)cosθ意思就是 当x无限接近于…

62 getproperty对象

定义一个login的jsp <% page language"java" import"java.util.*" contentType"text/html; charsetutf-8"%><!DOCTYPE html> <html> <head> <meta charset"ISO-8859-1"> <title>Insert title he…

Python网络爬虫之图片懒加载技术、selenium和PhantomJS

引入 今日概要 图片懒加载seleniumphantomJs谷歌无头浏览器知识点回顾 验证码处理流程今日详情 动态数据加载处理 一.图片懒加载 什么是图片懒加载&#xff1f; 案例分析&#xff1a;抓取站长素材http://sc.chinaz.com/中的图片数据 #!/usr/bin/env python # -*- coding:utf-8 …

[Leetcode][第题][JAVA][两个数组的交集 II1][双指针][HashMap]

【问题描述】[中等] 【解答思路】 1. 哈希映射 复杂度分析 class Solution {public int[] intersect(int[] nums1, int[] nums2) {if (nums1.length > nums2.length) {return intersect(nums2, nums1);}Map<Integer, Integer> map new HashMap<Integer, Intege…

63 javabean的作用域范围

定义一个users类 package srever;public class Users {private String username;private String password;public Users() {}public String getUsername() {return username;}public void setUsername(String username) {this.username username;}public String getPassword(…

【Immutable】拷贝与JSON.parse(JSON.stringify()),深度比较相等与underscore.isEqual(),性能比较...

样本&#xff1a;1MB的JSON文件&#xff0c;引入后生成500份的一个数组&#xff1b; 结果如下&#xff1a; 拷贝性能&#xff1a; JSON.parse(JSON.stringify()) 的方法&#xff1a;2523.55517578125ms immutable.fromJs: 1295.159912109375ms 快了一倍 深度比较性能&#xff1…

65 modol1用户登录

定义一个Users类 package srever;public class Users {private String username;private String password;public String getUsername() {return username;}public void setUsername(String username) {this.username username;}public String getPassword() {return passwor…

[剑指offer]面试题第[58-2]题[JAVA][左旋转字符串][拼接]

【问题描述】[中等] 【解答思路】 1. 字符串切片 应用字符串切片函数&#xff0c;可方便实现左旋转字符串。 时间复杂度&#xff1a;O(N) 空间复杂度&#xff1a;O(N) public String reverseLeftWords(String s, int n) {return s.substring(n, s.length()) s.substring(0,…

[剑指offer]面试题第[59-1]题[Leetcode][第239题][JAVA][滑动窗口的最大值][单调队列][优先队列]

【问题描述】[困难] 【解答思路】 1. 暴力 两层 for 循环&#xff0c;每次都从窗口中找最大值即可 时间复杂度&#xff1a;O(N^2) 空间复杂度&#xff1a;O(N) public int[] maxSlidingWindow(int[] nums, int k) {int n nums.length;if (n 0) {return nums;}int result[]…

视图高级

目标 限制请求method页面重定向HttpRequest 对象HttpResponse 对象生产CVS 文件类视图错误处理一 限制请求method 1-1 常用的请求method 1. GET请求&#xff1a;GET请求一般用来向服务器索取数据&#xff0c;但不会向服务器提交数据&#xff0c;不会对服务器的状态进行更改。比…

68 cookie在登录中的作用

定义一个login.jsp页面 <% page language"java" import"java.util.*,java.net.*" contentType"text/html; charsetutf-8"%> <% String path request.getContextPath(); String basePath request.getScheme()"://"request.…

69 session和cookie的区别

这些都是基础知识&#xff0c;不过有必要做深入了解。先简单介绍一下。 二者的定义&#xff1a; 当你在浏览网站的时候&#xff0c;WEB 服务器会先送一小小资料放在你的计算机上&#xff0c;Cookie 会帮你在网站上所打的文字或是一些选择&#xff0c;都纪录下来。当下次你再光…

[Leetcode][第120题][JAVA][三角形最小路径和][动态规划][递归]

【问题描述】[中等] 【解答思路】 1. 动态规划思路一 自上而下 第 1 步&#xff1a;设计状态 f[i][j] 表示从三角形顶部走到位置 (i,j) 的最小路径和 位置(i,j) 指的是三角形中第 i 行第 j 列&#xff08;均从 00 开始编号&#xff09;的位置 第 2 步&#xff1a;状态转移方程…

70 include指令

定义一个date的jsp <% page language"java" contentType"text/html; charsetUTF-8"pageEncoding"UTF-8"%> <p>今天的日期是: <% (new java.util.Date()).toLocaleString()%> </p> 定义一个dateFile的jsp <% page …

71 include动作

定义一个date页面 <% page language"java" contentType"text/html; charsetUTF-8"pageEncoding"UTF-8"%> <p>今天的日期是: <% (new java.util.Date()).toLocaleString()%> </p> 定义一个dateFile <% page langua…

[剑指offer]面试题第[59-2]题[JAVA][队列的最大值][暴力][双端队列]

【问题描述】[中等] 【解答思路】 1. 暴力 复杂度分析 class MaxQueue {Queue<Integer> queue new LinkedList();int maxValue;public MaxQueue() {queue new LinkedList();}public int max_value() {if(queue.isEmpty()) return -1;return maxValue;}public void …