LeetCode 热题100之双指针

1.移动零

在这里插入图片描述
思路分析1(纯模拟)

  • 定义指针j,用来收集不是0的数;
  • 收集完毕之后,再把剩下位置处置为0即可。

具体实现代码(详解版):

class Solution {
public:
    void moveZeroes(vector<int>& nums) {
        int n = nums.size(); // 获取数组的大小
        int j = 0; // j 用于记录非零元素的位置

        // 第一次遍历,移动非零元素
        for (int i = 0; i < n; i++) {
            if (nums[i] != 0) {
                nums[j++] = nums[i]; // 将非零元素放到前面,并递增 j
            }
        }

        // 第二次遍历,将剩余的位置填充为零
        for (int i = j; i < n; i++) {
            nums[i] = 0; // 将 j 之后的所有位置设置为零
        }
    }
};

思路分析2(交换0)

  • 首先记录第一个元素为0的位置;
  • 定义双指针l和r,r一直往后走,l只有当交换元素的时候才前进
    在这里插入图片描述
    具体实现代码(详解版):
class Solution {
public:
    void moveZeroes(vector<int>& nums) {
        int l = 0; 
        for (int r = 0; r < nums.size(); r ++) {
            if (nums[r] == 0) continue; // 如果当前元素是零,跳过
            swap(nums[l ++], nums[r]); // 交换非零元素到前面
        }
    }
};

以上两种解法的时间复杂度都是 O ( n ) O(n) O(n),n是数组中元素的个数。

2.盛最多水的容器

在这里插入图片描述
思路分析1(暴力解法超时)

  • 外层循环遍历所有柱子的索引 i。
  • 内层循环从 i 开始遍历,确保每一对柱子只计算一次(即避免重复)
  • 计算面积
    • 对于每对柱子 i 和 j,计算它们之间的高度 t,取两者的最小值。
    • 计算这两柱之间的面积 t * (j - i),并将其与 res 进行比较,更新最大面积。

具体实现代码(详解版):

class Solution {
public:
    int maxArea(vector<int>& height) {
        int res = 0; // 用于存储最大面积
        // 外层循环遍历第一个柱子
        for (int i = 0; i < height.size(); i++) {
            // 内层循环遍历第二个柱子
            for (int j = i; j < height.size(); j++) {
                int t = min(height[i], height[j]); // 计算当前两柱之间的高度
                res = max(res, t * (j - i)); // 计算面积并更新最大面积
            }
        }
        return res; // 返回最大面积
    }
};

时间复杂度为 O ( n 2 ) O(n^2) O(n2),不能解决本题。还是要用双指针进行优化。
思路分析2(双指针算法)

  • 初始化指针:设置两个指针,分别指向数组的两端,一个指向左边(left),一个指向右边(right)。
  • 计算面积:在每一步中,计算当前两指针之间的水容器的面积,使用 min(height[left], height[right]) 作为容器的高度,宽度为 right - left。
  • 移动指针:为了找到可能更大的面积,移动指向较矮柱子的指针。因为容器的面积是由较矮的柱子限制的,移动较矮的柱子有可能找到更高的柱子,从而增加面积。
  • 重复步骤:继续移动指针并计算面积,直到两个指针相遇。
在这里插入代码片

具体实现代码(详解版):

class Solution {
public:
    int maxArea(vector<int>& height) {
        int left = 0; // 左指针
        int right = height.size() - 1; // 右指针
        int maxArea = 0; // 最大面积

        while (left < right) {
            // 计算当前面积
            int currentArea = min(height[left], height[right]) * (right - left);
            maxArea = max(maxArea, currentArea); // 更新最大面积

            // 移动指针
            if (height[left] < height[right]) {
                left++; // 移动左指针
            } else {
                right--; // 移动右指针
            }
        }

        return maxArea; // 返回最大面积
    }
};

3.三数之和

在这里插入图片描述
思路分析(排序+双指针)

  • 排序:首先对数组进行排序,这样可以方便地处理重复元素和使用双指针法;
  • 遍历:使用一个循环遍历每个元素,作为三元组中的第一个元素;
  • 跳过重复:在遍历过程中,如果当前元素与前一个元素相同,则跳过,以避免生成重复的三元组。
  • 双指针法:对于每个固定的第一个元素,使用两个指针(left 和 right)分别从当前元素的下一个位置和数组的末尾开始向中间移动,寻找另外两个元素,使得三者的和为零。
  • 更新指针
    • 如果三者的和小于零,移动左指针向右,增大和。
    • 如果三者的和大于零,移动右指针向左,减小和。
    • 如果三者的和等于零,将三元组加入结果,并移动两个指针,同时跳过重复元素。
  • 返回结果

具体实现代码(详解版):

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        vector<vector<int>> res;
        sort(nums.begin(),nums.end());
        for(int i = 0 ; i < nums.size() ; i ++){
            //跳过重复的元素
            if(i > 0 && nums[i] == nums [i - 1]) continue;
            int l = i + 1 ,r = nums.size() - 1;

            while(l < r){
                int sum = nums[i] + nums[l] + nums[r];
                
                if(sum < 0) l ++;//和小于0,左指针右移
                else if(sum > 0) r --;//和大于0,右指针左移
                else{
                    //找到一个三元组
                    res.push_back({nums[i],nums[l],nums[r]});
                    //跳过重复的元素
                    while(l < r && nums[l] == nums[l + 1]) l ++;
                    while(l < r && nums[r] == nums[r - 1]) r --;
                    //移动指针继续查找
                    l ++;
                    r --;
                }
            }
        }
        return res;
    }
};

4.接雨水

在这里插入图片描述
思路分析(双指针算法):

  • 初始化指针和变量:
    • 使用两个指针 l 和 r,分别指向数组的两端。
    • 初始化 lmax和 rmax,用于存储当前左右两边的最大高度。
    • 初始化一个变量 res 来记录接雨水的总量。
  • 遍历数组(高度图)
    • 使用 while 循环,当 l 小于 r 时继续执行。
    • 比较 l 和 r:
      • 如果 l 小于 r:
        • 说明在 left 指向的位置,水的高度受到 lmax 的限制
        • 如果 height[l] 小于 lmax,则可以计算在该位置接的雨水量,并更新 res = lmax - height[l]。
        • 否则,更新 lmax 为 height[l],然后向右移动 l 指针。
      • 如果 rmax 小于等于 lmax:
        • 类似地,处理 r 指向的位置,计算接雨水量或更新 rmax,然后向左移动 r指针。
  • 返回结果。

具体实现代码(详解版):

class Solution {
public:
    int trap(vector<int>& height) {
        if(height.empty()) return 0;//如果数组为空,返回0

        int l = 0, r = height.size() - 1;//双指针,分别指向数组的两端
        int lmax =  0, rmax = 0;//记录左侧和右侧的最大柱子高度
        int res = 0;

        while(l < r){
            if(height[l] <= height[r]){
                if(height[l] >= lmax) lmax = height[l];//更新左侧最大柱子高度
                else res += lmax - height[l];//计算雨水量
                l ++;//指针右移
            }
            else{
                if(height[r] >= rmax) rmax = height[r];//更新右侧最大柱子高度
                else res += rmax -height[r];//计算雨水量
                r --;//指针左移
            }
        }
        return res;

    }
};

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

前端vue框架配置基础信息详解分析

前端vue2、vue3框架是我们最近常用的框架&#xff0c;今天我们分析一下配置基础信息、详解其中的功能含义。 1、vue.config.js 文件分析 这个 vue.config.js 文件是 Vue CLI 项目中用于配置项目构建行为和开发环境设置的文件。它能够让开发者定制打包、代理、路径、样式等方面…

国产单片机及其特点

国产单片机在近年来取得了显著的发展&#xff0c;不仅在技术上不断突破&#xff0c;还在市场上占据了越来越重要的位置。 主要国产单片机品牌及特点 兆易创新&#xff08;GD&#xff09; 主要系列&#xff1a;GD32系列&#xff0c;基于ARM Cortex-M内核。特点&#xff1a;高性能…

Android 中的串口开发

一&#xff1a;背景 本文着重讲安卓下的串口。 由于开源的Android在各种智能设备上的使用越来越多&#xff0c;如车载系统等。在我们的认识中&#xff0c;Android OS的物理接口一般只有usb host接口和耳机接口&#xff0c;但其实安卓支持各种各样的工业接口&#xff0c;如HDM…

ResNet18果蔬图像识别分类

1. 项目简介 本项目的目标是开发一个基于ResNet18深度学习模型的果蔬图像分类系统。随着现代农业与人工智能的结合&#xff0c;智能果蔬分类技术在供应链、生产和销售管理中扮演了越来越重要的角色。本项目的背景源于提升果蔬分类效率的需求&#xff0c;通过使用计算机视觉技术…

基于SSM+微信小程序的酒店管理系统1

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1、项目介绍 基于微信小程序开发的酒店管理系统管理员&#xff0c;酒店管理员以及用户。 1、管理员功能可以管理个人中心&#xff0c;用户信息管理&#xff0c;酒店管理员管理&#xff0c;房间类型管…

YOLO11改进 | 注意力机制 | 添加SE注意力机制

秋招面试专栏推荐 &#xff1a;深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转 &#x1f4a1;&#x1f4a1;&#x1f4a1;本专栏所有程序均经过测试&#xff0c;可成功执行&#x1f4a1;&#x1f4a1;&#x1f4a1; 本文介绍了YOLOv11添加SE注意力机制&…

Redis中String类型数据扩容原理分析

大家好&#xff0c;我是 V 哥。在 Java 中&#xff0c;我们有动态数组ArrayList&#xff0c;当插入新元素空间不足时&#xff0c;会进行扩容&#xff0c;好奇 Redis 中的 String 类型&#xff0c;C 语言又是怎样的实现策略&#xff0c;带着疑问&#xff0c;咱们来了解一下。 最…

Python酷库之旅-第三方库Pandas(167)

目录 一、用法精讲 766、pandas.Interval.open_left属性 766-1、语法 766-2、参数 766-3、功能 766-4、返回值 766-5、说明 766-6、用法 766-6-1、数据准备 766-6-2、代码示例 766-6-3、结果输出 767、pandas.Interval.open_right属性 767-1、语法 767-2、参数 …

[LeetCode] 78. 子集

题目描述&#xff1b; 给你一个整数数组 nums &#xff0c;数组中的元素 互不相同 。返回该数组所有可能的子集&#xff08;幂集&#xff09;。 解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3] 输出&#xff1…

Windows通过netsh控制安全中心防火墙和网络保护策略

Windows通过netsh控制安全中心防火墙和网络保护策略 1. 工具简介 【1】. Windows安全中心 【2】. netsh工具 netsh(Network Shell) 是一个Windows系统本身提供的功能强大的网络配置命令行工具。 2. 开启/关闭防火墙策略 在设置端口&#xff08;禁用/启用&#xff09;前&am…

传输层协议UDP详解

目录 一. 知识准备 1.1 传输层 1.2 重识端口号 二. UDP协议 三. UDP协议特点 一. 知识准备 1.1 传输层 前面已经讲过&#xff0c;HTTP协议是应用层协议&#xff0c;在此之前&#xff0c;我们短暂的认为HTTP是直接通过应用层与外界通信的。但是我们要知道&…

DOTween动画插件超详解(保姆级巨细)

文章目录 一、前言二、DOTween简介与安装&#xff08;一&#xff09;什么是DOTween&#xff1f;&#xff08;二&#xff09;下载安装 三、DOTween 的使用&#xff08;基础&#xff09;&#xff08;一&#xff09;使用前注意事项1. 引入命名空间2. 进行初始化3. 清除遗留4. 设置…

基于Java的电商书城系统源码带本地搭建教程

技术框架&#xff1a;jQuery MySQL5.7 mybatis jsp shiro 运行环境&#xff1a;jdk8 IntelliJ IDEA maven3 宝塔面板 系统功能介绍 该系统分为前台展示和后台管理两大模块&#xff0c;前台主要是为消费者服务。该子系统实现了注册&#xff0c;登录&#xff0c; 以及…

asp.net core mvc发布时输出视图文件Views

var builder WebApplication.CreateBuilder(args); builder.Services.AddRazorPages();builder.Services.AddControllersWithViews(ops > {//全局异常过滤器&#xff0c;注册ops.Filters.Add<ExceptionFilter>(); })// Views视图文件输出到发布目录&#xff0c;视图文…

使用 VSCode 通过 Remote-SSH 连接远程服务器详细教程

使用 VSCode 通过 Remote-SSH 连接远程服务器详细教程 在日常开发中&#xff0c;许多开发者需要远程连接服务器进行代码编辑和调试。Visual Studio Code&#xff08;VSCode&#xff09;提供了一个非常强大的扩展——Remote-SSH&#xff0c;它允许我们通过 SSH 协议直接连接远程…

背包九讲——完全背包问题

目录 完全背包问题 问题定义 动态规划解法 状态转移方程 初始化 遍历顺序 三种解法&#xff1a; 朴素版——枚举k 进阶版——dp正推&#xff08;一维滚动数组&#xff09; 背包问题第三讲——完全背包问题 背包问题是一类经典的组合优化问题&#xff0c;通常涉及在限定…

kafka 的高可用机制是什么?

大家好&#xff0c;我是锋哥。今天分享关于【kafka 的高可用机制是什么&#xff1f;】面试题&#xff1f;希望对大家有帮助&#xff1b; kafka 的高可用机制是什么&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Apache Kafka 是一个分布式消息系统&am…

《性能之巅:洞悉系统、企业与云计算》读书笔记-Part 1

本文是读书笔记第一部分&#xff0c;包括原书第一、二章。 绪论 性能是一门令人激动的&#xff0c;富于变化同时又充满挑战的学科。 系统性能 单台服务器上的通用系统软件栈 人员 系统性能是一项需要多类人员参与的工程。 事情 关于性能的理想执行顺序排列如下&#x…

8个方法教会你提高企业培训效率

培训成本是企业中的一个复杂问题。它完全取决于课程内容、培训方法以及成本效益。在计算培训费用时&#xff0c;公司会面临许多关于包括哪些内容、如何进行以及假设情景的问题。 企业员工培训的每个方面都会产生自己的成本。例如&#xff1a; 地点&#xff1a;我们专门找个培训…

【重拾算法第一天】质数约数欧拉筛 埃氏筛GCD

1.素数 素数&#xff08;Prime Number&#xff09;是指大于1的自然数&#xff0c;只有两个正因数&#xff1a;1和它自身。换句话说&#xff0c;素数是不能被其他自然数整除的数。 1.1小素数的判定 判定一个数是否为素数 &#xff0c;当N ≤ 时&#xff0c; 用试除法 &#…