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;
    }
};

由于题中numsi给的范围是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;
    }
};
相关推荐
yi0113 分钟前
DAY17: LeetCode 139|单词拆分:从“把单词删掉”到用 DP 记录合法切口
人工智能·笔记·python·算法·leetcode·动态规划
陈希瑞15 分钟前
LongCat-2.5-Preview 的web逆向能力实测
人工智能·算法·wasm
垆边人似月.38 分钟前
华为机考题:二叉树的最大路径和
c语言·c++
2601_962218611 小时前
深入理解C++中的thread_local线程局部变量的应用
开发语言·c++
无名猿1 小时前
C++ lambda 捕获列表详解:值捕获、引用捕获、初始化捕获与悬垂引用
c++·现代c++·语法基础·踩坑记录
雾喔1 小时前
近日总结 & 面试经验
面试·职场和发展
tangguofeng2 小时前
基于分治策略的循环赛日程表问题的思路讲解
算法
hnjzsyjyj2 小时前
洛谷 P1339:[USACO09OCT] Heat Wave G ← Bellman-Ford 算法
数据结构·bellman-ford 算法
起个名字费劲死了2 小时前
VisionMaster集成深度学习算法(基础狗)
人工智能·深度学习·算法
lengxuenong2 小时前
枚举例题分析
c++·算法·青少年编程