Leetcode 11-15题

盛最多雨水的容器

数组的第 i i i个数字表示这个位置隔板的高度,选择哪两块板子可以装最多的水,返回可以存储的最大水量。

有一种双指针的贪心策略:如果左边的指针所在的挡板低,就将左边的指针右移,否则将右边的指针左移。

每次移动完之后,计算当前能存储的水量,并和结果值相比较。

证明:假设最优解对应的两条线的下标是 i ′ , j ′ ( i ′ < j ′ ) i^′,j^′(i^′<j^′) i,j(i<j),在 i , j i,j i,j 不断靠近的过程中,不妨假设 i i i 先走到 i ′ i^′ i,则此时有 j ′ < j j^′<j j<j。反证,如果此时 a i ≤ a j a_i≤a_j aiaj,设 S S S 表示 i , j i,j i,j 能盛多少水, S ′ S^′ S 表示 i ′ , j ′ i^′,j^′ i,j 能盛多少水,则:
$$
S=min(a_i,a_j)∗(j−i)
=a_i∗(j−i)

a_i∗(j^′−i)
\geq min(ai,aj′)∗(j′−i)=S^′
$$
S ′ S^′ S 是最优解矛盾,因此 a i > a j a_i>a_j ai>aj,所以 j j j 会一直走到 j ′ j^′ j,从而得到最优解。

int maxArea(vector<int>& height) {int res = 0;for(int l = 0, r = height.size() - 1; l < r; ) {res = max(res, (r - l) * min(height[l], height[r]));	// 先计算当前状态再转移if(height[l] < height[r])   l ++;else r --;}return res;
}

整数转罗马数字

在罗马数字中有如下规则:

I	1
V	5
X	10
L	50
C	100
D	500
M	1000

通常,罗马数字中小的数字在大的数字的右边,如XV表示 15 15 15。但也存在特例,如IV表示 4 4 4,但这只有如下六种情况:

  • I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。
  • X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。
  • C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。

将给定的数字转化为罗马数字。

1	  	2		3	 	4		5	   	6		 7		   	 8		    9
I	 	II	    III		IV		V	  	VI		 VII		 VIII		IX
10	 	20		30		40		50	  	60		 70			 80		    90
x	 	XX		XXX		XL		L	  	LX		 LXX		 LXXX		XC
100 	200 	300 	400 	500   	600 	 700 		 800 		900
c		CC		CCC		CD		D	  	DC		 DCC		 DCCC		CM
1000	2000	3000
M		MM		MMM

分别枚举个十百千位的数值如何表示,我们不难发现 1 − 3 1-3 13 6 − 8 6-8 68的表示比较显然,其余的则比较特殊。

100 − 900 100-900 100900为例,以 100 , 400 , 500 , 900 100,400,500,900 100,400,500,900为界,若 x > 900 x>900 x>900 x − 900 x-900 x900,若 x > 500 x>500 x>500 x − 500 x-500 x500,直至循环结束。

所以只需要打表打出 1 , 4 , 5 , 9 1,4,5,9 1,4,5,9系列的值即可,然后从大到小依次减。

string intToRoman(int num) {vector<int> key = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};vector<string> value = {"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"};string ans = "";// 2649 -> 1649 -> 649 -> 149 -> 49	   		-> 9 		-> 0// 		   M	   MM     MMD    MMDC     MMDCXL 	MMDCXLIXfor(int i = 0; i < key.size(); i ++) {while(num >= key[i]) {num -= key[i];ans += value[i];}}return ans;
}

罗马数字转整数

将给定的罗马数字转化为整数。

和上一题类似的打表思想,但是将罗马数字转化为整数时,注意到一个特性:

若大数在小数左边,则为大数+小数,若大数在小数右边,则为大数-小数。并且本题只需要存储7个罗马数字即可。

int romanToInt(string s) {unordered_map<char, int> mp;mp['I'] = 1;    mp['V'] = 5;    mp['X'] = 10;   mp['L'] = 50;mp['C'] = 100;  mp['D'] = 500;  mp['M'] = 1000;int ans = 0;for(int i = 0; i < s.size(); i ++) {if(i + 1 < s.size() && mp[s[i]] < mp[s[i + 1]])ans -= mp[s[i]];elseans += mp[s[i]];}return ans;
}

最长公共前缀

求字符串数组中的最长公共前缀。

可以用trie树来做,但是太麻烦。

可以直接枚举字符串的每一位,看所有字符串的这一位是否都相同,如果不同就返回当前结果,否则继续下一轮判断。

string longestCommonPrefix(vector<string>& strs) {string ans = "";for(int i = 0; i < strs[0].size(); i ++) {  // 枚举第i位char c = strs[0][i];bool flag = true;for(auto str : strs) {                  // 判断所有字符串的第i位是否都相同if(str.size() < i || str[i] != c) {flag = false;break;}}if(flag)    ans += c;else    break;}return ans;
}

三数之和

给定整数数组,找出满足 i ≠ j ≠ k i \neq j \neq k i=j=knums[i]+nums[j]+nums[k]=0的所有三元组。

先对整数数组排序,然后枚举 i i i的所有位置,再对 j , k j,k j,k使用双指针算法。

i i i的位置固定后, n u m s [ j ] + n u m s [ k ] = − n u m s [ i ] nums[j]+nums[k]=-nums[i] nums[j]+nums[k]=nums[i],当 j j j右移时, k k k必然左移,因此时间复杂度为 O ( n 2 ) O(n^2) O(n2)

由于答案中不能包含重复的三元组,可以使用set来对答案进行去重。

vector<vector<int>> threeSum(vector<int>& nums) {set<vector<int>> res;sort(nums.begin(), nums.end());for(int i = 0; i < nums.size() - 2; i ++) {     // 固定ifor(int j = i + 1, k = nums.size() - 1; j < k; j ++) {  // 每次移动j,对j找到满足条件的kwhile(j < k - 1 && nums[i] + nums[j] + nums[k] > 0) k --;if(nums[i] + nums[j] + nums[k] == 0)res.insert({nums[i], nums[j], nums[k]});}}vector<vector<int>> ans;            // 去重for(auto p : res)   ans.push_back(p);return ans;
}

对于1 1 2 2 -3这种情况来说,第1个1和第2个1所呈现出的组合是一样的,所以对于相同的数ij都只需要遍历一次即可。

也可以通过这种方法来去重,会大大降低时间复杂度。

vector<vector<int>> threeSum(vector<int>& nums) {vector<vector<int>> ans;sort(nums.begin(), nums.end());for(int i = 0; i < nums.size() - 2; i ++) {     // 固定iif(i && nums[i] == nums[i - 1]) continue;   // i不能重复判断 for(int j = i + 1, k = nums.size() - 1; j < k; j ++) {  // 每次移动j,对j找到满足条件的kif(j > i + 1 && nums[j] == nums[j - 1])  continue;  // j不能重复判断// 因为i和j都不会重复,所以k也必然不会重复,所以不需要额外特判kwhile(j < k - 1 && nums[i] + nums[j] + nums[k] > 0) k --;if(nums[i] + nums[j] + nums[k] == 0)ans.push_back({nums[i], nums[j], nums[k]});}}return ans;
}

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

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

相关文章

MATLAB知识点:nchoosek函数(★★★☆☆)用来计算组合数,也能返回从向量v中抽取k个元素的所有组合

讲解视频&#xff1a;可以在bilibili搜索《MATLAB教程新手入门篇——数学建模清风主讲》。​ MATLAB教程新手入门篇&#xff08;数学建模清风主讲&#xff0c;适合零基础同学观看&#xff09;_哔哩哔哩_bilibili 节选自第3章&#xff1a;课后习题讲解中拓展的函数 在讲解第三…

算法训练营day28(补), 贪心算法2

//122. 买卖股票的最佳时机 II func maxProfit(prices []int) int { result : 0 //利润总和 for i : 1; i < len(prices); i { if prices[i]-prices[i-1] > 0 { result result (prices[i] - prices[i-1]) } } return result } //55. 跳跃游戏 func canJump(nums []…

模型 4E(交换、体验、随处、传教)理论

系列文章 分享 模型&#xff0c;了解更多&#x1f449; 模型_总纲目录。重在提升认知。聚焦体验营销。 1 模型 4E(交换、体验、随处、传教)理论的应用 1.1 4E 理论在软件产品营销中的应用 某软件公司利用 4E 理论提升软件产品的市场占有率。具体如下&#xff1a; Exchange&a…

人工智能学习与实训笔记(四):神经网络之NLP基础—词向量

人工智能专栏文章汇总&#xff1a;人工智能学习专栏文章汇总-CSDN博客 本篇目录 四、自然语言处理 4.1 词向量 (Word Embedding) 4.1.1 词向量的生成过程 4.1.2 word2vec介绍 4.1.3 word2vec&#xff1a;skip-gram算法的实现 4.2 句向量 - 情感分析 4.2.1 LSTM (Long S…

C语言之日历问题

一、代码展示 #include<stdio.h> int leapyear(int year)//判断是不是闰年函数 {if (year % 4 0 && year % 100 ! 0 || year % 400 0)return 1;elsereturn 0; } int days(int year, int month, int* day)//判断一个月有几天 {if (month ! 2)return day[month…

7.JS里表达式,if条件判断,三元运算符,switch语句,断点调试

表达式和语句的区别 表达式就是可以被求值的代码比如什么a 1 语句就是一段可以执行的代码比如什么if else 直接给B站的黑马程序员的老师引流一波总结的真好 分支语句 就是基本上所有的语言都会有的if else 语句就是满足不同的条件执行不同的代码&#xff0c;让计算机有条件…

【Java程序员面试专栏 Java领域】Java虚拟机 核心面试指引

关于Java 虚拟机部分的核心知识进行一网打尽,主要包括Java虚拟机的内存分区,执行流程等,通过一篇文章串联面试重点,并且帮助加强日常基础知识的理解,全局思维导图如下所示 JVM 程序执行流程 包括Java程序的完整执行流程,以及Javac编译,JIT即时编译 Java程序的完整执…

C++抽象类、纯虚函数和接口

在C中&#xff0c;抽象类是一种特殊的类&#xff0c;旨在作为其他类的基类使用。它定义了一组接口&#xff0c;派生类应该实现这些接口。 抽象类的主要特征 至少包含一个纯虚函数&#xff0c;不能被直接实例化&#xff0c;为派生类提供基础结构 纯虚函数&#xff08;Pure Vi…

会声会影2024新功能及剪辑视频步骤教程

会声会影2024的新功能主要包括&#xff1a; 全新的标题动态与特效&#xff1a;用户可以为文字标题指定进入、中场和退出的不同动态效果&#xff0c;比如闪现进入、中场弹跳和淡出退出等&#xff0c;让文字标题更具动感。此外&#xff0c;还新增了多个标题特效&#xff0c;包括…

作物模型狂奔 Apsim 脚本并行思路

这里没图&#xff0c;去B站看看 整体思路&#xff1a;Python -》R -》Apsimx 0、准备工作 0.0 电脑环境 我用的Win10啦&#xff0c;Linux、Mac可能得自己再去微调一下。 PS&#xff1a;一直没上win11&#xff0c;因为win11 开始菜单用着实在难顶。 !在这里插入图片描述](h…

037-安全开发-JavaEE应用JNDI注入RMI服务LDAP服务JDK绕过调用链类

037-安全开发-JavaEE应用&JNDI注入&RMI服务&LDAP服务&JDK绕过&调用链类 #知识点&#xff1a; 1、JavaEE-JNDI注入-RMI&LDAP 2、JavaEE-漏洞结合-FastJson链 3、JavaEE-漏洞条件-JDK版本绕过 演示案例&#xff1a; ➢JNDI注入-RMI&LDAP服务 ➢JNDI注…

一文彻底搞懂MySQL主从同步

文章目录 1. 简介2. 基本原理3. 实现方式4. 常见的主从架构模式4.1 一主一从4.2 一主多从4.3 双M4.4 联级复制4.5 多主一从 5. 常见问题 1. 简介 MySQL主从同步是一种数据库复制技术&#xff0c;它可以将一台MySQL数据库&#xff08;称为主服务器&#xff09;的数据复制到另一…

阿里云香港服务器cn2速度测试和租用价格表

阿里云香港服务器中国香港数据中心网络线路类型BGP多线精品&#xff0c;中国电信CN2高速网络高质量、大规格BGP带宽&#xff0c;运营商精品公网直连中国内地&#xff0c;时延更低&#xff0c;优化海外回中国内地流量的公网线路&#xff0c;可以提高国际业务访问质量。阿里云服务…

YOLO v5项目实战 P5 解决运行detect文件时设置了--view-img但是显示不出来的问题

up主讲的实时显示目标检测后的图片的两种方法&#xff1a; &#xff08;1&#xff09;在下面的Terminal中输入下列命令&#xff1a; python detect.py --view-img &#xff08;2&#xff09;点击进入右上方的detect的Edit Configurations 然后在这个参数这里输入 --view img…

人工智能学习与实训笔记(八):百度飞桨套件使用方法介绍

人工智能专栏文章汇总&#xff1a;人工智能学习专栏文章汇总-CSDN博客 本篇目录 八、百度飞桨套件使用 8.1 飞桨预训练模型套件PaddleHub 8.1.1 一些本机CPU可运行的飞桨预训练简单模型&#xff08;亲测可用&#xff09; 8.1.1.1 人脸检测模型 8.1.1.2 中文分词模型 8.1…

自然语言编程系列(四):GPT-4对编程开发的支持

在编程开发领域&#xff0c;GPT-4凭借其强大的自然语言理解和代码生成能力&#xff0c;能够深刻理解开发者的意图&#xff0c;并基于这些需求提供精准的编程指导和解决方案。对于开发者来说&#xff0c;GPT-4能够在代码片段生成、算法思路设计、模块构建和原型实现等方面给予开…

《数字电子电路》 课程设计:十字路口红绿灯自动控制系统(上)(multisim仿真及PCB实现)

&#xff08;一&#xff09;前言 本系列文章就笔者在大二下学期进行《数字电子线路》课程设计的题目&#xff1a;十字路口红绿灯自动控制系统 进行详细的讲解&#xff0c;希望对读者有所帮助。 &#xff08;二&#xff09;目录 一、主要指标及要求 二、电路工作原理 1、工作原…

P15---总电磁转矩T

正弦波驱动模式工作的永磁同步电动机的总电磁转矩 T clear clc% 15页表达式 syms Omega theta E I e_A E*sind(theta) e_B E*sind(theta-120) e_C E*sind(theta-240)i_A I*sind(theta) i_B I*sind(theta-120) i_C I*sind(theta-240)P e_A*i_A e_B*i_B e_C*i_CT P/Om…

Unity设备分级策略

Unity设备分级策略 前言 之前自己做的设备分级策略&#xff0c;在此做一个简单的记录和思路分享。希望能给大家带来帮助。 分级策略 根据拟定的评分标准&#xff0c;预生成部分已知机型的分级信息&#xff0c;且保存在包内&#xff1b;如果设备没有被评级过&#xff0c;则优…

QKD安全攻击防御方案分析和分级评估研究报告

今天分享的是行业报告&#xff1a;《QKD安全攻击防御方案分析和分级评估研究报告》 &#xff08;内容出品方&#xff1a;量子信息网络产业联盟&#xff09; 报告共计&#xff1a;180页 来源&#xff1a;《见鹿报告》 前言 量子通信是量子信息科学的重要分支&#xff0c;它…