leetcode 1365——有多少小于当前数字的数字

114 阅读1分钟

给你一个数组 nums,对于其中每个元素 nums[i],请你统计数组中比它小的所有数字的数目。

换而言之,对于每个 nums[i] 你必须计算出有效的 j 的数量,其中 j 满足 j != inums[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]

提示:

  • 2 <= nums.length <= 500
  • 0 <= nums[i] <= 100

来源:力扣(LeetCode) 链接:leetcode.cn/problems/ho…

解题思路1:两层for循环暴力搜索

var smallerNumbersThanCurrent = function (nums) {
    let res = [];
    for (let i = 0; i < nums.length; i++) {
        let n = 0;
        for (let j = 0; j < nums.length; j++) {
            if (nums[i] > nums[j]) {
                n++;
            }
        }
        res[i] = n;
    }
    return res
};

解题思路2: 新开辟一个排序数组 —— 关键怎么将排好序的数组与原nums数组对应起来。

  • 新建一个数组arr,将数组nums深拷贝到arr中
  • 将arr排序,此时得到排好序的arr数组
  • 当没有重复元素时,元素的下标即所求的小于当前数字的数字,有重复元素时,取第一个出现的重复元素的下标 —— 可以使用indexOf(只返回找到的第一个元素的下标)
var smallerNumbersThanCurrent = function (nums) {
    let arr = [...nums];//将nums数组深拷贝
    // 将数组从小到大排序
    arr = arr.sort((a, b) => a - b)
    let res = [];
    nums.forEach(item => {
        res.push(arr.indexOf(item))
    })
    return res
};