leetcode-hot100-双指针

剪枝,减少不必要的计算

283. 移动零

示例 1:

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

示例 2:

输入: nums = [0]
输出: [0]

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

第一印象:使用一个辅助数组,同时以0进行初始化,遍历nums,依次将非零元素复制到辅助数据中;最后将辅助数组赋值给原数组。
但是,题目要求不复制数组原地修改数据进行操作。

想办法直接修改原数组,我们使用两个指针,p1、p2分别表示新数组中可以插入元素的下标,当前数组中遍历的元素;遍历数组时,找到非零元素同时将元素保存到p1下–通过交换元素实现,如果是非零元素,则继续遍历。

p1 = 0for p2 in range(len(nums)):if nums[p2] != 0:nums[p1], nums[p2] = nums[p2], nums[p1]p1 += 1
class Solution(object):def moveZeroes(self, nums):""":type nums: List[int]:rtype: None Do not return anything, modify nums in-place instead."""if not nums:return 0j = 0for i in range(len(nums)):if nums[i]:nums[j], nums[i] = nums[i], nums[j]j += 1

11. 盛最多水的容器

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

朴素思路:查找所有可以盛水的容器,计算容量,找到最多水的容器。使用双层循环。
容器的容量 = 两边的短板高度 x 容器长度,

result = 0
for i in range(N):for j in range(i+1, N):temp = min(nums[i], nums[j]) * (j - i)result = max(result, temp)return result

这种思路中,计算所有可能的容器,因此复杂度过高。所以,优化思路是减少循环次数,去掉不必要的解。同样采用双指针(ps:双循环也算一种双指针),left,right初始化为0、N-1,数组的起始和终止位置–容器长度最大。此时计算一下容量,之后移动left和right中的小值。

left, right = 0, N - 1result = 0
while left < right:temp = min(nums[left], nums[right]) * (right - left)result = max(result, temp)if nums[left] < nums[right]:left += 1else:right -=1return result
class Solution:def maxArea(self, height: List[int]) -> int:i, j, res = 0, len(height) - 1, 0while i < j:temp = min(height[i], height[j]) * (j - i)res = max(res, temp)if height[i] < height[j]:i += 1else:j -= 1return res

15.三数之和

示例 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 。

朴素思路:3层循环/三指针,查找所有3元组,判断和是否等于0,通过限制i、j、k的取值范围保证可以保证不重复取值,但是无法保证没有重复的三元组,所以一种思路就是找到所有解最后去重。
缺点是时间复杂度过高。

另一种思路,类似于两数之和, 外围一层循环,内层循环查找两数之和等于0-nums[i]的数组,如果找到,加入到结果中,同时进行去重操作,将数组中前后等于当前元素的下标都跳过(所以,最先一步是排序,保证相同元素都连续出现,方便后续进行去重操作),这里去重之后,就不用最后对结果去重。


class Solution:def threeSum(self, nums: List[int]) -> List[List[int]]:n = len(nums)if n < 3:return []nums.sort()res = []for i in range(n):if nums[i] > 0: # 剪枝:第一个元素>0,则一定不会出现对应的3元组;排序后return resif i > 0 and nums[i] == nums[i-1]:#去重continueL = i + 1R = n - 1while L < R:if nums[i]+nums[L]+nums[R] == 0:res.append([nums[i],nums[L],nums[R]])L = L + 1R = R - 1while L < R and nums[L] == nums[L-1]:#去重L = L + 1while L < R and nums[R] == nums[R+1]:#去重R=R-1elif nums[i] + nums[L] + nums[R] >0:R = R - 1else:L = L + 1return res

42. 接雨水

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

**输入: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 个单位的雨水(蓝色部分表示雨水)。

我们需要做两点:1.判断当前位置能否可以接雨水?2. 如果可以,雨水容量是多少
能否接:需要判断当前点是否为一个凹点,即当前点的左边、右边是否有高于当前位置的元素,如果有,其容量 = min(max_left, max_right) - height[i]

class Solution:def trap(self, height: List[int]) -> int:ans = 0 ml = [0] * len(height)mr = [0] * len(height)for i in range(1, len(height)):ml[i] = max(ml[i - 1], height[i - 1])for i in range(len(height) - 2, -1, -1):mr[i] = max(mr[i + 1], height[i + 1])for i in range(1, len(height) - 1):tmp = min(ml[i], mr[i])if height[i] < tmp:ans += tmp - height[i]    return ans
class Solution {
public:int trap(vector<int>& height) {int n = height.size();int left = 0, right = n - 1;int leftMax = height[left], rightMax = height[right];++left, --right;int ans = 0;while(left <= right) {leftMax = max(leftMax, height[left]);rightMax = max(rightMax, height[right]);if(leftMax < rightMax) {ans += leftMax - height[left];left++;}else {ans += rightMax - height[right];right--;}}return ans;}
};

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

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

相关文章

python常用文件操作

1.文件夹创建&#xff0c;删除&#xff0c;重命名&#xff0c;路径连接&#xff0c;文件打开&#xff0c;关闭读写 #文件夹创建 path ./test newpath "./new" #判断文件夹是否存在 ret os.path.exists(path) if ret:pass else:#创建文件夹os.mkdir(path)#文件夹重…

【数据结构】时间复杂度与空间复杂度

目录 时间复杂度 空间复杂度 时间复杂度 算法的时间复杂度并不是指一个代码运行时间的快慢&#xff0c;因为在不同机器上运行的时间肯定不同&#xff0c;因此算法的时间复杂度指的是基本操作的执行次数&#xff0c;他是一个数学意义上的函数。这个函数并不是C语言中那种函数&…

unity发布webGL压缩方式的gzip,使用nginx作为web服务器时的配置文件

unity发布webGL压缩方式的gzip&#xff0c;使用nginx作为web服务器时的配置文件 Unity版本是&#xff1a;2021.3 nginx的版本是&#xff1a;nginx-1.25.4 Unity发布webgl时的测试 设置压缩方式是gzip nginx配置文件 worker_processes 1;events {worker_connections 102…

网站开发--详解Servlet

&#x1f495;"Echo"&#x1f495; 作者&#xff1a;Mylvzi 文章主要内容&#xff1a;网站开发–详解Servlet 一.基本介绍 tomcat是Java中开发服务器的重要的一个工具,任何开发的服务器都要部署在tomcat之上,可以说tomcat是所有服务器的底座,为了更好的操作http,to…

探索水下低光照图像检测性能,基于YOLOv6全系列【n/s/m/l】参数模型开发构建海底生物检测识别分析系统

底这类特殊数据场景下的检测模型开发相对来说比较少&#xff0c;在前面的博文中也有一些涉及&#xff0c;感兴趣的话可以自行移步阅读即可&#xff1a; 试探索水下目标检测&#xff0c;基于yolov5轻量级系列模型n/s/m开发构建海底生物检测系统》 《基于YOLOv5C3CBAMCBAM注意力…

EasyRecovery2024个人免费版本电脑手机数据恢复软件下载

EasyRecovery是一款功能强大的数据恢复软件&#xff0c;能够帮助用户恢复丢失、删除、格式化或损坏的数据。无论是由于误操作、病毒攻击、硬盘故障还是其他原因导致的数据丢失&#xff0c;EasyRecovery都能提供有效的解决方案。 该软件支持从各种存储介质恢复数据&#xff0c;…

OD(11)之Mermaid时间线图(Timeline diagram)使用详解

OD(11)之Mermaid时间线图(Timeline diagram)使用详解 Author: Once Day Date: 2024年2月25日 漫漫长路才刚刚开始… 全系列文章可参考专栏: Mermiad使用指南_Once_day的博客-CSDN博客 参考文章: 关于 Mermaid | Mermaid 中文网 (nodejs.cn)Mermaid | Diagramming and char…

10 款数据恢复软件功能和有效性对比(2024 年更新)

数据丢失可能是一种痛苦的经历&#xff0c;无论是由于意外删除、硬件故障还是软件损坏。值得庆幸的是&#xff0c;数字时代带来了强大的数据恢复解决方案。 随着我们进入 2024 年&#xff0c;市场上充斥着旨在有效检索丢失数据的先进软件。在本文中&#xff0c;我们将探讨 2024…

vscode使用restClient实现各种http请求

vscode使用restClient实现各种http请求 一&#xff0c;安装插件 首先&#xff0c;我们要在vscode的扩展中&#xff0c;搜索rest Client&#xff0c;然后安装它&#xff0c;这里我已经安装过了。 安装后&#xff0c;我们就可以使用rest client插件进行http各种操作了。 二&…

迷你世界之建筑生成球体

local x0,y0,z00,30,0--起点坐标 local dx,dy,dz60,60,60--外切长方体横纵竖长度 local count,all0,dx*dy*dz--计数&#xff0c;总数 local m,k10000,0--单次生成方块数&#xff0c;无用循环值 local x,y,z0,0,0--当前坐标 local demath.random(2,19)/2 local id600--方块…

Excel工作表控件实现滚动按钮效果

实例需求&#xff1a;工作表中有多个Button控件&#xff08;工作表Form控件&#xff09;和一个ScrollBar控件&#xff08;工作表ActiveX控件&#xff0c;名称为ScrollBar2&#xff09;&#xff0c;需要实现如下图所示效果。点击ScrollBar控件实现按钮的滚动效果&#xff0c;实际…

国企招聘考试------笔试资料-校园招聘

国企招聘考试一直备受广大求职者的关注&#xff0c;因为国企招聘通常具有稳定的岗位、优厚的福利待遇和广阔的发展空间&#xff0c;因此备战国企招聘考试成为许多求职者的重要任务。为了帮助求职者更好地准备国企招聘笔试&#xff0c;我将为你介绍这套校招试题资料。 国企招聘…