【算法】双指针——leetcode盛最多水的容器、剑指Offer57和为s的两个数字

在这里插入图片描述
在这里插入图片描述
盛水最多的容器

(1)暴力解法

  算法思路:我们枚举出所有的容器大小,取最大值即可。

  容器容积的计算方式:

  设两指针 i , j ,分别指向水槽板的最左端以及最右端,此时容器的宽度为 j - i 。由于容器的高度由两板中的较短的板决定,因此可得容积公式 :
v = (j - i) * min( height[i] , height[j] );

class Solution {
public:int maxArea(vector<int>& height) {int n=height.size();int ret=0;//枚举出所有的容器大小for(int i=0;i<n;i++){for(int j=i+1;j<n;j++){//计算当前的容器容量int v=(j-i)*(min(height[i],height[j]));ret=max(ret,v);//取最大容量的容器}}return ret;}
};

在这里插入图片描述

  当然由于两次遍历数组,所以时间复杂度为O(N2),会超时。


(2)对撞指针

  算法思路:我们设置两个指针left、right分别指向容器的两个端点(因为这里的是数组,数组在内存中的储存是连续的,而且数组是通过它们的下表访问,所有我们可以把数组下标看成是指针进行操作)不断修改左右的端点来获得容器的最大容量。

  容器的左边界为 height[left] ,右边界为 height[right] 。

  我们假设「左边边界」小于「右边边界」。

  水的容积会有如下变化形式:

  首先容器的宽度⼀定变小。由于左边界较小,决定了水的高度。如果改变左边界,新的水面高度不确定,但是⼀定不会超过右边的柱子高度,因此容器的容积可能会增大或者减小。

  但是如果改变右边界,无论右边界移动到哪⾥,新的水面的高度⼀定不会超过左边界,也就是现在左边界的所在的水面高度,但是由于容器的宽度减小,因此容器的容积一定会变小。

  综上,我们不断选取左右两个边界中的较大边界,以保留当下的最有解,不断的 left++ 或right–,直到left和right相遇。

class Solution {
public:int maxArea(vector<int>& height) {int left=0;int right=height.size()-1;int ret=0;//循环条件为右边界大于左边界while(left<right){//计算当前容器的容量int v=(right-left)*(min(height[left],height[right]));ret=max(v,ret);//不断更新容器的最大容量if(height[left]>height[right]) right--;//不断更新左右高度else left++;                           //保留高的,舍弃较矮的高}return ret;}
};

时间复杂度:O(N)
在这里插入图片描述


在这里插入图片描述

和为s的两个数字

  和两数之和不同的是,该数组中的元素是有序的,而且使用暴力解法会超时。

(1)对撞指针

这里有三种情况:

  当 nums[left] + nums[right] == target时,说明找到结果,记录结果,并且返回;

  当 nums[left] + nums[right] < target 时,此时 nums[right] 相当于是 nums[left] 能碰到的最大值。如果此时不符合要求,说明我们需要增加这两个数之和,所以我们让left++,再取更大的数,以来靠近我们的目标和。

  当 nums[left] + nums[right] > target 时,说明我们所取的两数较大,所以我们应该减小这两个数之和,让right–,以此使得两数的总和变小,以此来靠近我们的目标和。不断比较下⼀组数据,直至两数和和目标和相等。

class Solution {
public:vector<int> twoSum(vector<int>& nums, int target) {int left=0;int right=nums.size()-1;while(left<right){//如果两数和等于目标值,直接返回if(nums[left]+nums[right]==target){return {nums[left],nums[right]};}//如果两数和大于目标值,right--else if(nums[left]+nums[right]>target){right--;}//如果两数和小于目标值,left++    else{left++;}}//照顾编译器,返回一个不存在的数组return {-1141514};}
};

时间复杂度:O(N)
在这里插入图片描述

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

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

相关文章

【CDH集群】无法发出查询:Host Monitor未运行

无法发出查询:Host Monitor未运行 【CDH集群】无法发出查询:Host Monitor未运行同事的解决方案解决方法&#xff1a;删除原uuid重启agent查看新uuid修改scm数据库中HOSTS表中的agent的uuid 【CDH集群】无法发出查询:Host Monitor未运行 起初是impala报错&#xff0c;连接不上&…

使用 React Native CLI 创建项目

React Native 安装的先决条件和设置 需要掌握的知识点 掌握 JavaScript 基础知识掌握 React 相关基础知识掌握 TypeScript 相关基础知识 安装软件前需要首先安装Chocolatey。Chocolatey 是一种流行的 Windows 包管理器。 安装 nodejs 和 JDK choco install -y nodejs-lts …

【工作记录】mysql中实现分组统计的三种方式

前言 实际工作中对范围分组统计的需求还是相对普遍的&#xff0c;本文记录下在mysql中通过函数和sql完成分组统计的实现过程。 数据及期望 比如我们获取到了豆瓣电影top250&#xff0c;现在想知道各个分数段的电影总数. 表数据如下: 期望结果: 实现方案 主要思路是根据s…

解决Vue+Element-UI 进行From表单校验时出现了英文提示问题

说明&#xff1a;该篇博客是博主一字一码编写的&#xff0c;实属不易&#xff0c;请尊重原创&#xff0c;谢谢大家&#xff01; 问题描述 在使用form表单时&#xff0c;往往会对表单字段进行校验&#xff0c;字段为必填项时会添加required属性&#xff0c;此时自定义rules规则…

RabbitMQ 消息队列

文章目录 &#x1f370;有几个原因可以解释为什么要选择 RabbitMQ&#xff1a;&#x1f969;mq之间的对比&#x1f33d;RabbitMQ vs Apache Kafka&#x1f33d;RabbitMQ vs ActiveMQ&#x1f33d;RabbitMQ vs RocketMQ&#x1f33d;RabbitMQ vs Redis &#x1f969;linux docke…

MyBatis Plus-个人笔记

前言 学习视频 尚硅谷-Mybatis-Plus教程学习主要内容 本文章记录尚硅谷-Mybatis-Plus教程内容&#xff0c;只是作为自己学习笔记&#xff0c;如有侵扰请联系删除 一、MyBatis-Plus简介 1、简介 MyBatis-Plus&#xff08;简称 MP&#xff09;是一个 MyBatis的增强工具&#…

用python来爬取某鱼的商品信息(1/2)

目录 前言 第一大难题——找到网站入口 曲线救国 模拟搜索 第二大难题——登录 提一嘴 登录cookie获取 第一种 第二种 第四大难题——无法使用导出的cookie 原因 解决办法 最后 出现小问题 总结 前言 本章讲理论&#xff0c;后面一节讲代码 拿来练练手的&#xff…

聊城大学823软件工程考研

1.什么是软件工程?它目标和内容是什么? 软件工程就是用科学的知识和技术原理来定义&#xff0c;开发&#xff0c;维护软件的一门学科。 软件工程目标&#xff1a;付出较低开发成本&#xff1b;达到要求的功能&#xff1b;取得较好的性能&#xff1b;开发的软件易于移植&…

使用 Python 中的 Langchain 从零到高级快速进行工程

大型语言模型 (LLM) 的一个重要方面是这些模型用于学习的参数数量。模型拥有的参数越多,它就能更好地理解单词和短语之间的关系。这意味着具有数十亿个参数的模型有能力生成各种创造性的文本格式,并以信息丰富的方式回答开放式和挑战性的问题。 ChatGPT 等法学硕士利用 T

秋招算法备战第41天 | 343. 整数拆分、96.不同的二叉搜索树

343. 整数拆分 - 力扣&#xff08;LeetCode&#xff09; 数学方法 观察数字拆分的模式&#xff0c;我们可以发现以下事实&#xff1a; 将数字拆分为尽可能多的3会使乘积最大化。这是因为当 n > 4 时&#xff0c;3(n-3) > n&#xff0c;所以我们总是更喜欢3的拆分&…

【Spring专题】Spring底层核心原理解析

目录 前言阅读导航前置知识Q1&#xff1a;你能描述一下JVM对象创建过程吗&#xff1f;Q2&#xff1a;Spring的特性是什么&#xff1f;前置知识总结 课程内容一、Spring容器的启动二、一般流程推测2.1 扫描2.2 IOC2.3 AOP 2.4 小结三、【扫描】过程简单推测四、【IOC】过程简单推…

laravel\lumen rabbitmq

1、安装扩展 composer require bschmitt/laravel-amqp 2、config文件下增加amqp.php配置文件 <?phpreturn [/*|--------------------------------------------------------------------------| Define which configuration should be used|----------------------------…

c++ STL--容器 (第二部分)

c STL–容器 &#xff08;第二部分&#xff09; 1.vector向量&#xff08;序列性容器&#xff09; 1.特点&#xff1a; ​ 数据的存储访问比较方便&#xff0c;可以像数组一阿姨那个使用[index]访问或修改值&#xff0c;适用于对元素修改和查看比较多的情况&#xff0c;对于…

数据库--MySQL

一、什么是范式&#xff1f; 范式是数据库设计时遵循的一种规范&#xff0c;不同的规范要求遵循不同的范式。 最常用的三大范式 第一范式(1NF)&#xff1a;属性不可分割&#xff0c;即每个属性都是不可分割的原子项。(实体的属性即表中的列) 第二范式(2NF)&#xff1a;满足…

代码随想录day03

链表理论基础 ● 链表是一种通过指针串联在一起的线性结构&#xff0c;每一个节点有两个部分&#xff0c;数据域和指针域&#xff0c;最后一个节点指针域指向null 链表类型 ● 单链表 ● 双链表 ○ 每个节点有两个指针域&#xff0c;一个指向下一个节点&#xff0c;一个是上…

企业级帮助中心编写方案怎么写?

在现代商业环境中&#xff0c;为客户提供高效的支持和解决方案至关重要。企业级帮助中心是一个集中管理和呈现常见问题和解答的平台&#xff0c;可以为客户提供快速、便捷的自助帮助。本文将提供一个企业级帮助中心编写方案&#xff0c;旨在帮助企业提供优质的客户支持&#xf…

【ARM 嵌入式 编译系列 3.1 -- GCC __attribute__((used)) 使用】

文章目录 __attribute__((used)) 属性介绍代码演示编译与输出GCC 编译选项 上篇文章&#xff1a;ARM 嵌入式 编译系列 3 – GCC attribute((weak)) 弱符号使用 下篇文章&#xff1a;ARM 嵌入式 编译系列 3.2 – glibc 学习 __attribute__((used)) 属性介绍 在普通的 C/C 程序中…

20.4 HTML 表单

1. form表单 <form>标签: 用于创建一个表单, 通过表单, 用户可以向网站提交数据. 表单可以包含文本输入字段, 复选框, 单选按钮, 下拉列表, 提交按钮等等. 当用户提交表单时, 表单数据会发送到服务器进行处理.action属性: 应指向一个能够处理表单数据的服务器端脚本或UR…

在SpringBoot项目中使用线程池创建一个线程案例

目录 1. 首先,在你的Spring Boot项目的配置类中,创建一个`ThreadPoolTaskExecutor`的Bean:2. 在你的Service类中,创建一个异步方法,并使用`@Async`注解将其标记为异步方法,该方法将在线程池中执行:3. 在Controller中调用异步方法:在Spring Boot项目中使用线程池可以通过…

React入门学习笔记3

事件处理 通过onXxx属性指定事件处理函数(注意大小写) React使用的是自定义(合成)事件, 而不是使用的原生DOM事件——为了更好的兼容性 eg&#xff1a;οnclick》onClickReact中的事件是通过事件委托方式处理的(委托给组件最外层的元素)——为了更高效通过event.target得到发生…