【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.rhkb.cn/news/287936.html

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

相关文章

我们常用Linux命令总结

Linux作为一种自由和开放源代码的操作系统&#xff0c;广泛应用于各种计算机系统中&#xff0c;尤其是服务器环境。在Linux系统中&#xff0c;命令行是管理和操作系统的主要方式之一&#xff0c;熟练掌握常用的Linux命令对于系统管理员、开发人员和其他使用者来说都是至关重要的…

HDLBits刷题Day28,3.2.5.14 3.2.5.14 one-hot FSM

3.2.5.14 one-hot FSM 问题描述 给定以下具有 1 个输入和 2 个输出的状态机&#xff1a; 假设此状态机使用 one-hot 编码&#xff0c;其中state[0]到state[9]分别对应于状态 S0 到 S9。除非另有说明&#xff0c;否则输出为零。 仅实现状态机的状态转换逻辑和输出逻辑部分。您在…

Jsonpath - 数据中快速查找和提取的强大工具

JSON&#xff08;JavaScript Object Notation&#xff09;在现代应用程序中广泛使用&#xff0c;但是如何在复杂的JSON数据中 查找和提取所需的信息呢&#xff1f; JSONPath是一种功能强大的查询语言&#xff0c;可以通过简单的表达式来快速准确地定位和提取JSON数据。本文将介…

Spring boot2.X 配置https

背景 最近项目组说要将 http 升级成 https 访问&#xff0c;证书也给到我们这边了&#xff0c;当然我们这边用的是个二级域名&#xff0c;采用的是通配符访问的方式&#xff0c;比如一级域名是这样&#xff08;com.chinaunicom.cn&#xff09;&#xff0c;我们的则是&#xff0…

css预处理器scss的使用如何全局引入

目录 scss 基本功能 1、嵌套 2、变量 $ 3、mixin 和 include 4、extend 5、import scss 在项目中的使用 1、存放 scss 文件 2、引入 variables 和 mixins 2-1、局部引入 2-2、全局引入 3、入口文件中引入其他文件 项目中使用 css 预处理器&#xff0c;可以提高 cs…

【面试】Elasticsearch 在部署时,对 Linux 的设置有哪些优化方法?

Elasticsearch 在部署时&#xff0c;对 Linux 的设置有哪些优化方法&#xff1f; Elasticsearch是一个分布式搜索和分析引擎&#xff0c;它在Linux环境下的性能和稳定性可以通过一些优化方法进行提升。以下是一些针对Linux环境下Elasticsearch部署的优化方法&#xff1a; 1. 内…

一文搞懂大疆机场kmz航线和图新地球导出的kmz的区别

0序&#xff1a; 近期有用户问“ 把KML文件放到图新后&#xff0c;想转出来KMZ&#xff08;大疆的机场用的格式&#xff09;但是转出来的KMZ显示格式不对 ” 之前只是知道大疆的航线规划采用的是kml规范&#xff0c;但具体是什么样并不清楚。就这这个问题把这个事情给弄明白。…

京东电商数据采集的三种方式|电商数据API接口实时数据采集

要实现电商的数据分析&#xff0c;电商数据采集是很重要的一环。电商数据采集要分几个步骤完成&#xff1f;每个步骤的意义是什么&#xff1f;每个步骤分别需要怎样的技能&#xff1f;今天这篇文章告诉你。 电商的数据通常需要通过数据采集的方式获得。电商数据采集方法共分为…

Java入门之数据类型

一、数据类型 基本数据类型 &#xff08;1&#xff09;如果要定义“long类型的变量要在数值后面加一个L作为后缀” &#xff08;2&#xff09;如果要定义float类型的变量的时候数据值也要加一个作为后缀 小结&#xff1a; 练习 内容&#xff1a; 姓名&#xff1a;巴巴托斯 &…

软件测试技术之登录页面测试用例的设计方法

相信大家都有过写登录测试用例的经验&#xff0c;相较于开发人员编写代码而言&#xff0c;测试人员编写用例同样重要。本文作者总结了一些关于登录用例的经验。 一、功能测试用例设计&#xff1a; 1、正常登录场景 测试用例1&#xff1a;输入正确的用户名和密码&#xff0c;验证…

JVM(五)——类加载阶段

一、类加载阶段 一个类型从被加载到虚拟机内存中开始&#xff0c;到卸载出内存为止&#xff0c;它的整个生命周期将会经历加载 &#xff08;Loading&#xff09;、验证&#xff08;Verification&#xff09;、准备&#xff08;Preparation&#xff09;、解析&#xff08;Resol…

Docker构建多平台(x86,arm64)构架镜像

这里写自定义目录标题 背景配置buildx开启experimental重启检查 打包 背景 docker镜像需要支持不同平台架构 配置buildx 开启experimental vi /etc/docker/daemon.json {"experimental": true }或者 重启检查 # 验证buildx版本 docker buildx version# 重启do…

Oracle参数文件详解

1、参数文件的作用 参数文件用于存放实例所需要的初始化参数&#xff0c;因为多数初始化参数都具有默认值&#xff0c;所以参数文件实际存放了非默认的初始化参数。 2、参数文件类型 1&#xff09;服务端参数文件&#xff0c;又称为 spfile 二进制的文件&#xff0c;命名规则…

Set和Map数据结构

Set和Map数据结构理解 Set&#xff1a; 1、es6新的数据结构&#xff0c;类似数组&#xff0c;但成员唯一 2、实例属性&#xff1a;Set.prototype.size返回Set实例的成员总数 3、操作方法&#xff1a;add、delete、has、clear 4、遍历操作&#xff1a;forEach、keys、values、en…

前端 CSS 经典:grid 栅格布局

前言&#xff1a;Grid 布局是将容器划分成"行"和"列"&#xff0c;产生单元格&#xff0c;然后将"项目"分配给划分好的单元格&#xff0c;因为有行和列&#xff0c;可以看作是二维布局。 一 术语 1. 容器 采用网格布局的区域&#xff0c;也就是…

MySQL使用教程:数据库、表操作

目录 1. 免密码登录MySQL1.1 免密码配置1.2 登录选项介绍 2. MySQL基础配置&#xff1a;my.cnf3. 开机自启动设置&#xff08;可选设置&#xff09;4. 查看存储引擎5. 查看系统的编码规则和校验规则6. 数据库的操作6.1 查看数据库6.2 创建数据库 create database6.3 删除数据库…

航空实时监控

1、从Kafka中读取飞机数据&#xff0c;并进行清洗 此步骤在前面的“使用Spark清洗统计业务数据并保存到数据库中”任务阶段应该已经完成。如果没有完成&#xff0c;请参考源代码自行完成。核心类主要有三个&#xff1a;SparkStreamingApplication类、SparkUtil类和MapManager类…

3.1 SQL概述

SQL&#xff08;Structured Query Language&#xff09; 结构化查询语言&#xff0c;是关系数据库的标准语言 SQL是一个通用的、功能极强的关系数据库语言 功能&#xff1a;查询&#xff0c;数据库模式创建&#xff0c;数据库数据的插入与修改&#xff0c;数据库完整性、安全…

pytest之fixture结合conftest.py文件使用+断言实战

pytest之fixture结合conftest.py文件使用 conftest.py--存放固件固件的优先级pytest执行流程pytest之断言实战pytest结合allure-pytest插件生成美观的报告 conftest.py–存放固件 在一个项目的测试中&#xff0c;大多数情况下会有多个类、模块、或者包要使用相同的测试夹具。这…

如何使用PHP和RabbitMQ实现延迟队列(方式一)?

前言 今天我们来做个小试验&#xff0c;用PHP和RabbitMQ实现消息队列的延迟功能。 前期准备&#xff0c;需要安装好docker、docker-compose的运行环境。 需要安装RabbitMQ的可以看下面这篇文章。 如何使用PHP和RabbitMQ实现消息队列&#xff1f;-CSDN博客 一、安装RabbitM…