力扣hot100——第3天:11盛最多水的容器、15三数之和、17电话号码的字母组合

news/2024/10/30 19:36:44/

文章目录

  • 1.11盛最多水的容器
    • 1.1.题目
    • 1.2.解答
      • 1.2.1.题解
      • 1.2.2.自己对参考题解的进一步解释
  • 2.15三数之和【代码随想录已刷】
  • 3.17电话号码的字母组合【代码随想录已刷】

1.11盛最多水的容器

参考:力扣题目链接;题解

1.1.题目

在这里插入图片描述

1.2.解答

1.2.1.题解

这道题目可以使用双指针来求解,其中参考题解的解释已经非常详细了,直接摘录如下:

在这里插入图片描述在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述

1.2.2.自己对参考题解的进一步解释

假设这个容器如下图所示:
在这里插入图片描述

那么按照参考题解的做法,一开始左右边界是包含整个数组的。这里假设数组长度是n,然后数组中不包含的长度是i。那么我们想做的就是i从0开始遍历到n,数组的长度n-i也就是从n减小到0,然后我们寻找最大的面积。

1.i = 0,数组长度n-i = n
此时就是整个数组的长度,我们可以直接计算面积S_0 = min(num[0], num[4]) * (4 - 0)

2.i=1,数组长度n-i = n-1

此时我们必须要移动数组的边界了。按照参考题解的讲解,如果此时我们保持左边界left = 0不动,去移动右边界的话,那么不管右边界移动到什么位置,也就是不管数组长度是n/n-1/n-2/....,结果肯定都是小于S_0的。也就是说只要是以left = 0作为左边界,那么不管数组长度是多少,结果都小于之前我们已经做过的计算S_0

因此当我们从当前的位置缩减数组长度的时候,一定不能把left=0仍然作为左边界了,所以只能把左边界右移,然后得到面积S_1 = min(num[1], num[4]) * (4-1)

3.i=2,数组长度n-i = n-2

此时我们又要移动数组的边界。按照参考题解的讲解,如果此时我们保持左边界left = 1不动,去移动右边界的话,那么不管右边界移动到什么位置,也就是不管数组长度是n-1/n-2/n-3/...,结果肯定都是小于S_1的。也就是说只要是以left = 1作为左边界,那么不管数组长度是多少,结果都小于之前我们已经做过的计算S_1

因此当我们从当前的位置缩减数组长度的时候,一定不能把left=1仍然作为左边界了,所以只能把左边界右移,然后得到面积S_2 = min(num[2], num[4]) * (4-2)

疑问:但是这个时候自己的疑问就是,在数组长度是n-2的时候,如下图所示,我们可以选择左右边界为0-21-32-4,此时选择了2-4,并没有比较它和0-21-3两个数组的面积谁更大,怎么就能确定他是长度为n-2的所有数组中面积最大的呢?

在这里插入图片描述

解答:实际上,确实无法判断2-4就是长度为n-2的数组中面积最大的。但是我们并不是要计算每个长度的数组中面积最大的,而是一直在判断所有长度的数组中面积最大的

  • 比如左右边界为0-2:此时是0为左边界,但是前面第2步移动窗口的时候我们已经证明,只要是以0为左边界,不管数组长度是多少,结果都小于我们已经计算的S_0。而S_0已经被用于统计是否是所有长度的数组中面积最大的了。所以在最终最大面积的结果中,一定可以保证S(0-2) <= S_0 = S(0-4) <= max_result。所以尽管我们不能确定0-2的面积和2-4的面积谁大谁小,但是我们可以确定最终的最大面积中,一定不包括0-2这个结果。所以在选择长度为n-2的数组时,不考虑0-2这个数组对最后我们求解最大面积没有影响。

  • 再比如左右边界为1-3:此时是1为左边界。但是前面第3步移动窗口的时候我们已经证明,只要是以1为左边界,不管数组长度是多少,结果都小于我们已经计算的S_1。而S_1已经被用于统计是否是所有长度的数组中面积最大的了。所以在最终最大面积的结果中,一定可以保证S(1-3) <= S_1 = S(1-4) <= max_result。所以尽管我们不能确定1-3的面积和2-4的面积谁大谁小,但是我们可以确定最终的最大面积中,一定不包含1-3这个结果。所以在选择长度为n-2的数组时,不考虑1-3这个数组对最后我们求解最大面积没有影响。

经过上面的解释可以发现,之前移动数组的时候,移动了那个边界,就把以它为边界的所有其他数组的可能性都包括了,所以最后只需要移动左右边界就可以求得最优的解。

最后给出代码如下,使用双指针代码其实很简单,关键在于理解为什么使用双指针可以得到最优解。

int maxArea(vector<int> &height)
{int left = 0;int right = height.size() - 1;int result = 0;while(left < right){// 计算此次的面积int s = min(height[left], height[right]) * (right - left);// 和最大面积比较,更新最大面积result = max(s, result);// 移动短板if(height[left] <= height[right])left++;elseright--;}return result;
}

2.15三数之和【代码随想录已刷】

参考:力扣题目链接;自己的博客解答

3.17电话号码的字母组合【代码随想录已刷】

参考:力扣题目链接;自己的博客解答


http://www.ppmy.cn/news/1117.html

相关文章

好家伙!阿里并发核心编程宝典(2022版)一夜登顶Github热榜第三

不知道大家今年的金九银十是否有出去面试过&#xff1f;有出去面试的朋友肯定深有感受&#xff0c;像我们刚入行那会面试的加分项现在卷得已经成为了面试的基础题&#xff08;手动狗头&#xff09;。其中最典型的就属这个Java并发编程了。之前一般只有大厂才会有高并发编程相关…

深入URP之Shader篇3: Unlit Shader分析[下]

Unlit shader 上篇中我们分析了Unlit shader的Properties在ShaderGUI中的处理&#xff0c;接下来看Sub Shader。 SubShader unlit shader以及其他URP shader包含两个SubShader&#xff0c;分别是针对ShaderModel4.5和2.0。由于unlit shader本身很简单&#xff0c;这两个SubS…

【Linux】常用的Linux命令(初学者必读)

一、学习Linux的原因 开源&#xff0c;免费系统迭代更新系统性能稳定安全性高多任务&#xff0c;多用户耗资源少内核小应用领域广泛使用及入门容易 二、Linux常用的命令 我使用的Linux环境是在 腾讯云服务器上的Centos 7和 Xshell。 下面我把常用的一些命令分成了几个部分&am…

用Python预测世界杯球赛结果,还别说准确度还是蛮高的

前言 那么四年一度的世界杯即将要在卡塔尔开幕了&#xff0c;对于不少热爱足球运动的球迷来说&#xff0c;这可是十分难得的盛宴&#xff0c;而对于最后大力神杯的归属&#xff0c;相信很多人都满怀着期待&#xff0c;每个人心中都有不同的答案。 今天我就通过Python数据分析…

【Android App】人脸识别中使用Opencv比较两张人脸相似程度实战(附源码和演示 超详细)

需要全部代码请点赞关注收藏后评论区留言私信~~~ 一、比较两张人脸的相似程度 直方图由一排纵向的竖条或者竖线组成&#xff0c;横轴代表数据类型&#xff0c;纵轴代表数据多少。 图像直方图经常应用于特征提取、图像匹配等方面。 假设有两幅图像&#xff0c;它们的直方图很相…

C++ OpenCV【视频合并:多个图像拼接在一张图像】

提示&#xff1a;本文中视频拼接指的是将多张图像按空间合并在一张图像上&#xff0c;而不是将多张图像按时间顺序拼接成一个多帧片段。 文章目录 前言 一、OpenCV知识点 1.OpenCV裁剪矩形区域赋值 2.OpenCV将Mat粘贴到指定位置 二、程序样例 1.程序源码 2.运行结果 前言 C版…

高等数学(第七版)同济大学 习题10-5 个人解答

高等数学&#xff08;第七版&#xff09;同济大学 习题10-5 函数作图软件&#xff1a;Mathematica 1.求下列含参变量的积分所确定的函数的极限&#xff1a;\begin{aligned}&1. \ 求下列含参变量的积分所确定的函数的极限&#xff1a;&\end{aligned}​1. 求下列含参变量…

【机器学习】基于机器学习的反弹shell命令识别

引言 本文介绍一个基于机器学习识别反弹shell的项目。 在主机安全检测中&#xff0c;一般是采用基于原理的方式识别反弹shell, 通过判断socket通信相关特征&#xff0c;可以准确地识别到主机中的反弹shell。 但是在容器场景下&#xff0c;检测反弹shell 的能力&#xff0c;可能…