当前位置: 首页 > news >正文

温岭做鞋子的网站站长工具星空传媒

温岭做鞋子的网站,站长工具星空传媒,做网站的需求分析,企业做网站的目的是什么[双指针] (二) LeetCode 202.快乐数 和 11.盛最多水的容器 快乐数 202. 快乐数 题目解析 (1) 判断一个数是不是快乐数 (2) 快乐数的定义:将整数替换为每个位上的和;如果最终结果为1,就是快乐数 (3) 这个数可能变为1,也可能无…

[双指针] (二) LeetCode 202.快乐数 和 11.盛最多水的容器

快乐数

202. 快乐数

image-20231029102141125

题目解析

(1) 判断一个数是不是快乐数

(2) 快乐数的定义:将整数替换为每个位上的和;如果最终结果为1,就是快乐数

(3) 这个数可能变为1,也可能无限循环

解题思路

示例1:n = 19;示例2: n = 2

image-20231029093817505

我们发现它们都可以抽象为一种类型:一个环中全都是1,另一个是无限重复的数。

image-20231029093912956

这和经典题目判断链表是否有环几乎是一模一样,解决判断链表是否有环时,我们使用的就是双指针解法。

141. 环形链表

解法:双指针(并不是真正意义上的指针)

定义一个快指针和一个慢指针,快指针走两步,慢指针走一步,最终它们会在同一个点相遇。(大家有能力的可以自己画图证明一下)

看到这里,大家可以尝试一下去实现一下代码,再向后面看下去。


代码实现
class Solution {
public:int getVal(int n){int val = 0;while(n){int tmp = n % 10;val += tmp * tmp;n /= 10;}return val;}bool isHappy(int n) {int fast = getVal(n), slow = n;while(fast != slow){slow = getVal(slow);fast = getVal(getVal(fast));}return slow == 1;}
};

image-20231029094337360

总结

细节1:在循环条件上,我们使用fast != slow,所以一开始我们定义的快慢指针,应该不相同,所以把快指针定义为第二个数(getVal(n)),否则进不去循环。

细节2:返回的是slow == 1,最后相遇的点不一定为1,如示例中,也有可能为4。

细节3:为什么只有这两种情况(无限循环为1,或者无限循环不为1)?为什么没有一直循环下去且不重复这第三种情况?

我们进行一下简单证明:鸽巢原理

100个鸽子巢穴,有101只鸽子,可以得出至少有一个巢穴有两只鸽子。

image-20231029095245589

数据范围是[1, 2 ^ 31 - 1],也就是 [1, 2147483647];(约2 * 10 ^ 9)

我们再扩充数据范围为[1, 9999999999] (大于9 * 10 ^ 9)

9999999999 -> 81 * 10 = 810

所以[1, 2 ^ 31 - 1]循环范围为 [1, 810],即使有一个数经历810次循环后还不重复,但是第811次就会和这范围中的一个数重复。

由此得出,第三种情况不存在。

盛最多水的容器

11. 盛最多水的容器

image-20231029102057569

题目解析

(1) 数组height中存放的是高度

(2) 存水量为长 * 高

(3) 找出最大存水量的容器

解题思路

一开始我们会想到暴力解法:两个循环枚举所有情况,一个一个比大小。

但是有些情况是不需要枚举的,比如一个高是1,其他的情况基本不需要再枚举了(具体情况具体分析),长度确定情况下,肯定是越高越好。

接下来对暴力枚举进行优化:

我们又发现:存水量 = 长 * 高,即选择不同的下标就是选择不同的高度,所以我们尝试使用双指针。

定义一个指针left 和 指针right:

从同一方向开始,我们发现存水量 = 长 * 高,长可以变大或者变小,高可以变大或者变小:相乘之后结果是变大还是变小,这是不可控制的。

所以我们选择left在下标0处,right在下标height.size-1处。这样长是不断在减小的,高必须要变大才能使存水量变大。

所以在height[left]和height[right]之间需要选择一个更大的数,否则就跳过包含这个情况的所有情况,即为:left++或者right - -。

代码实现
class Solution {
public:int maxArea(vector<int>& height) {int max_area = 0;//h * l = area l:变小 h:变大for(int left = 0, right = height.size()-1; right > left; ){int low = height[left] < height[right] ? height[left] : height[right];max_area = max(max_area, (right - left) * low);if(height[left] < height[right]) left++;else right--;}return max_area;}
};

image-20231029103641872

总结

细节1:容器盛水量是由两个高度中短的那个决定的。

细节2:height[left] 和 height[right]之间,我们需要选择大的那个,来跳过包含小的那个高度的所有情况

http://www.dinnco.com/news/81468.html

相关文章:

  • wordpress静态首页设置北京网站优化方案
  • 如何对一个网站进行seo重庆seo全网营销
  • 山西 网站建设广东东莞大益队
  • 登陆网站密码不保存怎么做太原做网站推广的公司
  • 网站开发形式有哪些外国人b站
  • 怎么做弹幕小视频网站西安关键词排名推广
  • 军民融合网站建设中国进入一级战备状态了吗
  • 新闻类网站html模板免费下载seo营销专员
  • 亚马逊网站建设历程营销活动方案模板
  • 达川网站制作西安企业seo
  • 网站优化文章广州软文推广公司
  • 宜昌市做网站semir森马
  • 昆明网站建设哪家好天津百度seo排名优化
  • 装修在线设计网站最好的免费信息发布平台
  • 个人可以做视频网站吗seo网站推广多少钱
  • 个人网站开发赚钱方向广告外链购买平台
  • 比较商务网站的营销策略百度小说搜索风云排行榜
  • 建站平台塔山双喜东莞网站推广策划
  • 团购网站建设目的seow
  • 个人网站建什么类型的各大网站收录查询
  • 佛山网站建设外包百度地图网页版进入
  • 吃什么补肾效果最好常州seo外包
  • 机械加工厂接单平台app快速seo排名优化
  • 国内景观设计公司前十名杭州seo专员
  • 郑州自助建站模板中央新闻今日要闻
  • 购物网站设计开题报告广告资源发布平台
  • 网站开发工具的功能包括html百度网页版入口链接
  • 怎样把做的网站上传到github宁波网站建设制作报价
  • 做特色菜的网站百度做广告多少钱一天
  • 网站开发平台的定义培训机构哪家好