LeetCode Hot 100:双指针

前端力扣刷题 | 2:hot100之 双指针 给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i!= k ,同时还满足 nums[i] + nums[j] + nums[k] == 0。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i])。不同的三元组是 [-1,0,1] 和 [-1,-1,2]。输入:nums = [-1,0,1,2,-1,-4]输入: nums = [0,1,0,3,12]输出:[[-1,-1,2],[-1,0,1]] 阅读详情

LeetCode Hot 100:双指针

283. 移动零

思路 1:遍历

class Solution {
public:
    void moveZeroes(vector<int>& nums) {
        int n = nums.size();
        int idx = 0;
        for (int i = 0; i < n; i++)
            if (nums[i] != 0)
                nums[idx++] = nums[i];
        while (idx < n) {
            nums[idx] = 0;
            idx++;
        }
    }
};

思路 2:双指针

class Solution {
public:
    void moveZeroes(vector<int>& nums) {
        int n = nums.size();
        // left 指向当前已经处理好的序列的尾部
        int left = 0;
        // right 指向待处理序列的头部
        int right = 0;
        while (right < n) {
            if (nums[right]) {
                swap(nums[left], nums[right]);
                left++;
            }
            right++;
        }
    }
};

11. 盛最多水的容器

思路 1:双指针

class Solution {
public:
    int maxArea(vector<int>& height) {
        int n = height.size();
        int left = 0, right = n - 1;

        int ans = INT_MIN;
        while (left < right) {
            int area = min(height[left], height[right]) * (right - left);
            ans = max(ans, area);
            if (height[left] < height[right])
                left++;
            else
                right--;
        }

        return ans;
    }
};

15. 三数之和

思路 1:三重循环 + 集合去重(超时)

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        int n = nums.size();
        set<vector<int>> set;
        for (int i = 0; i < n - 2; i++)
            for (int j = i + 1; j < n - 1; j++)
                for (int k = j + 1; k < n; k++)
                    if (nums[i] + nums[j] + nums[k] == 0) {
                        vector<int> v = {nums[i], nums[j], nums[k]};
                        sort(v.begin(), v.end());
                        set.insert(v);
                    }

        vector<vector<int>> ans(set.begin(), set.end());
        return ans;
    }
};

思路 2:排序 + 双指针

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        int n = nums.size();
        if (n < 3)
            return {};

        sort(nums.begin(), nums.end());
        set<vector<int>> set;
        for (int i = 0; i < n; i++) {
            int target = -nums[i];
            int left = i + 1, right = n - 1;
            while (left < right) {
                if (nums[left] + nums[right] > target)
                    right--;
                else if (nums[left] + nums[right] < target)
                    left++;
                else {
                    vector<int> v = {nums[i], nums[left], nums[right]};
                    set.insert(v);
                    left++;
                    right--;
                }
            }
        }
        vector<vector<int>> ans(set.begin(), set.end());
        return ans;
    }
};

42. 接雨水

思路 1:前后缀分解

class Solution {
public:
    int trap(vector<int>& height) {
        int n = height.size();

        vector<int> preMax(n);
        for (int i = 0; i < n; i++)
        {
            if (i == 0)
                preMax[i] = height[i];
            else
                preMax[i] = max(preMax[i - 1], height[i]);
        }

        vector<int> sufMax(n);
        sufMax[n - 1] = height[n - 1];
        for (int i = n - 2; i >= 0; i--)
            sufMax[i] = max(sufMax[i + 1], height[i]);
        
        int water = 0;
        for (int i = 0; i < n; i++)
            water += min(preMax[i], sufMax[i]) - height[i];

        return water;
    }
};

思路 2:相向双指针

// 相向双指针

class Solution
{
public:
    int trap(vector<int> &height)
    {
        int n = height.size();
        int left = 0, right = n - 1;
        // pre_max 表示前缀最大值,suf_max 表示后缀最大值
        int pre_max = 0, suf_max = 0;
        int sum = 0;

        while (left < right)
        {
            // 更新前后缀最大值
            pre_max = max(pre_max, height[left]);
            suf_max = max(suf_max, height[right]);
            if (pre_max < suf_max)
            {
                sum += pre_max - height[left];
                left++;
            }
            else
            {
                sum += suf_max - height[right];
                right--;
            }
        }

        return sum;
    }
};

思路 3:单调栈

// 单调栈

class Solution
{
public:
    int trap(vector<int> &height)
    {
        int ans = 0;
        stack<int> st;
        for (int i = 0; i < height.size(); i++)
        {
            while (!st.empty() && height[i] >= height[st.top()])
            {
                int bottom_h = height[st.top()];
                st.pop();
                if (st.empty())
                    break;
                int left = st.top();
                // 面积的高和宽
                int dh = min(height[left], height[i]) - bottom_h;
                int dw = i - left - 1;
                ans += dh * dw;
            }
            st.push(i);
        }
        return ans;
    }
};
(超详细)Scala环境搭建(scala-2.12.15、IDEA2021.1.3) Scala环境搭建(scala-2.12.15、IDEA2021.1.3) JunLeon——go big or go home 目录 Scala环境搭建(scala-2.12.15、IDEA2021.1.3) 一、Scala概述 1、什么是Scala? 2、Scala发展史 3、Scala与Java的关系 二、Scala环境搭建 1、环境准备 2、Scala安装与配置环境变量 3、验证Scala 三、编写第一个Scala程序 1、使用IDEA创建maven工程 2、. 阅读详情

相关推荐

本地服务器搭建Uptime Kuma网站监控服务

本文主要介绍如何在Linux系统中一键部署Uptime Kuma运维监控服务,并将这个服务映射至公网实现随时随地远程访问。如果您像我一样在服务器上托管了多个网站,并且没有足够的时间来手动检查每个网站的在线状态,那么当出现问题时,您可能无法及时收到通知来处理这些问题。因此,搭建一个在线监控服务是很有必要的,它可以在状态异常时提醒您,以便您能够及时处理问题,确保网站的稳定性和可用性。监控服务有很多,我最终选择了Uptime Kuma,因为Uptime Kuma是开源免费的,

Tiam_cr的博客 1823

【Leetcode】Hot100双指针系列:42. 接雨水

本文介绍了两种计算接雨水量的方法。动态规划法通过左右扫描记录最大高度数组,然后计算每个位置雨水量,时间复杂度O(n),空间复杂度O(n)。双指针法优化了空间复杂度,使用两个指针动态维护左右最大值,边遍历边计算结果,空间复杂度降至O(1)。两种方法都能有效解决问题,双指针法在空间效率上更优。

weixin_46559256的博客 437

【算法设计与分析】期末复习题(超详细)

刚刚整理了一下电脑的文件,发现了这份上学期的算法设计与分析期末复习题,有需要的文后自取。

a1234567822的博客 6614

C++刷LeetCode Hot100:双指针与滑动窗口实战

双指针和滑动窗口是算法中的核心技巧,广泛应用于数组和链表问题。双指针通过维护两个指针变量,能在O(n)时间复杂度内解决搜索、去重等问题,常见模式包括同向指针、相向指针和快慢指针。滑动窗口则擅长处理子串/子数组问题,通过动态调整窗口边界来优化计算效率。在C++实现中,这些算法能充分发挥性能优势,配合STL容器和内存管理特性,适合解决LeetCode高频题目如三数之和、最小覆盖子串等。掌握这些技巧不仅能提升算法能力,还能深入理解计算机底层的内存操作机制。

weixin_33980459的博客 414

系统回溯信息:遇到严重错误。已将回溯写入...PTC... raceback.log请将其发送给|技术支持|。

一、问题分析 这种问题一旦遇上了,如果忘了保存,直接心态爆炸。 该问题一般是显卡驱动的问题。ProE/Creo对显卡的基本要求是:支持Open_GL的3D显卡,分辨率为1024×768像素以上,推荐使用64位独立显卡,显存512MB以上。如若显卡性能太低,打开软件后易自动退出。 二、解决方法 <1>有一个非常简单的方法是:在config.pro文件中,改变图形配置graphics为” win32_gdi”而不是默认的“...

幕光倾城的博客 2万+

MuJoCo 入门教程(二)

本章介绍 MuJoCo 的数学和算法基础。对于熟悉广义或关节坐标建模和仿真的读者来说,整体框架是相当标准的。因此,我们将对这些材料进行简要总结。本章的大部分篇幅用于介绍我们如何处理接触和其他约束条件。这种方法是基于我们最近的研究,也是 MuJoCo 所独有的,因此我们花时间对其进行了详细的激励和解释。更多信息可参见下面的论文,尽管本章中的一些技术思想是新的,在其他地方还没有描述过。

机器人控制与仿真应用 3712

LeetCode HOT100刷题笔记(一):哈希表, 双指针

ps:笔记和代码按本人理解整理,重思路

学习记录 1702

高级数据库--作业及答案

中科大金培权老师的高级数据库课程作业及答案

一杯水果茶!足矣~ 1658

力扣hot100——双指针:移动0

本文介绍了一种移动数组中零元素的高效算法。该算法采用双指针方法,首先遍历数组将所有非零元素前移,然后从非零元素末尾开始将剩余位置填充为零。通过两次遍历(时间复杂度O(n))完成了数组元素的重排,无需逐个比较元素,提高了执行效率。这种方法既保持了非零元素的原始顺序,又实现了将所有零元素移动到数组末尾的要求。

weixin_74681777的博客 169

Puchem化合物数据批量抓取采集_宝典_教程_Python爬虫

本文共计6500字,导出到PDF达42页(含代码)。从0教你如何抓取Pubchem化合物数据。 1、 Pubchem介绍 ​ Pubchem是美国国立卫生研究院(NIH)的开放式化学数据库,自2004年推出以来,pubchem已成为科学家、学生和公众的重要化学信息资源。其专门针对化学结构搜索,是网络药理学研究经常用到的数据库之一,不仅使用方便而且免费。 ​ PubChem主要包含小分子,但也包含较大的分子,例如核苷酸,碳水化合物,脂质,肽和化学修饰的大分子。收集有关化学结构,标识符,化学和物理性..

qq_34843422的博客 6073

MIKE水动力笔记18_如何将dfsu流场模拟结果的数据导出成txt文件

MIKE的模拟结果dfsu文件的数据是可以导出的,导出格式为xyz,我们也可以将其改后缀改为txt文本格式,其中包含了某一时刻下所有网格坐标点的数据。

晏长街的博客 4410

LeetCode力扣-hot100系列(2):哈希与双指针实战精解

本文深入解析LeetCode Hot 100系列中哈希表与双指针两大核心算法。通过剖析两数之和、字母异位词分组、盛水容器、无重复字符子串等经典例题,详解哈希表如何以空间换时间实现O(1)查找,以及双指针如何通过左右指针、快慢指针和滑动窗口等模式高效处理数组与字符串问题,并提供实战代码与避坑指南,助力提升算法解题能力。

z4a5b6的博客 203

HDMI接口及其在编程中的应用

在编程中,我们可以使用HDMI接口来控制和管理连接到计算机的HDMI设备。本文将介绍HDMI接口的基本原理以及如何在编程中使用HDMI接口。在编程中,我们可以使用HDMI接口来控制和管理连接到计算机的HDMI设备。本文介绍了HDMI接口的基本原理,并提供了使用Python编程语言和相关库实现HDMI接口应用的示例代码。我们可以使用编程语言提供的音频库来生成和播放音频,并将其通过HDMI接口输出到连接的设备上。我们可以使用编程语言提供的音频库来生成和播放音频,并将其通过HDMI接口输出到连接的设备上。

CodeByte的博客 802

算法复盘——Leetcode hot100: 双指针算法

双指针算法

Xxx's Blog 1241

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

玩转 LeetCode Hot 100:双指针两大万能解题模板与深度拆解

拿到一道题,怎么判定用哪种双指针?看数组是否有序 / 能否排序如果数组是有序的,或者要求找满足某个数值关系的组合(如两数、三数之和、盛水容器)优先考虑模板一:左右夹逼指针。如果数组是无序的,且要求原地修改数组、删除特定元素、或者是在链表中(如判断环、找中点)优先考虑模板二:快慢同向指针。消灭无意义的嵌套:只要看到题目需要“通过两层循环不断比对两两元素”,就可以用两个指针对省掉一层for循环,将空间复杂度锁死在 O(1)。

nice_lcj520的博客 400

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

【LeetCode Hot100】双指针:分离指针

本章学习目的:掌握两个指针分别遍历不同序列解法。这个解法通常用于两个序列之间做匹配,合并,插入,交换。双指针分别从后向前遍历两个数组。用双指针分别遍历两个字符串,通过比较字符是否相等来完成解答掌握字符串于数组之间转换的语法StringBuilder可变字符串类型添加append(charAt)本章学习的是双指针:分离指针一般都是定义多个指针,每一个指针遍历多个数组,进行判断或者拼接。

2501_92547326的博客 361

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

力扣HOT100之双指针:42. 接雨水

这道题在之前刷代码随想录的时候做过,果然现在又不记得了,当时是用单调栈做的,现在忘得一干二净,难绷。。。单调栈的思路不是本文的重点,单调栈的思路可以参考我的这道题我用双指针想不出来,然后去看灵神的题解了,学到了一种用前后缀解决的新办法,有必要记录一下。

weixin_52151595的博客 414

力扣Hot100题目解析:双指针与链表 —— 两数相加

给你两个非空的链表,表示两个非负的整数。它们每位数字都是按照逆序方式存储的,并且每个节点只存储一位数字。请你将两个数相加,并以相同形式返回一个表示和的链表。输入:l1 = [2,4,3], l2 = [5,6,4]输出:[7,0,8]解释:342 + 465 = 807。

weixin_46532327的博客 421

力扣Hot100:位运算与双指针技巧精解

位运算和双指针是算法优化中的核心技巧,能显著提升代码执行效率。位运算通过直接操作二进制位实现快速计算,常用于数据压缩、状态存储等场景;双指针则通过协同遍历数据结构,有效解决数组/链表类问题。本文以力扣Hot100经典题目为例,深入解析异或运算在'只出现一次的数字'中的应用,以及摩尔投票法解决'多数元素'问题的精妙思路。这些技巧不仅适用于算法竞赛,在大数据处理、实时系统等工程实践中同样具有重要价值。通过掌握位运算性质(如异或的自反性)和双指针模式(快慢指针、对向指针),开发者能够写出时间复杂度O(n)、空间复

weixin_34184561的博客 342

力扣HOT100:T.283 移动零|双指针法算法实现笔记及打卡(9/100)

摘要: 本文介绍了LeetCode 283题“移动零”的解法。题目要求将数组中的零元素移动到末尾,同时保持非零元素的相对顺序,且必须原地操作。采用双指针法:左指针标记非零区间边界,右指针遍历数组。当右指针遇到非零元素时,与左指针交换并移动左指针。时间复杂度O(n),空间复杂度O(1)。

打破知识壁垒 382

力扣HOT100之双指针:283. 移动零

后来看了下灵茶山大佬的题解,感觉思路确实清奇,这里讲一下,对于一个存有0和非0元素的数组,我们需要不断将非0元素往前搬,0元素放到后面,那么我们需要维护一个区间,这个区间内的所有元素都是0,且区间左边的元素都是非0的,那么我从这个区间的右边一个元素开始向后遍历,每当遇到一个非0值,就将该非0值移动到区间的最左侧,原来非0值的位置变为0,就相当于把0看作是空位,当非0值移动到数组最左边的空位(区间左数第一个0)时,原来的位置就会空出来,自然要赋值为0。

weixin_52151595的博客 259

leetcode hot100 双指针:盛水最多的容器

首先我们要想到计算水的体积应该是:两侧高度较低的一段 * 两端的坐标差。有了这一点,我们就可以判断,当两侧一高一低时,我们移动较高的一侧的指针是没有意义的,因为较低的一端决定了容器的最高高度,移动后两端点的差值也会变小,体积只可能是小于等于。因此,我们只需要移动每次两端点中较低的一端,去寻找下一个可能大于另一端点的高度,才有可能使容器的容积变大。因此,要想一种时间复杂度低于n2的方法,通常来说,双层遍历我们应该第一时间就会想到双指针的方法,用某一个指针的移动来避免一些无用的重复遍历。

weixin_47042626的博客 547

LeetCode 热题 HOT100(二):双指针进阶与滑动窗口(Go 实现)

(欢迎来访)✨本文覆盖力扣「热题 100」学习计划第 6~10 题,全部使用实现。可与上一篇(哈希表与双指针入门)对照阅读。

lihaoweiwudi_的博客 2407

力扣hot100三数之和:双指针倒数第二题

这道题就是要想明白怎么才能够不重复的找到三元组-----------首先要保证三元组呈次序关系,其次就是三元组各自不能与上一轮相同。

2401_82379797的博客 257

Java位运算与双指针技巧解析:力扣Hot100经典题解

位运算和双指针是算法设计中常用的高效技巧。位运算通过异或等操作实现O(1)空间复杂度的数字处理,特别适合解决出现次数统计类问题。双指针技术则通过维护多个索引实现线性时间复杂度,广泛应用于数组排序、查找等场景。这些基础算法在大厂面试中频繁出现,如力扣Hot100中的Single Number、Majority Element等问题。掌握位运算的消消乐特性与双指针的对撞/快慢模式,能显著提升解决技巧类算法题的能力。本文以Java实现为例,深入解析这些经典题目的最优解法和工程实践要点。

weixin_33984032的博客 288

力扣HOT100之双指针:11. 盛最多水的容器

然后两根指针不断向中间移动,用一个result变量来维护最大水量,问题来了,这两根指针向中间移动应当遵循什么规则呢?我们要知道,两根柱子之间的水量取决于较短的那个柱子,指针向中间移动的时候,水池的底部是不断变窄的,只有将最短的那根柱子拔高,才有可能增加蓄水量,尽管移动指向较短柱子的指针,可能新的柱子会更短,但是没有别的办法,不移动较短柱子一定不可能得到更大的蓄水量,所以我们需要判断左右指针指向的柱子中哪个较短,哪个较短就将哪个柱子向中间移动。看了下灵茶山大佬的题解,思路和我是一样的啊,怎么我的代码这么慢?

weixin_52151595的博客 394
上一篇: LeetCode Hot 100:哈希
下一篇: LeetCode Hot 100:矩阵
UestcXiye
博客等级 码龄8年 9030粉丝 1306原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

UestcXiye

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值