刷题日记:面试经典 150 题 DAY3

刷题日记:面试经典 150 题 DAY3

  • 274. H 指数
  • 238. 除自身以外数组的乘积
  • 380. O(1) 时间插入、删除和获取随机元素
  • 134. 加油站
  • 135. 分发糖果

274. H 指数

原题链接 274. H 指数

重要的是都明白H指数到底是是个啥。注意到如果将引用数从大到小排序,则对于下标i有 引用数 ≥ c i t a t i o n [ i ] 的论文有 i + 1 篇 引用数\geq citation[i]的论文有i+1篇 引用数citation[i]的论文有i+1,注意到此时引用数递减而文章数量递增,所求H指数就是求一个交点。

class Solution {
public:
    int hIndex(vector<int>& citations) {
        sort(citations.begin(), citations.end(),greater<int>());
        int i;
        for(i = 0;i<citations.size() && citations[i]>=(i+1);i++);
        return i;
    }
};

其实时间复杂度为 O ( N ) O(N) O(N)的算法更加符合直觉。我们创建一个新的数组count来记录,count[i]中存储引用数为i的文章有几篇,这里面重要的一步是将引用数大于等于n的篇数存储到count[n] 之中,这是因为对于本题来说,h指数不可能大于n,所以大于n篇数的分别计数就没有意义(该思想经常出现)

class Solution {
public:
    int hIndex(vector<int>& citations) {
        int n = citations.size();
        int count[n+1];
        memset(count,0,sizeof(count));
        for(int cite:citations) {
            if(cite >= n) {
                count[n]++;
            } else {
                count[cite]++;
            }
        }

        int sum = 0,i = 0;
        for(i = n; i>=0;i--) {
            sum += count[i];
            if(sum >= i) {
                break;
            }
        }
        return i;
    }
};

238. 除自身以外数组的乘积

原题链接 238. 除自身以外数组的乘积

题很简单,只需要注意到要处理0,可以分类讨论

  • 不存在0,则只需要算出整体乘积,然后除以当前数字
  • 存在一个0,则除了这个0外剩下位置都是0,该位置是所有其它数乘积
  • 存在两个及以上0,则全是0
class Solution {
public:
    vector<int> productExceptSelf(vector<int>& nums) {
        int count_0 = 0;
        int len = nums.size();
        int total = 1;
        for(int num:nums) {
            if(num == 0) count_0++;
            else total*=num;
        }

        vector<int> result(len,0);
        if(count_0 >= 2) {
            return result;
        }
        if(count_0 == 1) {
            for(int i = 0;i < len;i++) {
                if(nums[i] == 0) {
                    result[i] = total;
                }
            }
            return result;
        }
        for(int i = 0;i < len;i++) {
            result[i] = total/nums[i];
        }
        return result;
    }
};

380. O(1) 时间插入、删除和获取随机元素

原题链接 380. O(1) 时间插入、删除和获取随机元素

数据结构设计题,之前没试过这类题,自己做想到要用哈希(废话),但是感觉脑子不够用,遂去狠狠的学习了【宫水三叶】数据结构运用题

class RandomizedSet {
private:
    unordered_map<int,int> hashmap;
    int nums[200010];
    int idx;
public:
    RandomizedSet() {
        srand((unsigned)time(NULL));
        idx = -1;
    }
    
    bool insert(int val) {
        if(hashmap.count(val) > 0) {
            return false;
        }
        nums[++idx]  = val;
        hashmap[val] = idx;
        return true;
    }
    
    bool remove(int val) {
        if(hashmap.count(val) == 0) {
            return false;
        }
        int tail = nums[idx];
        int rm_idx = hashmap[val];
        swap(nums[rm_idx],nums[idx]);

        hashmap.erase(val);
        if(val != tail) hashmap[tail] = rm_idx;
        idx--;
        return true;
    }
    
    int getRandom() {
        int random_i = rand() % (idx+1);
        return nums[random_i];
    }
};

/**
 * Your RandomizedSet object will be instantiated and called as such:
 * RandomizedSet* obj = new RandomizedSet();
 * bool param_1 = obj->insert(val);
 * bool param_2 = obj->remove(val);
 * int param_3 = obj->getRandom();
 */

结构:

  • 一个定长数组用于存储元素,维护一个idx,表示在数组的[0...idx]中存储着元素
  • 一个哈希表,存储键值对(val,idx),即元素和其所在的下标

插入

  • 直接向哈希表和数组的末尾插入

删除

  • 对哈希表的操作:直接删除其键值对
  • 对数组的操作:将要删除的量交换到最后,然后让idx减去1(经常用到),此时需要再更新哈希表。将key为原数组尾的值改成交换后的下标

134. 加油站

原题链接 134. 加油站

朴素的想法是,我只需要模拟开车的过程,并一个一个尝试哪一个加油站可以作为起点就可以。但是这个方法复杂度有 O ( N 2 ) O(N^2) O(N2)
能在 O ( N ) O(N) O(N)内做出来的方法基于以下重要观察:

  • 如果从 i i i出发能到达 j j j而无法到达 j + 1 j+1 j+1,则从任何的 k ∈ [ i , j ] k \in[i,j] k[i,j]出发都不可能到达 j + 1 j+1 j+1,也就是任何的 k ∈ [ i , j ] k \in [i,j] k[i,j]都不可能作为起点,所以我们直接从 j + 1 j+1 j+1开始检查即可
    • 这是因为到达 k k k时汽车至少有非负的汽油,一定不低于从 k k k出发的汽油

所以我们能在每个元素至多被遍历两遍内获得答案

class Solution {
public:
    int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
        int len = gas.size();
        int i = 0;
        while(i < len) {
            int cargas = 0;
            int cnt;
            for(cnt = 0;cnt < len;cnt++) {
                int j = (i+cnt)%len;
                cargas += gas[j]-cost[j];
                if(cargas < 0) {
                    break;
                }
            }
            if(cnt == len) {
                return i;
            } else {
                i += cnt+1;
            }
        }
        return -1;
    }
};

135. 分发糖果

原题链接 135. 分发糖果

第一遍做想到一个比较符合直觉的想法:考虑两种打分的分布,分别是:递增,递减

在这里插入图片描述

这样分糖果的策略很简单,就是在单调列中,这个孩子是打分第几低,我就给他几个糖果
实际打分的分布可以看作是多个递增递减列的组合

在这里插入图片描述

此时仅需要考虑中间那个孩子需要多少糖果即可,很简单能想到应该是max(left,right)
最后写成代码:

class Solution {
public:
    int candy(vector<int>& ratings) {
        int len = ratings.size();
        vector<int> uplift(len,0);
        vector<int> downlift(len,0);
        int cd = 0;
        for(int i = 1;i < len;i++){
            if(ratings[i]>ratings[i-1]) {
                cd++;
            } else  {
                cd = 0;
            }
            uplift[i] = cd;
        }
        cd = 0;
        for(int i = len-2;i >= 0;i--){
            if(ratings[i]>ratings[i+1]) {
                cd++;
            } else {
                cd = 0;
            }
            downlift[i] = cd;
        }
        cd = len;
        for(int i = 0;i < len;i++){
            cd += max(uplift[i],downlift[i]);
        }
        return cd;
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/428025.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

每日一题-移除链表元素

&#x1f308;个人主页: 会编辑的果子君 &#x1f4ab;个人格言:“成为自己未来的主人~” 移除链表元素 以上是题目名称&#xff1a; typedef struct ListNode SListNode; struct ListNode* removeElements(struct ListNode* head, int val) {SListNode*newHead,*newTail;ne…

Matlab 机器人工具箱 例程:运动学+动力学+路径规划+可视化

文章目录 1 创建机器人2 机器人显示3 机器人示教4 机器人路径规划&#xff1a;给定关节角路径5 机器人路径规划&#xff1a;给定末端位姿&#xff0c;求关节角路径6 工作空间可视化参考链接 1 创建机器人 clc;clear;close all; deg pi/180;L1 Revolute(d, 0, a, 0, alpha, 0,…

分账系统哪个好 盘点2024年好用的四款分账系统

分账系统在现代商业活动中扮演着至关重要的角色&#xff0c;为企业提供了高效、准确的分账管理。那么&#xff0c;你知道2024年哪几款分账系统最好用呢&#xff1f;跟着小编的脚步去看看吧&#xff01; 一、商淘云 商淘云是广州商淘信息科技有限公司旗下品牌&#xff0c;它提…

CBA全明星急需改革但先不谈!不如先学学如何尊重球迷

直播吧指定地址&#xff1a;www.bjcenn.com 3月4日讯 昨晚CBA全明星正赛&#xff0c;南区明星队138-122击败北区明星队。 媒体人三土带刺更博长文总结了本次全明星&#xff0c;原文如下&#xff1a; 如何总结这次全明星&#xff1f; 又一届CBA全明星周末结束&#xff0c;关…

OSPF多进程

路由器——>选路——>参考路由表 路由表的生成&#xff1a; 直连路由直接加入 静态路由 动态路由&#xff0c;ospf&#xff1a;选择最优加入 IGP高级特性---OSPF多进程防火墙虚拟系统引流 http://t.csdnimg.cn/mTU3nhttp://t.csdnimg.cn/mTU3n 华为文档地址&#…

骨传导耳机哪个牌子好?简单6招教你选到高品质机型!

作为一名有着十几年工作经验的资深数码产品测评师&#xff0c;多年来见过太多因为选购劣质骨传导耳机而踩雷的情况&#xff0c;对此&#xff0c;我想要提醒大家的是&#xff0c;在选择骨传导耳机时不要一味地追求外观颜值、品牌知名度&#xff0c;而应该更加重视产品的专业技术…

刷题日记:面试经典 150 题 DAY4

刷题日记&#xff1a;面试经典 150 题 DAY4 42.接雨水13.罗马数字转整数12.整数转罗马数字58.最后一个单词长度14.最长公共前缀 42.接雨水 原题链接 42.接雨水 在学校的算法小学期做过&#xff0c;做法是基于一个重要的观察&#xff1a; 一列列的看&#xff0c;当前列雨水的高…

一线大厂软件测试面试题及答案解析,2024最强版...

【软件测试面试突击班】2024吃透软件测试面试最全八股文攻略教程&#xff0c;一周学完让你面试通过率提高90%&#xff01;&#xff08;自动化测试&#xff09; 1、什么是兼容性测试?兼容性测试侧重哪些方面? 参考答案: 兼容测试主要是检查软件在不同的硬件平台、软件平台上…

Java多线程——如何控制线程顺序执行,如何控制线程同时执行

目录 引出如何控制线程执行顺序&#xff1f;多个线程在某一时刻同时开始执行&#xff1f; Redis冲冲冲——缓存三兄弟&#xff1a;缓存击穿、穿透、雪崩缓存击穿缓存穿透缓存雪崩 总结 引出 Java多线程——如何控制线程顺序执行&#xff0c;如何控制线程同时执行 如何控制线程…

leetcode日记(36)全排列

想思路想了很久……思路对了应该会很好做。 我的思路是这样的&#xff1a;只变化前n个数字&#xff0c;不断增加n&#xff0c;由2到nums.size()&#xff0c;使用递归直到得到所有结果 代码如下&#xff1a; class Solution { public:vector<vector<int>> permut…

枚举——完美立方算法

枚举 基于逐个尝试答案的一种问题求解策略 例如&#xff1a;求小于N的最大素数 找不到一个数学公式&#xff0c;使得根据N就可以计算出这个素数 N-1是素数吗&#xff1f;N-2是素数吗&#xff1f; …… 判断N-i是否是素数的问题 转化成求小于N的全部素数&#xff08;可以用筛法…

Linux:ansible-playbook配置文件(剧本)(进阶)

Linux&#xff1a;ansible-playbook配置文件&#xff08;剧本&#xff09;_ansible-playbook -i参数-CSDN博客https://blog.csdn.net/w14768855/article/details/132579492?ops_request_misc%257B%2522request%255Fid%2522%253A%2522170930036016800215061982%2522%252C%2522s…

flutter学习(一) 安装以及配置环境

首先需要下载flutter&#xff0c;然后解压 然后配置环境变量&#xff0c;配置到bin目录就行 然后在用户变量里再配置一下&#xff08;不配置后来你就知道有多重要了&#xff09; PUB_HOSTED_URL https://pub.flutter-io.cn FLUTTER_STORAGE_BASE_URL https://storage.flut…

【CesiumJS-3】加载倾斜模型数据(3DTilest)以及修改位置

引入倾斜模型数据 // 加载3DTiles数据let tileset;try {tileset await Cesium.Cesium3DTileset.fromUrl("/api/3DTiles/b3dm_qx/tileset.json");viewer.value.scene.primitives.add(tileset); // 倾斜模型添加到场景中viewer.value.zoomTo(tileset); // 视角定位到倾…

Nano 33 BLE Sense Rev2学习第一节——环境配置

参考文档见Access Barometric Pressure Sensor Data on Nano 33 BLE Sense | Arduino Documentation 打开Arduino ide安装开发板 选择开发板 连接开发板到电脑&#xff0c;自动识别开发板端口&#xff0c;选择端口

鸿蒙Harmony应用开发—ArkTS声明式开发(通用属性:图像效果)

设置组件的模糊、阴影、球面效果以及设置图片的图像效果。 说明&#xff1a; 从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 blur blur(value: number, options?: BlurOptions) 为组件添加内容模糊效果。 卡片能力&am…

电脑提示d3dcompiler_43.dll丢失的解决方法分享,教你4种方法修复

在电脑使用过程中&#xff0c;你可能遇到一个报错通知&#xff0c;系统提示你d3dcompiler_43.dll文件缺失。那么&#xff0c;什么是d3dcompiler_43.dll文件&#xff1f;它有什么作用&#xff1f;如何修复文件缺失的问题呢&#xff1f;本文将为你详细解答&#xff0c;我们会给大…

网络安全知识入门:Web应用防火墙是什么?

在互联网时代&#xff0c;网络安全问题逐渐受到重视&#xff0c;防火墙的配置也是非常必要的。它是位于内部网和外部网之间的屏障&#xff0c;更是系统的第一道防线。Web应用防火墙是什么&#xff0c;如何才能更好地保护Web应用&#xff0c;这篇文章会从应用安全为出发点&#…

【VTKExamples::PolyData】第四十五期 QuantizePolyDataPoints

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 前言 本文分享VTK样例QuantizePolyDataPoints,并解析接口vtkQuantizePolyDataPoints,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步! 你的点赞就是我的动力(^U^)ノ~Y…

原牛角源码(修罗bbs)全站程序打包带数据库备份

原牛角源码(修罗bbs)全站程序打包带数据库备份&#xff0c;牛角源码全站数据全站文件、插件打包分享给大家&#xff0c;有兴趣的可以搭建玩玩 源码下载地址专业知识分享社区-专业知识笔记免费分享 (chaobiji.cn)