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

2023.9.2

本题直观的解法就是双层for循环暴力求解:

暴力解:

cpp 复制代码
class Solution {
public:
    vector<int> smallerNumbersThanCurrent(vector<int>& nums) {
        vector<int> ans;
        for(int i=0; i<nums.size(); i++)
        {
            int temp = 0;//比当前元素小的元素个数
            for(int j=0; j<nums.size(); j++)
            {
                if(nums[j] < nums[i]) temp++;
            }
            ans.push_back(temp);
        }
        return ans;
    }
};

上述解法中,元素之间进行了重复比较,可以进行优化:

暴力解(优化版):

cpp 复制代码
class Solution {
public:
    vector<int> smallerNumbersThanCurrent(vector<int>& nums) {
        vector<int> ans(nums.size());
        for(int i=0; i<nums.size(); i++)
        {
            for(int j=i+1; j<nums.size(); j++)
            {
                if(nums[j] < nums[i]) ans[i]++;
                else if(nums[j] > nums[i]) ans[j]++;
            }
        }
        return ans;
    }
};

由于题中nums[i]给的范围是0~100,因此还可以以空间换时间,进一步优化:

哈希法:

cpp 复制代码
class Solution {
public:
    vector<int> smallerNumbersThanCurrent(vector<int>& nums) {
        vector<int> v(nums.begin(),nums.end());
        sort(v.begin(),v.end()); //排序之后,元素下标就是小于当前元素的个数
        int hash[101];

        for(int i=0; i<v.size(); i++)
        {
            if(i>0 && v[i]==v[i-1]) continue;
            hash[v[i]] = i;
        }

        for(int i=0; i<nums.size(); i++)
        {
            nums[i] = hash[nums[i]];
        }
        return nums;
    }
};
相关推荐
Chris _data6 分钟前
二叉树oj题解析
java·数据结构
დ旧言~18 分钟前
【高阶数据结构】图论
算法·深度优先·广度优先·宽度优先·推荐算法
我们的五年22 分钟前
【Linux课程学习】:进程描述---PCB(Process Control Block)
linux·运维·c++
张彦峰ZYF22 分钟前
投资策略规划最优决策分析
分布式·算法·金融
The_Ticker38 分钟前
CFD平台如何接入实时行情源
java·大数据·数据库·人工智能·算法·区块链·软件工程
程序猿阿伟38 分钟前
《C++ 实现区块链:区块时间戳的存储与验证机制解析》
开发语言·c++·区块链
Lenyiin1 小时前
02.06、回文链表
数据结构·leetcode·链表
爪哇学长1 小时前
双指针算法详解:原理、应用场景及代码示例
java·数据结构·算法
爱摸鱼的孔乙己1 小时前
【数据结构】链表(leetcode)
c语言·数据结构·c++·链表·csdn
Dola_Pan1 小时前
C语言:数组转换指针的时机
c语言·开发语言·算法