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;
    }
};
相关推荐
怎么没有名字注册了啊1 天前
(Mac)Visual Studio Code 配置 C/C++运行环境
c++·vscode·macos
wa的一声哭了1 天前
内积空间 正交与正交系
java·c++·线性代数·算法·矩阵·eclipse·云计算
SWAGGY..1 天前
数据结构学习篇(8)---二叉树
数据结构·学习·算法
西幻凌云1 天前
认识设计模式——工厂模式
c++·设计模式·简单工厂模式·抽象工厂模式·工厂模式
星轨初途1 天前
牛客小白月赛126
开发语言·c++·经验分享·笔记·算法
leoufung1 天前
动态规划DP 自我提问模板
算法·动态规划
fqbqrr1 天前
2601,链式调用
c++
爱编程的小吴1 天前
【力扣练习题】热题100道【哈希】560. 和为 K 的子数组
算法·leetcode·哈希算法
じ☆冷颜〃1 天前
基于多数据结构融合的密码学性能增强框架
数据结构·经验分享·笔记·python·密码学
Swift社区1 天前
LeetCode 463 - 岛屿的周长
算法·leetcode·职场和发展