首页 > 其他分享 >1365. 有多少小于当前数字的数字

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

时间:2024-11-17 18:41:01浏览次数:1  
标签:小于 cnt 数字 nums int ret vector vec 1365

题目

初看感觉蛮简单,但是实现过程中就犯迷糊了,主要是针对重复的元素不知道咋简单的写代码处理得到小于该重复数字的个数,然后看了卡哥的讲解,给了很好的思路:

img

这个思路和y总讲 01背包问题 的时候对二维dp优化为一维dp的思路大相径庭,很奇妙!

给出自己在看了卡哥思路后尝试写的代码:

class Solution {
public:
    vector<int> smallerNumbersThanCurrent(vector<int>& nums) {
        vector<int> ans, tmp;
        tmp = nums;
        int sn [110] = {};
        sort(nums.begin(), nums.end());
        for (int i = nums.size() - 1; i >= 0; i--)
            sn[nums[i]] = i;
        for (auto c : tmp)
            ans.push_back(sn[c]);
        return ans;
    }
};

也给出卡哥的代码:

class Solution {
public:
    vector<int> smallerNumbersThanCurrent(vector<int>& nums) {
        vector<int> vec = nums;
        sort(vec.begin(), vec.end()); // 从小到大排序之后,元素下标就是小于当前数字的数字
        int hash[101];
        for (int i = vec.size() - 1; i >= 0; i--) { // 从后向前,记录 vec[i] 对应的下标
            hash[vec[i]] = i;
        }
        // 此时hash里保存的每一个元素数值 对应的 小于这个数值的个数
        for (int i = 0; i < nums.size(); i++) {
            vec[i] = hash[nums[i]];
        }
        return vec;
    }
};

不过看了官方题解后,官方的方法三很妙:

img

代码如下:

class Solution {
public:
    vector<int> smallerNumbersThanCurrent(vector<int>& nums) {
        vector<int> cnt(101, 0);
        int n = nums.size();
        for (int i = 0; i < n; i++) {
            cnt[nums[i]]++;
        }
        for (int i = 1; i <= 100; i++) {
            cnt[i] += cnt[i - 1];
        }
        vector<int> ret;
        for (int i = 0; i < n; i++) {
            ret.push_back(nums[i] == 0 ? 0: cnt[nums[i]-1]);
        }
        return ret;
    }
};

这样做就不用排序了 (没有了sort(nums.begin(), nums.end());),而排序需要 O(NlogN) 的时间,所以时间复杂度改善了。

然后需要注意一定要写成ret.push_back(nums[i] == 0 ? 0: cnt[nums[i]-1]);而不能写成ret.push_back(cnt[nums[i]-1]);,为什么?

假设当nums[i]为0时,那么cnt[nums[i]-1]的写法就报错了(因为变成了cnt[-1])。

标签:小于,cnt,数字,nums,int,ret,vector,vec,1365
From: https://www.cnblogs.com/hisun9/p/18550895

相关文章

  • 基于Java+SSM+Vue数字乡村管理系统的设计与实现
    博主主页:一季春秋博主简介:专注Java技术领域和毕业设计项目实战、Java、微信小程序、安卓等技术开发,远程调试部署、代码讲解、文档指导、ppt制作等技术指导。主要内容:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、小程序、安卓app、大数据等设计与开发。感兴趣的可......
  • node.js毕设数字藏品系统(程序+论文)
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容一、选题背景关于数字藏品系统的研究,现有研究主要集中在综合性数字藏品平台的构建与运营上,专门针对校园这一特定环境下的数字藏品系统的研究较少。在国内外,数字藏品......
  • FMEA 与数字化技术的融合:提升效率与准确性之路
    【大家好,我是唐Sun,唐Sun的唐,唐Sun的Sun。】摘要: 本文旨在深入探讨如何将FMEA(失效模式及后果分析)与数字化技术,如大数据分析和智能制造系统相结合,以显著提高其效率和准确性。随着工业4.0时代的到来,数字化技术的飞速发展为传统的质量管理方法带来了新的机遇和挑战。通过整......
  • 知识库搭建:大健康供应链管理的数字化转型
    在当今快速发展的数字经济时代,大健康行业正经历着前所未有的变革。随着消费者对健康产品和服务需求的不断增长,大健康企业面临着提高供应链效率、降低成本、增强市场竞争力的多重挑战。在这个过程中,数字化工具如知识库、ERP系统、云计算平台等正成为推动大健康供应链管理向智......
  • CSP/信奥赛C++语法基础刷题训练(10):洛谷P1307:[NOIP2011 普及组] 数字反转
    CSP/信奥赛C++语法基础刷题训练(10):洛谷P1307:[NOIP2011普及组]数字反转题目描述给定一个整数NNN,请将该数各个位上数字反转得到一个新数。新数也应满足整数的常见形式,......
  • 2024-11-16:哈沙德数。用go语言,如果一个整数能够被它的各个数位上数字的和整除, 我们称
    2024-11-16:哈沙德数。用go语言,如果一个整数能够被它的各个数位上数字的和整除,我们称这个整数为哈沙德数(Harshadnumber)。给定一个整数x,如果x是哈沙德数,则返回x各个数位的数字和;如果不是,则返回-1。输入:x=18。输出:9。解释:x各个数位上的数字之和为9。18能被9......
  • Excel复制数字显示井号的解决方法
    Excel复制数字显示井号的解决方法在使用Excel编辑表格文件的过程中,许多用户可能会遇到这样的问题:粘贴的内容中出现了井号(#)。这些井号的出现不仅影响了数据的可读性,还可能让人误以为数据丢失或损坏。实际上,井号的出现通常是因为数字所在的单元格列宽不够大,导致数字无法完全......
  • 【一键整合包及教程】AI照片数字人工具EchoMimic技术解析
    在数字化时代,人工智能(AI)正以前所未有的速度改变着我们的生活。EchoMimic,作为蚂蚁集团旗下支付宝推出的开源项目,不仅为数字人技术的发展掀开了新的一页,更为娱乐、教育、虚拟现实、在线会议等多个领域带来了全新的可能性。EchoMimic技术概述EchoMimic是一款基于音频驱动的肖像......
  • 洛谷 P1365 WJMZBMR打osu! / Easy 做题记录
    设\(len\)表示当前的期望连击数,设\(ans\)为当前的答案,我们分类讨论来更新\(ans\):当现在打到了这个音符,那么\(ans\toans+(len+1)^2-len^2=ans+len\times2+1\)。当现在没打到这个音符,那么\(ans\)不变。当现在不知道打没打到,那么\(ans\toans+\frac{(len\times2......
  • SAP:引领企业数字化转型的先锋力量
    在当今快速变化的商业环境中,企业面临着前所未有的挑战和机遇。为了保持竞争力,实现可持续发展,越来越多的企业开始寻求数字化转型。SAP作为世界领先的企业应用软件解决方案提供商,凭借其强大的技术实力和丰富的行业经验,已经成为许多企业数字化转型的有力助手。一、SAP:企业数字化转型......