一天一大 leet(计算右侧小于当前元素的个数)难度:困难-Day20200711
时间:2022-07-25
本文章向大家介绍一天一大 leet(计算右侧小于当前元素的个数)难度:困难-Day20200711,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
题目:
给定一个整数数组 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 个更小的元素.
抛砖引玉
暴力循环
- 声明一个存储结果的数组填充默认值 0
- 逆向遍历输入数字
- 对每个数组指定循环之后的数统计比其小的数字个数存储到存储结果的数组中
/**
* @param {number[]} nums
* @return {number[]}
*/
var countSmaller = function (nums) {
let len = nums.length,
_result = Array(len).fill(0)
for (let i = len - 1; i >= 0; i--) {
_result[i] = get_num(i, nums, nums[i])
}
function get_num(start, nums, n) {
let num = 0
if (start === nums.length - 1) return num
for (let i = start; i <= nums.length - 1; i++) {
if (nums[i] < n) num++
}
return num
}
return _result
}
不是吧?这样一道困难的题就完了?没那么简单,优化下吧
二分法查找
思路
上面的循环会发现i越小循环的次数越多,而且对右边一个数的比较越多 最后一位数需要参与len-1次比较
- 如果能记录每一个位置的依次小于它的数,循环时我们只要知道新加入在哪两个数之间就可以之间得到它的结果
- 查询一个数在哪两个数之间就演化成了排序的问题
- 在一个数组里面最快定位一个数的位置,最快为:数组有序,二分法 则,逻辑就变成了:从nums从右向左取出元素到新数组排序,并且记录每一个数的位置
实现
- 依次取出nums到一个新数字
- 新数组为排序数组
- 设取到nums[i],项新数组中插入时需要知道插入位置,插入位置即要求的右侧小于它的数
- 插入时数据越多循环查询位置的次数越多,优化循环,借助二分法的思路求要插入的数据在新数组中的插入位置
/**
* @param {number[]} nums
* @return {number[]}
*/
var countSmaller = function (nums) {
let len = nums.length
if (len == 0) return nums
let _result = Array(len).fill(0),
dp = [];
for (let i = len - 1; i >= 0; i--) {
// 计算位置
let index = findIndex(dp, nums[i])
// 插入数据
dp.splice(index, 0, nums[i])
// 记录索引
_result[i] = index
}
function findIndex(arr, target) {
let start = 0,
end = arr.length - 1;
while (start < end) {
let mid = parseInt((start + end) / 2,10)
if (arr[mid] < target) {
start = mid + 1;
} else {
end = mid;
}
}
if (arr[start] < target) return start + 1;
return start
}
return _result
}
- Java豆瓣电影爬虫——模拟登录的前世今生与验证码的爱恨情仇
- Java豆瓣电影爬虫——减少与数据库交互实现批量插入
- 谈谈C# 4.0新特性“缺省参数”的实现
- 如何实现对上下文(Context)数据的统一管理 [提供源代码下载]
- 不再和人工智能对弈?柯洁:我要食言了
- Spring实战——Profile
- Spring实战——XML和JavaConfig的混合配置
- ambari安装指南
- Spring实战——通过Java代码装配bean
- WCF技术剖析之三十一: WCF事务编程[中篇]
- Spring实战——无需一行xml配置实现自动化注入
- 基于改进人工蜂群算法的K均值聚类算法(附MATLAB版源代码)
- RabbitMQ入门-Routing直连模式
- WCF技术剖析之三十二:一步步创建一个完整的分布式事务应用
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 微服务下数据一致性的几种实现方式
- 关于mac electron设备权限申请的方法
- 两种实现方式 | 如何查看消费者组的消费情况
- 一致性hash算法(golang)
- 微服务安全吗?
- 掌握Rabbitmq几个重要概念,从一条消息说起
- 超赞!墙裂推荐一个 MySQL 自动化运维工具!
- 设计模式-责任链模式
- 问题 linux下执行.sh 文件出现 no such file or directoryile
- 问题:ssm关于mybatis没有找到配置问题(not found)
- 设计模式-享元模式
- 设计模式-代理模式
- win10 x64下从0开始搭建YApi可视化接口管理平台
- dubbo(一)SPI机制与实现路径
- Go 使用三方 Redis 包操作 Redis