刷题日记:面试经典 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;}
};

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

考研复试指南

1. 记住&#xff0c;复试的本质不是考试&#xff0c;而是一场自我展示。 考研复试并非简单的知识考察&#xff0c;更是一场展示自我能力和潜力的机会。除了学科知识&#xff0c;考官更关注你的综合素质、学术兴趣和未来发展规划。因此&#xff0c;要保持自信&#xff0c;用更全…

机器学习模型总结

多元线性回归&#xff08;linear regression&#xff09; 自变量&#xff1a;连续型数据&#xff0c;因变量&#xff1a;连续型数据 选自&#xff1a;周志华老师《机器学习》P53-55 思想&#xff1a;残差平方和达到最小时的关系式子即为所求&#xff0c;残差平方和&#xff1a…

uniapp 部署h5,pdf预览

1.hubuilderx 打包h5。 2.上传部署包到服务器。 解压部署包&#xff1a;unzip h5.zip 。 3.nginx配置。 user root; worker_processes 1; #worker_cpu_affinity 0001 0010 0100 1000; #error_log logs/error.log; #error_log logs/error.log notice; error_log /var/l…

抖店怎么入驻?具体的入驻流程是什么?新手一看就会!

我是电商珠珠 新的一年开始了&#xff0c;又有不少新手小伙伴入驻了抖店。我做电商已经五年了&#xff0c;做抖店做了三年多&#xff0c;期间带着学员一起做店。所以对于他们所犯的这些操作错误&#xff0c;相信部分新手小伙伴也会犯错&#xff0c;为了让大家少走点弯路&#…

便携式气象站的工作原理

TH-BQX8便携式气象站是一种轻便、易于携带的气象监测设备&#xff0c;它能够快速部署在需要监测的区域&#xff0c;实时监测和记录气象环境数据。与全自动气象监测站相比&#xff0c;便携式气象站更加注重移动性和灵活性&#xff0c;适用于临时性的气象监测任务或特定区域的气象…

【大厂AI课学习笔记NO.58】(11)混淆矩阵

混淆矩阵&#xff08;confusion matrix&#xff09;—— 混淆矩阵&#xff08;Confusion Matrix&#xff09;是人工智能领域&#xff0c;特别是在机器学习和深度学习中&#xff0c;用于衡量分类模型性能的重要工具。它通过统计分类模型的真实分类与预测分类之间的结果&#xf…

12. Nginx进阶-Location

简介 Nginx的三大区块 在Nginx中主要配置包括三个区块&#xff0c;结构如下&#xff1a; http { #协议级别include /etc/nginx/mime.types;default_type application/octet-stream;log_format main $remote_addr - $remote_user [$time_local] "$r…

javascript中对包含关系判断介绍

本文将为您详细讲解 JavaScript 中对包含关系的判断&#xff0c;包括数组、字符串等&#xff0c;并提供相应的代码例子。 1. 数组包含关系判断 在 JavaScript 中&#xff0c;数组包含关系判断通常使用 Array.prototype.includes() 方法。这个方法返回一个布尔值&#xff0c;表示…

辽宁博学优晨教育视频:引领安全可靠的学习新风尚

在数字化时代&#xff0c;随着信息技术的飞速发展&#xff0c;线上教育已成为越来越多人提升自我、拓宽视野的重要选择。辽宁博学优晨教育视频凭借其安全可靠的特质&#xff0c;在众多在线教育平台中脱颖而出&#xff0c;成为广大学子信赖的学习伙伴。 一、辽宁博学优晨教育视频…

Docker创建Reids容器

1.默认拉取Redis最新镜像版本 docker pull redis 2.下载redis配置文件 https://download.redis.io/releases/ 3.下载配置文件后手动更改密码&#xff0c;链接时间等信息 绑定地址&#xff08;bind&#xff09;&#xff1a;默认情况下&#xff0c;Redis 只会监听 localhost…

【MySQL 系列】在 Windows 上安装 MySQL

在 Windows 平台上安装 MySQL 很简单&#xff0c;并不需要太复杂的步骤。按照本文的步骤操练起来就可以了。 文章目录 1、下载 MySQL 安装程序2、安装 MySQL 数据库2.1、选择安装类型2.2、检查所需组件2.3、安装所选产品组件2.4、产品配置2.5、配置高可用性2.6、配置服务器类型…

【Boost搜索引擎项目】Day1 项目介绍+去标签和数据清洗框架搭建

&#x1f308;欢迎来到C项目专栏 &#x1f64b;&#x1f3fe;‍♀️作者介绍&#xff1a;前PLA队员 目前是一名普通本科大三的软件工程专业学生 &#x1f30f;IP坐标&#xff1a;湖北武汉 &#x1f349; 目前技术栈&#xff1a;C/C、Linux系统编程、计算机网络、数据结构、Mysq…