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

力扣热题100道-双指针篇

文章目录

    • 双指针
      • 283.移动零
      • 11.盛最多水的容器
      • 15.三数之和
      • 42.接雨水

双指针

283.移动零

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

请注意 ,必须在不复制数组的情况下原地对数组进行操作。

示例 1:

输入: nums = [0,1,0,3,12]
输出: [1,3,12,0,0]

示例 2:

输入: nums = [0]
输出: [0]
/*
思路:双指针算法
将不等于0的挪到前面,后面全部补为0
*/
class Solution {
public:void moveZeroes(vector<int>& nums) {int i=0,j=0;for(auto c:nums){if(c!=0){nums[j++]=c;                }}for(j;j<nums.size();j++) nums[j] = 0;}
};

11.盛最多水的容器

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

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

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

说明:你不能倾斜容器。

示例 1:

img

输入:[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
/*
思路 左右往里面夹着,每次以最低的为高,算个面积 一直算直到两者相等,求出最高即可
//先将i往里挪 还是先将j往里挪呢? 注意是先挪低的那一方
在每个状态下,无论长板或短板向中间收窄一格,都会导致水槽 底边宽度 −1 变短:
若向内 移动短板 ,水槽的短板 min(h[i],h[j]) 可能变大,因此下个水槽的面积 可能增大 。
若向内 移动长板 ,水槽的短板 min(h[i],h[j]) 不变或变小,因此下个水槽的面积 一定变小 。
*/
class Solution {
public:int maxArea(vector<int>& height) {int i=0,j=height.size()-1;int res = 0;while(i<j){int min = height[i]<height[j]?height[i]:height[j];//先将i往里挪 还是先将j往里挪呢? 先挪低的res = max(min*(j-i),res);  if(height[i]<height[j]) i++;else j--;            }return res;}
};

15.三数之和

给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != ji != kj != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请

你返回所有和为 0 且不重复的三元组。

注意:答案中不可以包含重复的三元组。

示例 1:

输入:nums = [-1,0,1,2,-1,-4]
输出:[[-1,-1,2],[-1,0,1]]
解释:
nums[0] + nums[1] + nums[2] = (-1) + 0 + 1 = 0 。
nums[1] + nums[2] + nums[4] = 0 + 1 + (-1) = 0 。
nums[0] + nums[3] + nums[4] = (-1) + 2 + (-1) = 0 。
不同的三元组是 [-1,0,1] 和 [-1,-1,2] 。
注意,输出的顺序和三元组的顺序并不重要。

示例 2:

输入:nums = [0,1,1]
输出:[]
解释:唯一可能的三元组和不为 0 。

示例 3:

输入:nums = [0,0,0]
输出:[[0,0,0]]
解释:唯一可能的三元组和为 0 。
/*
思路:
先对数组进行排序  三指针 i j k,固定i j往右增大 k往左缩小
主要设置去除重复值,前面出现的不用去除 如 -1 -1 2, -2 1 1 遇到第一个重复的可能会用到后面的值不用去重,后面重复的需要去除
*/
class Solution {
public:vector<vector<int>> threeSum(vector<int>& nums) {sort(nums.begin(),nums.end());vector<vector<int>>res;for(int i=0;i<nums.size();i++){//将i固定            if(i&&nums[i] == nums[i-1]) continue;for(int j=i+1,k=nums.size()-1;j<k;j++){if(j>i+1 && nums[j] == nums[j-1]) continue;while(j<k && nums[i]+nums[j]+nums[k]>0) k--;if(j<k && nums[i]+nums[j]+nums[k] == 0) res.push_back({nums[i],nums[j],nums[k]});}}return res;}
};

42.接雨水

给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。

示例 1:

img

输入:height = [0,1,0,2,1,0,1,3,2,1,2,1]
输出:6
解释:上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。

示例 2:

输入:height = [4,2,0,3,2,5]
输出:9
/*
实现思路  //针对除第一个和最后一个柱子 找左边最大的右边最大的 的最小值(包括本身) -当前高度
*/
class Solution {
public:int trap(vector<int>& height) {//针对除第一个和最后一个柱子 找左边最大的右边最大的(包括本身)-当前高度int n = height.size();vector<int> left(n),right(n);left[0]=height[0],right[n-1] = height[n-1];for(int i=1;i<height.size();i++){left[i] = max(left[i-1],height[i]);right[n-i-1] = max(right[n-i],height[n-i-1]);}int res = 0;for(int i=1;i<n-1;i++){res += min(left[i],right[i]) - height[i];}return res;}
};

相关文章:

  • Flink1.17实战教程(第五篇:状态管理)
  • 文件操作安全之-目录穿越流量告警运营分析篇
  • Spring Boot整合RocketMQ
  • SSH秘钥登录服务器
  • Mybatis 动态 SQL - if
  • day44 1228
  • STM32 基础知识(探索者开发板)--93讲 PWM
  • 65.乐理基础-打拍子-前附点、后附点
  • Redis实现限流
  • 数字调制学习总结
  • R语言中的函数28:Reduce(), Filter(), Find(), Map(), Negate(), Position()
  • cpp_07_类型转换构造_析构函数_深拷贝_静态成员
  • 面试官:BIO、NIO、AIO的区别
  • 【AIGC_MIDJOURNEY】专业提示词+配图分析
  • python3处理docx并flask显示
  • SegmentFault for Android 3.0 发布
  • [rust! #004] [译] Rust 的内置 Traits, 使用场景, 方式, 和原因
  • 2019年如何成为全栈工程师?
  • Android路由框架AnnoRouter:使用Java接口来定义路由跳转
  • codis proxy处理流程
  • egg(89)--egg之redis的发布和订阅
  • ES10 特性的完整指南
  • golang 发送GET和POST示例
  • JavaScript异步流程控制的前世今生
  • JS笔记四:作用域、变量(函数)提升
  • js写一个简单的选项卡
  • LeetCode算法系列_0891_子序列宽度之和
  • nodejs调试方法
  • PHP 程序员也能做的 Java 开发 30分钟使用 netty 轻松打造一个高性能 websocket 服务...
  • vuex 学习笔记 01
  • 分布式任务队列Celery
  • 给github项目添加CI badge
  • 树莓派 - 使用须知
  • 思维导图—你不知道的JavaScript中卷
  • 微信小程序上拉加载:onReachBottom详解+设置触发距离
  • 小李飞刀:SQL题目刷起来!
  • gunicorn工作原理
  • 资深实践篇 | 基于Kubernetes 1.61的Kubernetes Scheduler 调度详解 ...
  • ​LeetCode解法汇总1276. 不浪费原料的汉堡制作方案
  • ​批处理文件中的errorlevel用法
  • # Apache SeaTunnel 究竟是什么?
  • #在 README.md 中生成项目目录结构
  • (10)工业界推荐系统-小红书推荐场景及内部实践【排序模型的特征】
  • (Matalb回归预测)PSO-BP粒子群算法优化BP神经网络的多维回归预测
  • (ZT) 理解系统底层的概念是多么重要(by趋势科技邹飞)
  • (安全基本功)磁盘MBR,分区表,活动分区,引导扇区。。。详解与区别
  • (分享)自己整理的一些简单awk实用语句
  • (六)Hibernate的二级缓存
  • (排序详解之 堆排序)
  • (十七)Flask之大型项目目录结构示例【二扣蓝图】
  • (一)pytest自动化测试框架之生成测试报告(mac系统)
  • (转)为C# Windows服务添加安装程序
  • .Net 高效开发之不可错过的实用工具
  • .NET/C# 项目如何优雅地设置条件编译符号?
  • .NET中GET与SET的用法