LeetCode-数组-双指针-中等难度

文章目录

  • 双指针
    • 1. 删除有序数组中的重复项(入门)
      • 1.1 题目描述
      • 1.2 解题思路
      • 1.3 代码实现
    • 2. 删除有序数组中的重复项 II(简单)
      • 2.1 题目描述
      • 2.2 解题思路
      • 2.3 代码实现
    • 3. 移动零(简单)
      • 3.1 题目描述
      • 3.2 代码实现
    • 4. 两数之和(入门)
      • 4.1 题目描述
      • 4.2 解题思路
      • 4.3 代码实现
    • 5. 盛水最多的容器(中等)
      • 5.1 题目描述
      • 5.2 解题思路
      • 5.3 代码实现
    • 6. 三数之和(中等)
      • 6.1 题目描述
      • 6.2 解题思路
      • 6.3 代码实现
    • 7. 最接近的三数之和(中等)
      • 7.1 题目描述
      • 7.2 解题思路
      • 7.3 代码实现
    • 8. 接雨水(中等)
      • 8.1 题目描述
      • 8.2 解题思路
      • 8.3 代码实现

双指针

双指针一般是指利用两个变量,通过在线性的结构上进行遍历来解决某些特定的问题,按照遍历的方式一般多采用:同向遍历,相向遍历两种方式,例如冒泡排序、选择排序、插入排序都是用了两个变量同向遍历来实现,快排则是通过相向遍历来实现。

1. 删除有序数组中的重复项(入门)

1.1 题目描述

在这里插入图片描述

1.2 解题思路

快慢指针的简单应用

1.3 代码实现

public int removeDuplicates(int[] nums) {
    int n = nums.length;
    int p1 = 0;
    int p2 = 1;
    while (p2 < n) {
        if (nums[p1] != nums[p2]) {
            nums[++p1] = nums[p2];
        }
        p2++;
    }
    return p1 + 1;
}

leetcode跳转:26. 删除有序数组中的重复项

2. 删除有序数组中的重复项 II(简单)

2.1 题目描述

在这里插入图片描述

2.2 解题思路

与前一题结合在一起看,就是保留前X个相同数字,超过X个后,再进行比较,所以快指针逻辑不变,只需要让慢指针在比较时每次往前取两位即可。

2.3 代码实现

public int removeDuplicates(int[] nums) {
    int n = nums.length;
    if (n <= 2) {
        return n;
    }
    int p1 = 2;
    int p2 = 2;
    while (p2 < n) {
        if (nums[p1 - 2] != nums[p2]) {
            nums[p1] = nums[p2];
            p1++;
        }
        p2++;
    }
    return p1;
}

leetcode跳转:80. 删除有序数组中的重复项II

3. 移动零(简单)

3.1 题目描述

在这里插入图片描述

3.2 代码实现

public void moveZeroes(int[] nums) {
    int zero = 0;
    for (int i = 0; i < nums.length; i++) {
        if (nums[i] != 0) {
            int t = nums[i];
            nums[i] = 0;
            nums[zero] = t;
            zero++;
        }
    }
}

leetcode跳转:283. 移动零

4. 两数之和(入门)

4.1 题目描述

在这里插入图片描述

4.2 解题思路

左右指针,相向遍历

4.3 代码实现

public int[] twoSum(int[] numbers, int target) {
    int n = numbers.length;
    int left = 0;
    int right = n - 1;
    while (left < right) {
        int sum = numbers[left] + numbers[right];
        if (sum == target) {
            return new int[]{left + 1, right + 1};
        } else if (sum > target) {
            right--;
        } else {
            left++;
        }
    }
    return null;
}

leetCode跳转:167. 两数之和 II - 输入有序数组

5. 盛水最多的容器(中等)

5.1 题目描述

在这里插入图片描述

5.2 解题思路

同样是一道左右指针,相向遍历的题,每次移动较短的柱子,盛水最多的容器,即为:间距 * min(left, right)

5.3 代码实现

public int maxArea(int[] height) {
    int n = height.length;
    int left = 0;
    int right = n - 1;
    int ans = 0;
    while (left < right) {
        int min = Math.min(height[left], height[right]);
        ans = Math.max(ans, min * (right - left));
        if (height[left] < height[right]) {
            left++;
        } else {
            right--;
        }
    }
    return ans;
}

leetCode跳转:11. 盛水最多的容器

6. 三数之和(中等)

6.1 题目描述

在这里插入图片描述

6.2 解题思路

排序+双指针也是常见的组合解法,本题只需要排序后,再进行枚举即可。
在这里插入图片描述

两处优化
在这里插入图片描述

6.3 代码实现

public List<List<Integer>> threeSum(int[] nums) {
    Arrays.sort(nums);
    List<List<Integer>> ans = new ArrayList<>();
    int n = nums.length;
    for (int i = 0; i < n - 2; i++) {
        if (i > 0 && nums[i] == nums[i - 1]) {
            continue;
        }
        if (nums[i] + nums[n - 1] + nums[n - 2] < 0) {
            continue;
        }
        if (nums[i] + nums[i + 1] + nums[i + 2] > 0) {
            break;
        }
        int k = n - 1;
        for (int j = i + 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) {
                break;
            }
            if (nums[i] + nums[j] + nums[k] == 0) {
                List<Integer> list = new ArrayList<>();
                list.add(nums[i]);
                list.add(nums[j]);
                list.add(nums[k]);
                ans.add(list);
            }
        }
    }
    return ans;
}

leetCode跳转:15. 三数之和

7. 最接近的三数之和(中等)

7.1 题目描述

在这里插入图片描述

7.2 解题思路

解法同三数之和

7.3 代码实现

public int threeSumClosest(int[] nums, int target) {
    Arrays.sort(nums);
    int ans = Integer.MAX_VALUE;
    int n = nums.length;
    for (int i = 0; i < n - 2; i++) {
        int j = i + 1;
        int k = n - 1;
        while (j < k) {
            int sum = nums[i] + nums[j] + nums[k];
            if (sum == target) {
                return sum;
            }
            // 接近三数之和
            if (Math.abs(sum - target) < Math.abs(ans - target)) {
                ans = sum;
            }
            if (sum > target) {
                k--;
            } else {
                j++;
            }
        }
    }
    return ans;
}

leetCode跳转:16. 最接近的三数之和

8. 接雨水(中等)

8.1 题目描述

在这里插入图片描述

8.2 解题思路

左右指针,相向遍历。
要求可接的雨水处的水量,可以先分别求出位于此处两侧最长柱子的高度,然后取其较短的一根即表示其可接水量的上限,因此完全可以通过不断的左右遍历(收缩较短的柱子)的方式计算出每个位置可接的水量。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

8.3 代码实现

public int trap(int[] height) {
    int n = height.length;
    int leftMax = 0;
    int rightMax = 0;
    int left = 0;
    int right = n - 1;
    int ans = 0;
    while (left < right) {
        leftMax = Math.max(leftMax, height[left]);
        rightMax = Math.max(rightMax, height[right]);
        if (height[left] < height[right]) {
            ans += leftMax - height[left];
            left++;
        } else {
            ans += rightMax - height[right];
            right--;
        }
    }
    return ans;
}

leetCode跳转:42. 接雨水

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

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

相关文章

SpringCloud系列篇:核心组件之网关组件

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于SpringCloud的相关操作吧 目录 &#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 一.网关组件是什么 二. 网关组件的…

The Sandbox 2024 Game Jam 启动|向博姆库斯博士证明你的游戏开发实力!

The Sandbox Game Jam 是面向所有游戏制作爱好者的创作比赛&#xff01;我们诚邀您加入 The Sandbox 的生态系统&#xff0c;这里充满活力&#xff0c;游戏与文化相融&#xff0c;创作者彼此切磋&#xff0c;共同实现梦想。唯一能限制您的只有想象力。The Sandbox 游戏由大家共…

控制台项目和ASP.Net Core 1.项目创建 2.一键启动多个服务 3.引入别的库

感悟&#xff1a; 1.注意选择&#xff1a;.NET/.Net Core下面的控制台或者ASP.NET Core web应用&#xff0c;而且只有.net core的项目是跨平台的&#xff0c;选错的话&#xff0c;是无法发布到linux上的。 2.c#的命名空间和java包的区别&#xff1a; c#中是按照包来的&#x…

使用Django框架自带的Form表单完成简单的用户登录注册

如果不知道怎么配置Django环境以及如何连接数据库请点击我的上一篇博客&#xff1a; 使用pycharm初始化Django框架并连接Sql Server 文章目录 1.Django默认生成的数据表2.用户登录2.1创建登录页面2.2视图处理登录请求2.3配置访问路径 3.用户注册3.1创建用户表单3.2创建注册模版…

linux系统基础知识-基础IO

IO 概念引入位图的概念IO的系统调用函数openwriteread()close简单使用样例&#xff1a; 文件描述符fd默认文件流stdin/stdout/stderr文件描述符的分配规则 重定向的概念输出重定向输入重定向追加重定向dup2()系统调用总结 文件缓冲区深入理解缓冲区的概念输出缓冲区部分代码解释…

jmeter循环控制器

1.循环控制器 简单粗暴 写几次 循环几次 经常结合自定义变量使用 2.foreach控制器 搭配 变量一起使用的循环 一般变量的值是一个集合或者 是2个及2个以上的内容

BERT 模型是什么

科学突破很少发生在真空中。相反&#xff0c;它们往往是建立在积累的人类知识之上的阶梯的倒数第二步。要了解 ChatGPT 和 Google Bart 等大型语言模型 &#xff08;LLM&#xff09; 的成功&#xff0c;我们需要回到过去并谈论 BERT。 BERT 由 Google 研究人员于 2018 年开发&…

软件测试笔记

文章目录 基础知识1.常见测试分类2.质量模型3.测试流程4.用例5.等价类6.边界值分析方法7.判定表8.流程图9.场景法10.错误推测法11.缺陷12.缺陷编写13.缺陷管理工具注&#xff1a;内容和图片来自黑马程序员视频。 基础知识 1.常见测试分类 按阶段划分 (1)单元测试&#xff1a…

详解java继承

目录 一 、为什么需要继承 二、准备工作&#xff1a;用java代码先定义狗类、猫类、动物类&#xff0c;这是代码准备如下 三、继承代码实现 四、 子类中访问父类的成员方法 4.1. 成员方法名字不同 4.2 成员方法名字相同 五、子类构造方法 扩展&#xff1a;如果你对子类和…

手撕 PCA

PCA&#xff08;Principal Component Analysis&#xff09;&#xff0c;中文名称&#xff1a;主成分分析。迄今为止最流行的降维算法。 假设 n 维空间中的一个单位立方体&#xff0c;易知&#xff1a;一维空间中该立方体中任意两点的距离不超过 1 1 1&#xff0c;二维空间中该…

系列十四、while do...while switch模板代码

一、while & do...while & switch模板代码 1.1、while /*** 需求&#xff1a;使用while循环打印5遍Hello World!*/ Test public void print5() {int i 1;while (i < 5) {System.out.println("Hello World! " LocalDateTime.now());// 线程休眠&#x…

批量置入视频封面:一分钟教程,简单易学

在视频制作过程中&#xff0c;为视频添加引人注目的封面是吸引观众的关键。而当我们需要批量处理多个视频时&#xff0c;如何快速、准确地置入封面就显得尤为重要。本文将为您揭示这一高效技巧&#xff0c;让您在一分钟内学会批量置入视频封面&#xff0c;提升视频的吸引力与观…

GEC6818 智能语音家居系统——原神主题的平板

GEC6818 智能语音家居系统——原神主题的平板 文章目录 GEC6818 智能语音家居系统——原神主题的平板一、 滑动解锁密码解锁二、 在桌面有两种方式可以进行选择2.1 普通点击模式2.1.1 电子相册2.1.2 监控2.1.3 画板2.1.4 视频播放2.1.5 五子棋小游戏2.1.6 烟雾传感器GY39RFID 2…

独家原创:“ARO算法的再进化,BMARO的创新改进与卓越表现“

人工兔优化算法ARO作为一种近期比较好的优化算法&#xff0c;深受人们和编辑的喜爱。 人工兔优化算法&#xff08;Artificial Rabbit Optimization, ARO&#xff09;是一种基于自然界兔子行为的启发式优化算法。该算法通过模拟兔子在寻找食物和规遍领地时的智能行为&#xff0…

Java药物不良反应ADR智能监测系统源码

药物不良反应&#xff08;Adverse Drug Reaction&#xff0c;ADR&#xff09;是指在使用合格药品时&#xff0c;在正常的用法和用量下出现的与用药目的无关的有害反应。这些反应往往因药物种类、使用方式、个体差异等因素而异&#xff0c;可能导致患者身体不适、病情恶化。 为保…

Linux shell jq工具操作文档(jq --help使用示例)

文章目录 jq工具介绍jq --help解读英文中文 使用示例1. 使用最简单的过滤器。将输入复制到输出&#xff0c;不做任何修改&#xff08;除了格式化&#xff09;2. 使用 -c 选项进行紧凑输出而非美化输出3. 使用 -n 选项以 null 作为单一输入值&#xff08;用于创建新json&#xf…

podman configure insecure certificate registry【podman 设置非安全镜像仓库】

预备条件 docker registry仓库私搭并配置证书centos 7.9 部署 harbor 镜像仓库实践harbor 部署入门指南Podman 部署私有镜像仓库 设置 $ vim /etc/hosts 192.168.23.47 registry.ghostwritten.com$ vim /etc/containers/registries.conf ... [[registry]] location "r…

网工内推 | 运维工程师,国企、上市公司,RHCE认证优先

01 广东机场白云信息科技股份有限公司 招聘岗位&#xff1a;基础架构运维工程师&#xff08;中级&#xff09; 职责描述&#xff1a; 1、参与公司业务系统的监控、巡检、维护、故障定位、原因分析&#xff1b; 2、负责业务系统的上线、升级割接工作&#xff1b; 3、负责服务器…

RequestMapping注解的使用和常见的GET和POST请求方式

RequestMapping注解的使用和常见的GET和POST请求方式 1、使用说明 作用&#xff1a;用于建立请求URL和处理请求方法之间的对应关系。 出现位置&#xff1a; 类上&#xff1a; 请求 URL的第一级访问目录。此处不写的话&#xff0c;就相当于应用的根目录。写的话需要以/开头。它…
最新文章