【专题刷题】双指针(二)

📝前言说明:

  • 本专栏主要记录本人的基础算法学习以及LeetCode刷题记录,按专题划分
  • 每题主要记录:(1)本人解法 + 本人屎山代码;(2)优质解法 + 优质代码;(3)精益求精,更好的解法和独特的思想(如果有的话)
  • 文章中的理解仅为个人理解。如有错误,感谢纠错

🎬个人简介:努力学习ing
📋本专栏:C++刷题专栏
📋其他专栏:C语言入门基础,python入门基础,C++学习笔记,Linux
🎀CSDN主页 愚润泽

视频

  • 202. 快乐数
    • 个人解
    • 优质解:
  • 11 盛最多水的容器
    • 个人解
    • 优质解:
  • 611. 有效三角形的个数
    • 个人解
    • 优质解:


202. 快乐数

在这里插入图片描述

个人解

思路:没思路,不知道如何判断这个数不是快乐树
用时:13:00
屎山代码:无


优质解:

思路:不要偷懒,自己手算一遍这个过程才能发现规律
在这里插入图片描述
你要问我为什么一定能成环
题目所给的数字范围:1 <= n <= 2^31 - 12^31 - 1 == 2,147,483,647,总共有9位数,我们往大了取,假设每一位都为9,则999999999的平方和肯定是最大的,结果是9*9*10 == 810,那最小的数呢?显然是1,也就是说每次变化的取值是在[1, 810]里面取。
但是,无限循环,取无数次,在[1, 810]里面取无数次,必然有重复!

对于能变成1的快乐数,因为1的平方还是1,所以,最后也是在一个全是1的环内循环

所以,这道题就变成:可以用快慢指针,慢指针每次移动一步,快指针每次移动两步,因为有速度差且有环,所以快慢指针一定会在环内相遇。当快慢指针相遇时,判断相遇的数是否为1即可。

代码:

class Solution {
public:int Sum(int n){int sum = 0;while(n){int i = n % 10;sum += i * i;n /= 10;}return sum;}bool isHappy(int n) {int slow = n, fast = Sum(n); // 这里可不能 fast == n, 因为while的判断条件是slow == fastwhile(slow != fast){slow = Sum(slow);fast = Sum(Sum(fast));}return slow == 1;}
};

11 盛最多水的容器

在这里插入图片描述

个人解

思路:
在这里插入图片描述
每次让短的边移动。
移动完成后,重新计算容积V的大小,如果更大就替换

用时:10:00(通过,因为这题以前写过)
屎山代码:

class Solution {
public:int maxArea(vector<int>& height) {int ans = 0, left = 0, right = height.size() - 1;while(left < right){int v = min(height[left], height[right]) * (right - left);if(v > ans) ans = v;else{if(height[left] < height[right]){left++;}else{right--;}}}return ans;}
};

时间复杂度:O(n)
空间复杂度:O(1)


优质解:

个人解已经比较优秀的解法了,不再过多探索


611. 有效三角形的个数

在这里插入图片描述

个人解

思路:通过枚举 最大边 + 相向指针 求解。

  1. 先对数组进行排序,整个数组递增
  2. 枚举最大边cur,然后设置双指针:right = cur - 1left = 0
  3. 要满足可以形成三角形,就需要两个短边之和 > 最大边
  4. 又因为数组有递增性,如果当前的left,right,cur所指向的三个数可以形成三角形,则rightleftright之间的所有数组合也可以形成三角形,因为这些值>=left指向的值。
  5. 双指针的移动问题,要满足nums[left] + nums[right] > nums[cur],很明显:left左移,会让左式更大,right右移会让左式更小。所以当不满足条件的时候,left左移,当满足条件以后right右移。

但是,我在做题的时候一开始尝试 枚举最小边 + 相向指针 出现了问题:如果我枚举的是最小边,则要满足:nums[right] - nums[left] < nums[cur],这时候因为数组是递增的,就出现了问题。因为right左移,左式会变小,left右移左式也会变小,变化相同显然是行不通的。

用时:18:00
屎山代码(通过):

class Solution {
public:int triangleNumber(vector<int>& nums) {int ans = 0, n = nums.size();ranges::sort(nums); // ranges 是 C++20 引入的ranges库for(int cur = n - 1; cur > 1; cur--) // 枚举最长边{int left = 0, right = cur - 1;while(left < right){if(nums[left] + nums[right] > nums[cur]){ans += right - left;right--;}else{left++;}}}return ans;}
};

时间复杂度:O( n 2 n^2 n2)
空间复杂度:O(1)


优质解:

枚举最小边的处理方法:
用同向双指针(滑动窗口)。
leftright的指针越靠近的时候,两边的差值越小。
我们可以,一开始让rightleft足够接近,让[left, right]这个窗口里面的组合都满足nums[right] - nums[left] < nums[cur],即:可以构成三角形
如何实现呢?
只需要在满足nums[right] - nums[left] < nums[cur]的时候,让left右移,移动到第一个满足的地方就停下来,然后统计窗口内满足的个数,加入ans一组算完以后,让right右移变远,但是left无须倒退,因为right增大了,左式增大,这时候要找的是让左式更小的left(这个很关键,不然容易写成O( n 3 n^3 n3),我就是,进行了回退…),进行下一组的计算。

代码:

class Solution {
public:int triangleNumber(vector<int>& nums) {int ans = 0, n = nums.size();ranges::sort(nums); // ranges 是 C++20 引入的ranges库for(int cur = 0 ; cur < n - 2; cur++) // 枚举最短边{int left = cur + 1;for(int right = cur + 2; right < n; right++){while(left < right && nums[right] - nums[left] >= nums[cur]){left++;}ans += right - left;}}return ans;}
};

时间复杂度:O( n 2 n^2 n2)
空间复杂度:O(1)


🌈我的分享也就到此结束啦🌈
要是我的分享也能对你的学习起到帮助,那简直是太酷啦!
若有不足,还请大家多多指正,我们一起学习交流!
📢公主,王子:点赞👍→收藏⭐→关注🔍
感谢大家的观看和支持!祝大家都能得偿所愿,天天开心!!!

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

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

相关文章

吉尔吉斯斯坦工商会代表团赴齐河德瑞新能源汽车考察

德州齐河&#xff0c;2025年4月15日电 时中美贸易突变之际&#xff0c;乘国家一带一路之风。 展中国新能源之宏图&#xff0c;塑国贸体系之新方向。 今日上午&#xff0c;吉尔吉斯斯坦共和国工商会代表团一行三人受邀抵达济南&#xff0c;开启对德瑞新能源科技有限公司&…

【记录condapack打包环境到超算上顺利运行】

以安装CLRNet为例子 本地Linux系统上的操作步骤。 由于官方的安装包的步骤&#xff0c;执行condapack的时候会报错&#xff0c;所以使用以下步骤进行安装包。 安装其他 Python 依赖包 pip install -r requirements.txt✅ 二、构建并打包项目&#xff08;核心步骤&#xff…

Windows OpenUtau-v0.1.529-开源歌曲合成软件[提供MIDI编辑、歌词调整、音色修改 等功能,音乐创作者的必备工具]

Windows OpenUtau 链接&#xff1a;https://pan.xunlei.com/s/VONy_Refvo6_813Ig--nu5_rA1?pwdejzc# 引擎&#xff08;Resampler&#xff09;和拼接器&#xff08;Wavtool&#xff09;是UTAU协议中音频处理的两大组件。前端编辑器通过调用引擎和拼接器&#xff0c;对音频进行…

虚拟卡可以解决订阅 ChatGPT 时无法付款的问题

在全球掀起 AI 热潮的今天&#xff0c;因为工作的需要有些朋友要用ChatGPT&#xff0c;它也成为了不少人日常学习、工作、创作和编程的得力助手。然而&#xff0c;不少用户在尝试订阅 ChatGPT Plus&#xff08;付费版&#xff09;时&#xff0c;却遇到了一个令人头疼的问题——…

设计模式之状态模式:优雅管理对象行为变化

引言 状态模式&#xff08;State Pattern&#xff09;是一种行为型设计模式&#xff0c;它允许对象在其内部状态改变时改变它的行为&#xff0c;使对象看起来似乎修改了它的类。状态模式将状态转移逻辑和状态相关行为封装在独立的状态类中&#xff0c;完美解决了复杂条件判断问…

【算法】归并排序

算法系列七&#xff1a;归并排序 一、归并排序的递归探寻 1.思路 2.搭建 2.1设计过掉不符情况&#xff08;在最底层时&#xff09; 2.2查验能实现基础排序&#xff08;在最底层往上点时&#xff09; 2.3跳转结果继续往上回搭 3.实质 4.实现 二、递归的调用栈 1.递归的…

线束线缆从二维设计到虚拟验证全流程解决方案

一、传统设计中的痛点 线缆的开发设计是横跨多专业多学科的庞大工程&#xff0c;通常会划分为几大阶段逐次推进&#xff0c;由于每个阶段的工作任务不同&#xff0c;所以在不同设计阶段使用的工具也完全不同&#xff0c;由此导致整个设计流程中工程师常常要跨平台协作&#xf…

【智驾中的大模型 -1】自动驾驶场景中的大模型

1. 前言 我们知道&#xff0c;大模型现在很火爆&#xff0c;尤其是 deepseek 风靡全球后&#xff0c;大模型毫无疑问成为为中国新质生产力的代表。百度创始人李彦宏也说&#xff1a;“2025 年可能会成为 AI 智能体爆发的元年”。 随着科技的飞速发展&#xff0c;大模型的影响…

个人博客系统后端 - 注册登录功能实现指南

一、功能概述 个人博客系统的注册登录功能包括&#xff1a; 用户注册&#xff1a;新用户可以通过提供用户名、密码、邮箱等信息创建账号用户登录&#xff1a;已注册用户可以通过用户名和密码进行身份验证&#xff0c;获取JWT令牌身份验证&#xff1a;使用JWT令牌访问需要认证…

投行交易与风控系统的消费侧幂等架构设计与实战

1.背景和痛点 1.1 资金操作敏感性场景 核心需求&#xff1a; 交易唯一性&#xff1a;资金类操作必须保证全局唯一执行计算原子性&#xff1a;风控指标计算需具备事务性特征审计追溯&#xff1a;所有操作需保留完整幂等轨迹 1.2 业务损失统计 二、技术挑战与架构设计 2.1 分…

odoo-046 视图显示的 name 数据库中存储的不一样

文章目录 一、问题由来二、排查经过1. 问 deepseek2. 验证3. 新问题 三、 总结四、补充&#xff08;翻译模型 ir.translation 中 src 和 value 字段详解&#xff09; 一、问题由来 客户有多个公司&#xff0c;使用多个数据库。他们有时需要同步不同数据库之间的数据的需求。在…

充电宝项目:规则引擎Drools学习

文章目录 规则引擎 Drools1 问题2 规则引擎概述2.1 规则引擎2.2 使用规则引擎的优势2.3 规则引擎应用场景2.4 Drools介绍 3 Drools入门案例3.1 创建springboot项目 引入依赖3.2 添加Drools配置类3.4 创建实体类Order3.5 orderScore.drl3.6 编写测试类 4 Drools基础语法4.1 规则…

HTML、CSS 和 JavaScript 常见用法及使用规范

一、HTML 深度剖析 1. 文档类型声明 HTML 文档开头的 <!DOCTYPE html> 声明告知浏览器当前文档使用的是 HTML5 标准。它是文档的重要元信息&#xff0c;能确保浏览器以标准模式渲染页面&#xff0c;避免怪异模式下的兼容性问题。 2. 元数据标签 <meta> 标签&am…

基于CNN+ViT的蔬果图像分类实验

本文只是做一个简单融合的实验&#xff0c;没有任何新颖&#xff0c;大家看看就行了。 1.数据集 本文所采用的数据集为Fruit-360 果蔬图像数据集&#xff0c;该数据集由 Horea Mureșan 等人整理并发布于 GitHub&#xff08;项目地址&#xff1a;Horea94/Fruit-Images-Datase…

Ubuntu24.04安装libgl1-mesa-glx 报错,软件包缺失

在 Ubuntu 24.04 系统中&#xff0c;您遇到的 libgl1-mesa-glx 软件包缺失问题可能是由于该包在最新的 Ubuntu 版本中被重命名为 libglx-mesa0。以下是针对该问题的详细解决方案&#xff1a; 1. 问题原因分析 包名称变更&#xff1a;在 Ubuntu 24.04 中&#xff0c;libgl1-me…

webpack vite

​ 1、webpack webpack打包工具&#xff08;重点在于配置和使用&#xff0c;原理并不高优。只在开发环境应用&#xff0c;不在线上环境运行&#xff09;&#xff0c;压缩整合代码&#xff0c;让网页加载更快。 前端代码为什么要进行构建和打包&#xff1f; 体积更好&#x…

如何在爬虫中合理使用海外代理?在爬虫中合理使用海外ip

我们都知道&#xff0c;爬虫工作就是在各类网页中游走&#xff0c;快速而高效地采集数据。然而如果目标网站分布在多个国家或者存在区域性限制&#xff0c;那靠普通的网络访问可能会带来诸多阻碍。而这时&#xff0c;“海外代理”俨然成了爬虫工程师们的得力帮手&#xff01; …

数据仓库分层存储设计:平衡存储成本与查询效率

数据仓库分层存储不仅是一个技术问题,更是一种艺术:如何在有限的资源下,让数据既能快速响应查询,又能以最低的成本存储? 目录 一、什么是数据仓库分层存储? 二、分层存储的体系架构 1. 数据源层(ODS,Operational Data Store) 2. 数据仓库层(DW,Data Warehouse)…

YOLO学习笔记 | 基于YOLOv8的植物病害检测系统

以下是基于YOLOv8的植物病害检测系统完整技术文档,包含原理分析、数学公式推导及代码实现框架。 基于YOLOv8的智能植物病害检测系统研究 摘要 针对传统植物病害检测方法存在的效率低、泛化性差等问题,本研究提出一种基于改进YOLOv8算法的智能检测系统。通过设计轻量化特征提…

高级语言调用C接口(二)回调函数(4)Python

前面2篇分别说了java和c#调用C接口&#xff0c;参数为回调函数&#xff0c;回调函数中参数是结构体指针。 接下来说下python的调用方法。 from ctypes import * import sysclass stPayResult(Structure):_pack_ 4 # 根据实际C结构体的对齐方式设置&#xff08;常见值为1,4,…