【leetcode】双“指针”

 标题:【leetcode】双指针

水墨不写bug

我认为 讲清楚为什么要用双指针 比讲怎么用双指针更重要


(一)快乐数


编写一个算法来判断一个数 n 是不是快乐数。

「快乐数」 定义为:

  • 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
  • 然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。
  • 如果这个过程 结果为 1,那么这个数就是快乐数。

如果 n 是 快乐数 就返回 true ;不是,则返回 false 。

示例 1:

输入:n = 19
输出:true
解释:
1^2 + 9^2 = 82
8^2 + 2^2 = 68
6^2 + 8^2 = 100
1^2 + 0^2 + 0^2 = 1

示例 2:

输入:n = 2
输出:false

提示:

  • 1 <= n <= 2^31 - 1

题解:

        记快乐数转换的对应关系为f,每一次对应关系f处理后,相当于指针向后移动一次;

        由于一个数被 f  对应关系的映射后得到数的过程是不可逆转的-->【100 的得到方法不止一种:f(68) = 100;f(86) = 100, 所以知道f处理后的结果是100,但是无法确定f处理的源(原)数是谁】

        根据这一特征,我们可以想象一个数据结构,它类似于单链表,由此可以联想到我们之前已经做过的问题:

        链表是否成环 :链表可以仅仅是一条单链,也可以是像 “6” 一样链表,当环达到最大时,链表就成了 “0” 形。

        本题  可以 类比 判断链表是否有环 的思路,但是一种情况可以忽略:一条单链表。

为什么可以忽略?

在这条“链表”中,只可能存在 “1” 或者不存在 “1” 两种情况。

        如果存在“1”,由于对“1”进行 f 对应关系的映射后仍然等于 “1”,于是 “1” 单独成环

        如果不存在 “1”,对任意一个数,都可经过有限次f变换后得到它本身。

        (现在证明:对任意一个数,都可经过有限次f变换后得到它本身。

                   int类型的范围的数量级是10^9级【10亿级】,最大的int值小于9999999999,这个值经过f变换后得到的值——9^2+9^2+9^2+9^2+9^2+9^2+9^2+9^2+9^2=729;

由于规定的输入为正整数,这意味着f的值域为[1,729],考虑到整数平方后得到的结果一定是整数,所以一个数经过最多729次变换后,它的取值取便了[1,729]的任意值,如果再进行一次f变换,得到的结果一定会与之前的值重复,命题的证。)

 为什么选择双指针?

        经过分析,可以知本题的数据结构是一个 “6” 形的 “链表”,正常的遍历无法得到终止,根据  链表是否成环 的经验,可以想到用快慢指针的速度差来判断,如果在“链表中存在 “1””,那么两指针会在“1”相遇;否则,两指针会在环中的一个随机位置相遇。

(具体实现f函数名称为Bitsum) 

class Solution {
public://实现思路:取到这个数的每一位,平方后加到sum中;int Bitsum(int n){int sum = 0;while(n){int t = n%10;sum += t*t;         n/=10;}return sum;}bool isHappy(int n) {int slow = n,fast = Bitsum(n);while(slow!=fast){slow = Bitsum(slow);fast = Bitsum(Bitsum(fast));}return slow == 1;}
};

(二)盛水最多的容器


        给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。

        找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。

        返回容器可以储存的最大水量。

说明:你不能倾斜容器。

示例 1:

输入:[1,8,6,2,5,4,8,3,7]
输出:49 
解释:图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。

示例 2:

输入:height = [1,1]
输出:1

提示:

  • n == height.length
  • 2 <= n <= 10^5
  • 0 <= height[i] <= 10^4

如果解决一道题?

        首先,我会先理解这道题,通过分析示例,彻底理解题目的要求;

        其次,我最先想到的是暴力求解,为什么?通过分析历年大赛的标准答案解法,最优解法往往是在暴力求解的基础上,优化暴力求解来得到的。优先考虑暴力解法,再通过优化暴力求解算法来得到更优的算法;另外,对于暴力求解算法,一些特殊测试点往往是会超时的,没有办法得到高分;

        然后,分析时我发现这道题可以利用双指针来避免一些不必要的枚举结果,也就是上述的优化——优化是从多种层面的,需要一些经验积累。

        最后,自己写一些测试点和结果,对照写好的程序,在纸上一步一步走读代码;这些测试点的选取要考虑全面,防止漏情况。

        根据暴力求解算法,可以在数组中选择两个下标不重复的数,用较小的数 * 两数下标之差就是体积V,记录所有的V,最终返回最大的V即可;

        固定一个下标(left),让另一个下标(right)向右遍历,遍历完后,left++,类推;

我们把本题抽象为桶:

         既然存储最多的水,我们我们直接在遍历的过程中舍去 “短板”不就行了吗?留下最长的两个板,得到的结果V不就是最大的吗?

{               

                if(height[left] >= height[right])
                       right--;
                else
                       left++;

}

        这是有人会有疑问,板长了,但是不能保证宽度大啊,V要大,前提是痛的桶壁板子和桶的内径都很大。

        确实是这样的,但是不要忘了,我们还有这两句:

 {

                int v = min(height[left],height[right])*(right-left);
                ret = max(ret,v);

}

        由于ret在每次变更桶壁后都会更新,并且会选择较大的V覆盖原值;

        那么,就相当于在 不断增长桶壁的同时也可保存V在一系列变化中的最大值;

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

(三)有效三角形个数

给定一个包含非负整数的数组 nums ,返回其中可以组成三角形三条边的三元组个数。

示例 1:

输入: nums = [2,2,3,4]
输出: 3
解释:有效的组合是: 
2,3,4 (使用第一个 2)
2,3,4 (使用第二个 2)
2,2,3

示例 2:

输入: nums = [4,2,3,4]
输出: 4

提示:

  • 1 <= nums.length <= 1000
  • 0 <= nums[i] <= 1000
class Solution {
public:static int my_cmp(const void*a,const void*b)
{return *((int*)a) - *((int*)b);
}int triangleNumber(vector<int>& nums){int count = 0;int pmax = nums.size()-1,left = 0,right = pmax - 1;qsort(&nums[0],nums.size(),sizeof(nums[0]),my_cmp);for(; pmax>=2 ;pmax--){left = 0,right = pmax - 1;while(left < right){if(nums[left] + nums[right] > nums[pmax]) {count +=(right-left);--right;}else {++left;}}}return count;}
};

(四)总和为目标值的两个数

购物车内的商品价格按照升序记录于数组 price。请在购物车中找到两个商品的价格总和刚好是 target。若存在多种情况,返回任一结果即可。

示例 1:

输入:price = [3, 9, 12, 15], target = 18
输出:[3,15] 或者 [15,3]

示例 2:

输入:price = [8, 21, 27, 34, 52, 66], target = 61
输出:[27,34] 或者 [34,27]

提示:

  • 1 <= price.length <= 10^5
  • 1 <= price[i] <= 10^6
  • 1 <= target <= 2*10^6
class Solution {
public:vector<int> twoSum(vector<int>& price, int target) {int left = 0,right = price.size()-1;while(1){int sum = price[right] + price[left];if( sum> target) right--;else if(sum < target) left++;else break;}vector<int> it = {price[left],price[right]};return it;}
};

完~

未经作者同意禁止转载

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

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

相关文章

排序C++

题目 法1 sort升序排序&#xff0c;再逆序输出 #include<iostream> #include<algorithm> using namespace std;const int N 5e53;//注意const&#xff0c;全局 int a[N]; int main() {//错误int N5e53;//错误const int a[N];int n;cin >> n;for (int i 1;…

HBase Shell基本操作

一、进入Hbase Shell客户端 先在Linux Shell命令行终端执行start-dfs.sh脚本启动HDFS&#xff0c;再执行start-hbase.sh脚本启动HBase。如果Linux系统已配置HBase环境变量&#xff0c;可直接在任意目录下执行hbase shell脚本命令&#xff0c;就可进入HBase Shell的命令行终端环…

【容器源码篇】Set容器(HashSet,LinkedHashSet,TreeSet的特点)

文章目录 ⭐容器继承关系&#x1f339;Set容器&#x1f5d2;️HashSet源码解析构造方法public HashSet()public HashSet(Collection<? extends E> c)public HashSet(int initialCapacity, float loadFactor)HashSet(int initialCapacity, float loadFactor, boolean dum…

VLAN实验记录---对抗遗忘

sw1的接口6应该调成混杂模式&#xff0c;因为pc2,4,5,6的pvid各不相同而网段相同&#xff0c;所以往上去路由时应该剥离标记&#xff08;VLAN里面是标记而不是标签&#xff09;出去&#xff0c;这样 路由器上的物理接口用来管理不带标记的流量&#xff0c;而vlan2流量的往上打上…

记录 AI绘图 Stable Diffusion的本地安装使用,可搭建画图服务端

开头 最近刷短视频看到了很多关于AI绘图&#xff0c;Midjourney&#xff0c;gittimg.ai&#xff0c;Stable Diffusion等一些绘图AI工具&#xff0c;感受到了AI绘画的魅力。通过chatGPT生成关键词再加上绘图工具&#xff0c;真是完美&#xff0c;文末教大家如何用gpt提词 Midj…

每日算法之接雨水

题目描述 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 示例 1&#xff1a; 输入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,1] 输出&#xff1a;6 解释&#xff1a;上面是由数组 [0,1,0,2,1,0,1…

打造核心竞争力:高效Web系统数据中台的设计与实践_光点科技

在数字化的浪潮中&#xff0c;数据已经成为企业赖以生存和发展的核心资源。一个高效的Web系统数据中台&#xff0c;能够赋予企业在激烈的市场竞争中立于不败之地的能力。本文将深入探讨如何设计和实施一个能够提升企业数据管理水平和支持业务决策的高效数据中台架构。 数据中台…

【YOLOv8训练结果评估】YOLOv8如何使用训练好的模型对验证集进行评估及评估参数详解

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

P8623 [蓝桥杯 2015 省 B] 移动距离 Python

[蓝桥杯 2015 省 B] 移动距离 题目描述 X 星球居民小区的楼房全是一样的&#xff0c;并且按矩阵样式排列。其楼房的编号为 $1,2,3, \cdots $ 。 当排满一行时&#xff0c;从下一行相邻的楼往反方向排号。 比如&#xff1a;当小区排号宽度为 6 6 6 时&#xff0c;开始情形如…

腾讯云优惠券领取及使用常见问题解答

随着云计算的普及&#xff0c;腾讯云作为国内领先的云计算服务提供商&#xff0c;为越来越多的企业和个人提供了丰富的云产品和服务。为了帮助用户更好地了解和使用腾讯云优惠券&#xff0c;本文将为大家解答关于腾讯云优惠券领取及使用的常见问题。 一、腾讯云优惠券概述 腾讯…

软件设计师24--概念设计阶段

软件设计师24--概念设计阶段 考点1&#xff1a;概念设计过程考点2&#xff1a;E-R图属性E-R模型-联系类型判断例题&#xff1a;E-R模型-联系类型判断扩充的E-R模型 考点1&#xff1a;概念设计过程 需求分析 --> 抽象数据 --> 设计局部ER模型 --> 合并局部模型消除冲突…

二维前缀和与二维差分的表示

前缀和&#xff1a; 上述图片是求范围内的总和的图和公式 上述图片是初始化前缀和数组的图和公式 差分&#xff1a; 上图是差分公式 #include<iostream> #include<climits> #include<algorithm> #include<cstring> #include<cstdio> #include&l…

vue 借助vue-amap插件对高德地图的简单使用

需求&#xff1a;实现点击获取经纬度、定位、对特殊位置标点及自定义信息窗体功能。 高德地图的官网API&#xff1a;概述-地图 JS API 1.4 | 高德地图API vue-amap的中文文档&#xff1a;组件 | vue-amap 实现&#xff1a; 1、安装vue-amap插件 npm install vue-amap --save…

代码随想录第23天| 669. 修剪二叉搜索树 108.将有序数组转换为二叉搜索树 538.把二叉搜索树转换为累加树

669. 修剪二叉搜索树 669. 修剪二叉搜索树 - 力扣&#xff08;LeetCode&#xff09; 代码随想录 (programmercarl.com) 你修剪的方式不对&#xff0c;我来给你纠正一下&#xff01;| LeetCode&#xff1a;669. 修剪二叉搜索树_哔哩哔哩_bilibili 给你二叉搜索树的根节点 root …

大数据之scala

为什么学习scala spark是新一代内存级大数据计算框架&#xff0c;是大数据的重要内容 spark就是使用scala编写的&#xff0c;因此为了更好的学习spark&#xff0c;需要掌握scala这门语言 spark的兴起&#xff0c;带动scala语言的发展 scala发展历史 联邦理工学院的马丁 奥德…

17.注释和关键字

文章目录 一、 注释二、关键字class关键字 我们之前写的HelloWorld案例写的比较简单&#xff0c;但随着课程渐渐深入&#xff0c;当我们写一些比较难的代码时&#xff0c;在刚开始写完时&#xff0c;你知道这段代码是什么意思&#xff0c;但是等过了几天&#xff0c;再次看这段…

使用 OpenOCD 来调试 STM32

STM32 在 Windows 上的交叉编译二 调试 在上一篇博客 《在Windows上交叉编译STM32(环境搭建)》 &#xff0c;已经让 CubeMX 生成的工程成功编译&#xff0c;并下载到板子上了。 这篇博客主要继续介绍接下来的步骤&#xff0c;调试。硬件是使用的 ST-LINK &#xff0c;别的也无…

C++基础11:模板与命名空间

此专栏为移动机器人知识体系下的编程语言中的 C {\rm C} C从入门到深入的专栏&#xff0c;参考书籍&#xff1a;《深入浅出 C {\rm C} C》(马晓锐)和《从 C {\rm C} C到 C {\rm C} C精通面向对象编程》(曾凡锋等)。 10.模板与命名空间 10.1 模板简述 模板使函数和类的处理对象…

API数据接口开发tglobal淘宝海外获得淘宝商品详情数据、商品ID、商品标题、价格、销量、规格属性等参数接入请求演示

要获取淘宝海外的商品详情、商品ID、商品标题、价格、销量、规格属性等参数&#xff0c;你可以使用淘宝海外的API。以下是一个简单的Python示例&#xff0c;使用requests库来调用淘宝海外的API。 首先&#xff0c;你需要注册一个开放平台账号并创建一个应用&#xff0c;以获取…

春秋云境CVE-2022-24663

简介 远程代码执行漏洞&#xff0c;任何订阅者都可以利用该漏洞发送带有“短代码”参数设置为 PHP Everywhere 的请求&#xff0c;并在站点上执行任意 PHP 代码。P.S. 存在常见用户名低权限用户弱口令 正文 进入首页我们没看到任何有价值的东西&#xff0c;那么就只好去寻找…