LeetCode刷题记录(十八):有多少小于当前数字的数字

120 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第18天,点击查看活动详情

有多少小于当前数字的数字

题目如下图所示,也可以在LeetCode题目中找到此题。

image.png

题目解析

题目提供素材

根据题目描述来看,只提供了一个素材:

  1. 一个整型数组nums。

注:数组长度在2到500之间,并且其中的元素在0到100之间。

我的解读

我对这道题的看法,从读完题目满脑子就只有一个念头,那就是双重循环遍历比对。

本道题的预期结果是统计出数组中各个数字比起其他数字元素大的数字个数。

正常的思路就是一一获取出每个值,然后再去循环数组中的其他值进行一一比对,最后计算出总和,放入结果数组中。

很暴力美学,我就是使用的这个方法。

解题思路

一,先声明一个结果数组,因为统计的是每个元素数字;所以最后的结果数组长度也是和提供的数组长度一致的。

二,接着循环提供的数组nums。

三,获取出其中一个值,循环比对大小。

四,获取到总和,放入结果数组中。

代码

具体的代码如下:

class Solution {
    public int[] smallerNumbersThanCurrent(int[] nums) {
        int[] result = new int[nums.length];
        for(int i = 0; i < nums.length; i++){
            int count = 0;
            for(int j = 0; j < nums.length; j++){
                if(nums[i] > nums[j]){
                    count++;
                }
            }
            result[i] = count;
        }
        return result;
    }
}

更好的方式

官方题解中给出了另外一种方式,就是排序方式。

大概是这样的一个思路:

先排序,并且保存下原始元素的位置,便于统计完成之后给结果数组还原排序。

排好序之后,就不用再去一一对比了,只需要对比与下一个元素的大小即可知道总数目了。

具体代码我就不贴了,大家自己去看看吧。

执行结果

思路没错,但是效率确实不高,执行效率是真低。

image.png