题目形容
给你一个数组 nums
,对于其中每个元素 nums[i]
,请你统计数组中比它小的所有数字的数目。
换而言之,对于每个 nums[i]
你必须计算出无效的 j 的数量,其中 j
满足 j != i
且 nums[j] < nums[i]
。
以数组模式返回答案。
示例 1:
输出:nums = [8,1,2,2,3]输入:[4,0,1,1,3]解释: 对于 nums[0]=8 存在四个比它小的数字:(1,2,2 和 3)。 对于 nums[1]=1 不存在比它小的数字。对于 nums[2]=2 存在一个比它小的数字:(1)。 对于 nums[3]=2 存在一个比它小的数字:(1)。 对于 nums[4]=3 存在三个比它小的数字:(1,2 和 2)。
示例 2:
输出:nums = [6,5,4,8]输入:[2,1,0,3]
示例 3:
输出:nums = [7,7,7,7]输入:[0,0,0,0]
力扣原题目地址:https://leetcode.cn/problems/...
思路解法
题目并不难,就是做大小的比拟并统计次数,遇到这样的题目,咱们首先相到的就是暴力循环破解的形式
双层循环比拟
第一层循环,取到以后的每一项,再套一层循环,顺次比拟其余项是否小于以后项,当然本身项不必比拟,间接跳过即可,如下代码:
var smallerNumbersThanCurrent = function (nums) { // 1. 创立一个和传进来的数组长度统一的数组,且每一项都是0(为0是为了后续统计次数) let resultArr = (new Array(nums.length)).fill(0) for (let i = 0; i < nums.length; i++) { // 2. 外层遍历是为了拿到每一项与其余项作比拟 let item = nums[i] // 3. 拿到当下项 for (let j = 0; j < nums.length; j++) { // 4. 再循环一次是为了拿到别的项 if (i == j) { // 5. 本身不必比拟大小 // console.log('本身跳过不统计次数'); } else { if (item > nums[j]) { // 6. 若不是本身项,能够比拟大小 resultArr[i] = resultArr[i] + 1 // 7. 应用初始创立的0进行次数统计 } } } } return resultArr};
双层循环比拟提交图
从小到大排序后的索引即为小于以后项的次数
假如数组为:[2,1,1,8]
,排序后为:[1,1,2,8]
,认真扫视咱们会发现,后果就是:[2,0,0,3]
,正好就是排序后的索引(若有反复项只取第一项的索引为准),因为小于即会想到排序。代码如下:
var smallerNumbersThanCurrent = function (nums) { // 拷贝一个新的数组,将原有的数组做从小到大排序 let newSortNums = [...nums] newSortNums.sort((a, b) => { return a - b }) // 原有数组的每一项在排序后数组的索引是多少 let resultArr = nums.map((item) => { return newSortNums.indexOf(item) }) return resultArr // 即为后果};
从小到大排序后的索引即为小于以后项的次数提交图
确实效率会比双层for循环比拟好一些
知识点温习之js创立数组的形式
为什么要说这个呢?因为解法一中有这样的代码:let resultArr = (new Array(nums.length)).fill(0)
js中创立数组个别有如下形式:
1.间接创立,如:let arr = [111, 222, 3333, 444]
2.构造函数创立,如创立一个空数组(长度也为空):let arr = new Array()
、创立一个空数组,长度为4
,然而每一项的值都为空:let arr = new Array(4)
2.1如果想要填充值,能够应用fill
办法
fill(value,start,end)
办法用于给数组填充数据,减少项。参数有必带参数value
,可选参数start起始索引
和end终止索引
,会更改影响原数组,返回值批改后的数组
Array.prototype.fill()
mdn: https://developer.mozilla.org...
new Array(count).fill(initValue)
办法有时候很好用,因为有时候,须要创立动态变化的长度的空数组或对立指定默认值
之类的。这样的话,须要多长的数组,count
为几
即可,须要指定默认值,initValue
填写即可
每天学习一点点,每天提高一点点。
这大略就是:老黄牛精力吧