LeetCode刷题——贪心法(C/C++)

这里写目录标题

  • [中等]买卖股票的最佳时机 II
  • [中等]移掉k位数字
  • [中等]跳跃游戏
  • [中等]跳跃游戏 II
  • [中等]加油站
  • [中等]划分字母区间
  • [中等]去除重复字母
  • [中等]无重叠区间
  • [中等]用最少数量的箭引爆气球

[中等]买卖股票的最佳时机 II

  • 原题链接
  • 题解
    最简单的思路,效率不高,只要明天的股价大于今天的,就把这个差值算上,(因为允许你当天卖当天买)只要有正的差额,都不放过。(现实中炒股也这么美好就好了)
class Solution {
public:int maxProfit(vector<int>& prices) {int maxn = 0;for(int i=0;i<prices.size()-1;i++){if(prices[i]<prices[i+1]) maxn += prices[i+1]-prices[i]; }return maxn;}
};

[中等]移掉k位数字

  • 原题链接
  • 题解
    主要思路就是在入栈的时候,如果当前元素比栈顶元素小,并且还没有删到k个数,就将栈顶元素出栈,这题的判断条件很繁杂,前导0我就判断了两次,先是在字符入栈的时候就判断一次,最后转化成字符串输出时又要再算一次

在思路正确的情况下,最后一个用例一直过不去,超时,然后就想到问问chatgpt,最后他帮我优化了代码的效率,主要卡在两个问题上:

①substr()的效率很低,循环使用时间复杂度很高,我原先是循环使用substr在输出前删除前导0,比较傻的做法。

while(answer.size()>0 && answer[0] == '0'){answer = answer.substr(1,answer.size()-1);
}

②原先出栈转字符串的操作也是类似用字符串循环拼接的思路,说明字符串拼接或者剪切本身复杂度是比较高的,最好是不要循环使用

 //出栈转化结果string answer = "";while (ans.size() > 0) {answer = ans.top() + answer;ans.pop();}

最后是修改后正确通过的代码

class Solution {
public:string removeKdigits(string num, int k) {if (num.size() == k) return "0";int m = k;stack<char> ans;int i;for (i = 0; i < num.size() && m != 0; i++) {while (m > 0 && ans.size() > 0 && ans.top() > num[i]){ans.pop();m--;}if (num[i] != '0' || ans.size() > 0) {ans.push(num[i]);}}while(i<num.size()) ans.push(num[i++]);while((m--)>0 && ans.size()>0) ans.pop();//出栈转化结果string answer(ans.size(), ' ');int j = ans.size() - 1;while (!ans.empty()) {answer[j--] = ans.top();ans.pop();}//再次删除前导0int index = 0;while (index < answer.size() && answer[index] == '0') {index++;}if(answer.size() == 0) return "0";return answer.substr(index == answer.size() ? index - 1 : index, answer.size());}
};

ps:ChatGPT关于优化这个算法给出的建议
在这里插入图片描述

[中等]跳跃游戏

  • 原题链接
  • 题解
int flag[30100];
class Solution {
public:bool canJump(vector<int>& nums) {if(nums.size() == 1) return true;if(nums.size() == 0) return false;for(int i=1;i<nums.size();i++){flag[i] = 0;}flag[0] = 1;for(int i=0;i<nums.size()-1;i++){if(flag[i] == 1){for(int j=1;j<=nums[i];j++){if(i+j == nums.size()-1) return true;flag[i+j] = 1;}}   }return false;}
};

[中等]跳跃游戏 II

  • 原题链接
  • 题解
    基本跟上一题差不多,记得初始化的时候,flag[]里面,除了第一个元素是0,他本身可以0步到达自己,其他都是int的最大值,用于后面的min函数比较,每一次循环就将当前位置能达到的所有下标的值进行一个比较,如果当前位置值+1,比原先记录到达当前下标需要的最小步数小,则更新。
int flag [10001];
class Solution {
public:int jump(vector<int>& nums) {if(nums.size() == 0) return 0;for(int i=1;i<nums.size();i++){flag[i] = INT_MAX;}flag[0] = 0;for(int i=0;i<nums.size()-1;i++){for(int j=1;j<=nums[i] && i+j<nums.size();j++){flag[i+j] = min(flag[i] + 1,flag[i+j]);}   }return flag[nums.size()-1];}
};

[中等]加油站

  • 原题链接
  • 题解
    当j走到一个位置无法前进的时候,说明i~j中间都是无法作为起点的,对i~j中间任意一点k,若以k作为起点,那么出发时的汽油储量只有gas[k],而从k之前的点i走过来,汽油储量应该>=gas[k](能够顺利走到k点,到的时候汽油起码是0),所以下一层循环可以直接从j+1开始考虑作为起点。
class Solution {
public:int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {int gasCount;int n = gas.size();for(int i=0; i<n; i++){int j = i;gasCount = gas[i];while (gasCount - cost[j] >= 0) {if (gasCount + gas[(j+1)%n] - cost[j] >= 0) {gasCount = gasCount + gas[(j+1)%n] - cost[j];j = (j + 1) % n;if(j==i) return i;}}if(j < i) return -1;i = j;}return -1;}
};

以下代码就是暴力的思路,每次查找失败都是i++,导致时间复杂度过大,最后超时,有五个样例通不过,但是思路上是比较朴素能够想到的,上面那个正确的就可以基于这个思路得到。

class Solution {
public:int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {int i = 0;int j = 0;int gasCount = 0;int n = gas.size();while (i < n) {gasCount += gas[j];if (gasCount - cost[j % n] >= 0) {gasCount -= cost[j % n];j = (j + 1) % n;if(j==i) return i;}else {//重置起点i++;j = i;gasCount = 0;}}return -1;}
};

[中等]划分字母区间

  • 原题链接
  • 题解
    先开个int数组或者map记录一下字符串里面各个字母出现的次数,在循环的过程中,检查当前扫描到的字母出现的次数,如果和最大次数相同,说明当前段已经包含了这个字母的所有取值,kinds用于记录当前段中,出现次数已经达到最大的字母的数量,如果和map的大小相等,说明当前段所有字母都取到了最大数,则返回当前段长,并清空记录信息,继续向前循环。
class Solution {
public:vector<int> partitionLabels(string s) {int count[26];map<char,int> nowKinds;int kinds = 0;int length = 0;vector<int> ans;int n = s.size();for(int i=0;i<26;i++){count[i] = 0;}//记录各字母出现频次for(int i=0;i<n;i++) count[s[i]-'a']++;for(int i=0;i<n;i++){nowKinds[s[i]]++;if(nowKinds[s[i]] == count[s[i]-'a']) kinds++;length++;if(nowKinds.size() == kinds){ans.push_back(length);length = 0;nowKinds.clear();kinds = 0;}}return ans;}
};

[中等]去除重复字母

  • 原题链接
  • 题解

终于是自己的思路写了大差不差,就是统计字母频次之后,依次遍历数组入栈,如果栈顶元素比当前元素大,并且之后还会出现,就应该出栈,尽量保持字符串是一个递增的序列,这样可以尽可能让字典序大。
但就是最后还是有一个点问题导致几个样例过不去,就比如在"abacb"中,只考虑以上思路会出现错误,原因就是当第二个‘a’进入循环时,将前面的“ab”都出战了,实际上,由于这里的ab已经保持了递增的序列,是不应该让让前面出栈的,正确的做法是忽略当前这个a

class Solution {
public:string removeDuplicateLetters(string s) {map<char,int> letter;int n = s.size();//字母频次记录for(int i = 0; i < n; i++){letter[s[i]] ++;}stack<char> ans;//用于接受字符的栈map<char,int> now;//循环遍历字母,用一个新的map记录当前扫描到的字母频次for(int i=0;i<26;i++){f[i] = 0;}int f[26];//f用于标记当前字符是否已经存在于栈for(int i=0;i<n;i++){now[s[i]]++;if(!f[s[i]-'a']){while(ans.size()>0 && ans.top()>=s[i] && now[ans.top()]<letter[ans.top()]){f[ans.top()-'a'] = 0;ans.pop();}}if(f[s[i]-'a'] == 0){f[s[i]-'a']++;ans.push(s[i]);}}cout << ans.size() << endl;string answer(letter.size(),' ');//答案转化出栈for(int i=answer.size()-1;i>=0;i--){answer[i] = ans.top();ans.pop();}return answer;}
};

[中等]无重叠区间

  • 原题链接
  • 题解
    贪心的思路在于,对所有重叠的区间来说,只能取其中一个,其他都要放弃,在按右端点排序所有区间的条件下,尽可能选择右端点数字最小的,能够尽可能把右边空间空出去选择更多区间。
    ①将区间按右端点排序,然后从小到大循环,如果当前区间左端点大于等于上一次选择区间的右端点,则可以加入,并将pre更新为当前区间右端点,否则取出。
    ②有个坑就是样例通过之后还是显示超时,compare函数应该使用引用传参,这样会提高效率,原因chatpgt说的是能够减少复制开销
    在这里插入图片描述
class Solution {
public:int eraseOverlapIntervals(vector<vector<int>>& intervals) {if(intervals.empty()) return 0;int n = intervals.size();sort(intervals.begin(),intervals.end(),compare);//记录上一个区间的右边界,最初始的为第一组数int pre = 0;int length = 0;for(int i=1; i<n; i++){if(intervals[i][0] >= intervals[pre][1]){pre = i;}else{length++;}}return length;}static bool compare(vector<int> &a, vector<int> &b){return a[1] < b[1];}
};

[中等]用最少数量的箭引爆气球

  • 原题链接
  • 题解
    其实就是判断重叠区间的问题,相比起上面那题无重叠区间,这里要判断的是如果区间有重叠区间就可以少射一支箭,箭数 = 区间总数-重叠次数,记住一个问题就是如果区间头尾相接,也算是能够一支箭射中两个。
class Solution {
public://重叠区间的问题,相当于选最少的点覆盖所有区间int findMinArrowShots(vector<vector<int>>& points) {if(points.empty()) return 0;int n = points.size();sort(points.begin(),points.end(),compare);//记录上一个区间的右边界,最初始的为第一组数int pre = 0;int count = 0;for(int i=1; i<n; i++){if(points[i][0] > points[pre][1]){pre = i;}else{count++;}}return n - count;}static bool compare(vector<int> &a, vector<int> &b){return a[1] < b[1];}
};

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

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

相关文章

云炬VB开发笔记 2可视化编程基础

源码下载&#xff08;提取码:6666&#xff09; 目录 1模拟小车行驶—— 控件基本属性和窗体​ 2-2简易文本编辑器—— 标签、 命令按钮、文本框​​​ 2-3模拟热气球 升空—— 图片和图像框​ 1模拟小车行驶—— 控件基本属性和窗体 2-2简易文本编辑器—— 标签、 命令按钮…

如何为现有IntelliJ IDEA项目创建GitHub存储库和本地Git存储库

IntelliJ IDEA是Java语言开发的集成环境&#xff0c;IntelliJ在业界被公认为优秀的Java开发工具之一&#xff0c;尤其在智能代码助手、代码自动提示、重构、J2EE支持、Ant、JUnit、CVS整合、代码审查、 创新的GUI设计等方面的功能可以说是超常的。 点击下载IntelliJ IDEA最新试…

代码创造的欢乐世界-通用人工智能让儿童熟练应用编程

想要复杂的参考这一篇&#xff0c;使用云平台即可完成&#xff1a; 美美的圣诞树画出来-CoCube- 把圣诞树换成六一儿童节主题的就可以啦。 这一篇是使用chatgpt类应用&#xff0c;给出关键提示词&#xff0c;代码自动生成哦。 神十六发射成功&#xff0c;科技工作者博士学位…

统计检验分析 (本文在chatGPT辅助下完成)

1. 正态分布检验 2. 统计检验 t-test: 适用于样本数量较小&#xff08;通常小于 30&#xff09;的正态分布数据&#xff0c;用于比较两个样本的均值是否有显著差异。 Paired t-test: 确定某个总体的成对测量值之间的差异是否为 0 Two-sample t-test (independent t-test): 确…

sql 性能优化基于explain调优

文章目录 Explain分析&#xff1f;问题描述解决方案 Explain分析&#xff1f; 关于Explain具体可以干什么&#xff0c;有哪些优缺点&#xff0c;本博主的文章有写到&#xff0c;这是链接地址: 点击这里查看. 下面来说下Explain在项目实战中&#xff0c;如何去进行优化。 问题…

chatgpt在Unity里的开发和原理

chatgpt在Unity里的开发和原理 教学视频 先放上教学视频链接 https://www.reddit.com/r/unity_tutorials/comments/10aic34/chatgpt_with_unity_in_todays_video_i_show_you_a/ https://www.youtube.com/watch?vPRwfHajinSU 语音控制实现unity里的效果 或者语音控制实现Un…

搞不定高考的ChatGPT,原来只有小学4年级水平

夕小瑶科技说 原创 作者 | Python 之前&#xff0c;复旦大学的研究者让ChatGPT参加了中国高考&#xff0c;发现成绩惨不忍睹&#xff08;参见推送&#xff09;&#xff0c;其中理科数学竟只有20多分。这次&#xff0c;小米AI lab的研究者们给模型降低一下难度&#xff0c;找了…

《聊聊我的故事 | 谈谈自己大学的收获,以及毕业的求职经历》

1.初进校园&#xff0c;实现最初的梦想 还在读高中的时候&#xff0c;心中就非常向往大学的生活&#xff0c;希望自己可以快一点进入大学。记得老师经常对我们说&#xff0c;你们现在辛苦一点&#xff0c;等到进入大学后就会轻松很多了。因此&#xff0c;心中便一直都有一个目…

毕业后的感言

我们毕业了&#xff0c;毕业季分手季。我目睹了那些不舍得眼泪。其实在那个时候我发觉嘴上说自己是一个没心没肺的人是不现实的。我居然也被赤化了。我居然也有心酸&#xff0c;也会难过。甚至对自己的前女友说有点不舍。毕业后祝你幸福! 回首大学&#xff0c;我没有遗憾&#…

毕业季心得

活动地址&#xff1a;毕业季进击的技术er &#x1f449;目录 前言学习背景敲下的第一行代码对未来的规划想对大家说的话最后 前言 时光荏苒&#xff0c;转瞬即逝&#xff0c;如白驹过隙一般。在这炎炎盛夏&#xff0c;我们又迎来了毕业季&#xff0c;我是一名在校生&#xff0c…

毕业感言

入学&#xff0c;满怀憧憬。不同的梦想&#xff0c;共同的行动。 大一&#xff0c;木头木脑。队列、口号、训练&#xff0c;身体是父母的&#xff0c;生活是队里的。 大二&#xff0c;徘徊迷茫。游荡在知识的海洋&#xff0c;寻找着未来的方向。 大三&#xff0c;低调做事。…

【毕业季】这四年一路走来都很值得——老学长の忠告

活动地址&#xff1a;毕业季进击的技术er 大家好&#xff0c;我是路飞&#xff01; 又是一年毕业季&#xff0c;大学四年还没来得及好好体验校园生活&#xff0c;就匆忙收尾了&#xff01;这四年时光里&#xff0c;有过目标和追求&#xff0c;也有过遗憾和不舍&#xff0c;从四…

关于毕业求职的就业经验-写给我亲爱的校友们

提示&#xff1a;希望下面的文章对大家能有所帮助 文章目录 前言一、毕业季的几种选择&#xff1f;1.考研2.就业3.其他 二、到了毕业季应该怎么去找到自己心怡的工作&#xff1f;三、需要掌握的基本技能&#xff08;以我嵌入式开发角度&#xff09;&#xff1f;四、该怎么去跳槽…

博士毕业答辩会上的感言——余子濠

今天余子濠终于博士毕业了&#xff01; 余子濠是孙凝晖老师和我共同指导的博士生&#xff0c;他这个博士&#xff0c;读了整整八年。 今天的答辩会也是讨论得尤其热烈&#xff0c;答辩委员们提出了很多专业问题&#xff0c;子濠逐一做了解答。整个答辩会持续了130多分钟&#x…

new bing 使用出现“”]Sorry, looks like your network settings are preventing access to this feature.解决方法

1、问题 使用new bing时候如果出现“Sorry, looks like your network settings are preventing access to this feature”&#xff0c;请尝试用以下方案解决 2、解决 1、确保代理的节点在美国 2、在Edge dev中打开“https://www.bing.com/search?q要问的问题&setmktzh-…

又一家AI独角兽上市,AI的春天又来了?

‍数据智能产业创新服务媒体 ——聚焦数智 改变商业 时隔两年&#xff0c;云天励飞终于上市了&#xff0c;但前方并非一片平坦开阔地&#xff0c;而是视觉AI竞技场。 刚刚&#xff0c;AI独角兽云天励飞技术股份有限公司&#xff08;简称&#xff1a;云天励飞&#xff09;登陆科…

阿里云 OpenSearch 重磅推出 LLM 问答式搜索产品,助力企业高效构建对话式搜索服务

1. 企业专属问答搜索 1.1. 世界知识 vs 企业专属知识 ChatGPT、通义千问正在引领搜索技术变革&#xff0c;其表现出的“什么都懂&#xff0c;什么都能聊”关键是依赖于底座大语言模型&#xff08;Large Language Model, LLM&#xff09;中压缩的世界知识。但无论是多强大的LL…

从2023年Q1,看当下的量子产业

光子盒研究院 一旦实现商业化&#xff0c;量子计算将带领人类进入一个全新的领域。 今天&#xff0c;人工智能(AI)、ChatGPT等大语言模型的处理能力受限于芯片有限的表面积&#xff1a;超过一定数量的GPU&#xff0c;每个GPU的批处理量就会变小——进一步增加数量反而会增大成本…

华为ENSP的Stelnet、直连、串口连接、telnet连接登录

华为ENSP设备登录的几种方式 一、直接打开终端窗口&#xff0c;启动设备后&#xff0c;直接双击设备即可&#xff0c;如下图所示&#xff1a; 二、用ENSP中的PC连接线CTL到设备的console登录 步骤1&#xff1a;在左侧的连线中找到CTL线单击&#xff08;如果没有CTL线说明ENSP…

华为模拟器:ENSP,不同vlan间通信

拓扑图 创建好拓扑后,配置pc电脑的ip地址与网关地址 第三步打开SW1交换机进行vlan划分 这里是进入视图模式下后创建vlan后,进行端口绑定vlan 代码: interface GigabitEthernet 0/0/1 进入端口 port link-type access port default vlan 10 设置access绑定vlan 第二台pc与第…