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

2024-01-04

双指针

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

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. 接雨水

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

LeetCode-数组-双指针-中等难度 的相关文章

  • 教育场景数字化中音视频小程序的发展

    教育场景数字化逐步成为刚需 2018年以来 国家对在线教育行业的监管收紧 以及受益于 5G 技术的发展 教育科技逐步走向成熟化和规范化 教育行业的本质是人与人 老师与学生 老师与家长 以及更多角色直接的沟通与互动 而仅仅是古早式的在线文字已
  • 网络对讲终端 网络音频终端 网络广播终端SV-7011V使用说明

    高速路sip广播对讲求助 隧道sip对讲调度SIP 7011 网络广播终端SV 7011 壁挂式对讲终端网络监听终端SIP广播终端 sip语音对讲终端SIP 7011 SV 7011网络对讲终端网络对讲 网络厂播 监听 SV 7101网络解

随机推荐

  • 如何用Java实现自动化测试和质量控制?

    使用 Java 实现 自动化测试 和质量控制是现代 软件开发 中的重要环节 下面将详细介绍如何使用Java实现自动化测试和质量控制 一 自动化测试概述 自动化测试是指使用软件工具和脚本来执行测试任务 以代替人工操作并提高测试效率 以下是一些
  • 如何使用 Python+selenium 进行 web 自动化测试?

    Selenium是一个自动化测试工具 它可以模拟用户在浏览器中的操作 比如点击 输入 选择等等 它支持多种浏览器 包括Chrome Firefox Safari等等 并且可以在多个平台上运行 安装和配置Selenium 在使用Seleniu
  • 民安智库(第三方市场调研公司):餐饮企业顾客满意度调查,赢得口碑的关键

    在餐饮行业 顾客满意度调查是至关重要的一环 通过对顾客的反馈进行调查和分析 可以了解顾客的需求和期望 从而针对性地改进产品和服务 提升顾客满意度和忠诚度 本文将分享民安智库在餐饮企业顾客满意度调查方面的实践经验 在开展顾客满意度调查之前 要
  • 数据库基础知识

    关系模型的程序员不需熟悉数据库的存取路径 在3层模式结构中 I 是数据库的核心和关键 通常是模式的子集 数据库模式的描述提供给用户 的描述存储在硬盘上 模式 外模式 内模式 数据库中 数据的物理独立性是指用户的应用程序与存储在磁盘上数据库中
  • [linux] from megatron import报错no moudle

    sys path insert地址 sys path insert 0 xx megablocks Megatron LM
  • 基于深度学习的停车位关键点检测系统(代码+原理)

    摘要 DMPR PS是一种基于深度学习的停车位检测系统 旨在实时监测和识别停车场中的停车位 该系统利用图像处理和分析技术 通过摄像头获取停车场的实时图像 并自动检测停车位的位置和状态 本文详细介绍了DMPR PS系统的算法原理 创新点和实验
  • 电商API的探索之旅:从请求示例到高并发挑战

    在数字化时代 电商系统已成为商业领域不可或缺的一环 电商API作为电商系统的重要组成部分 承担着连接前端和后端的桥梁角色 其重要性不言而喻 本文将深入探讨电商API的核心技术 从请求示例到高并发处理 为您揭示电商API的探索之旅 一 电商A
  • 系列十、Spring Cloud Gateway

    一 Spring Cloud Gateway 1 1 概述 Spring Cloud全家桶中有个很重要的组件就是网关 在1 x版本中采用的是Zuul网关 但是在2 x版本中 由于Zuul的升级一直跳票 Spring Cloud最后自己研发了
  • 培训机构管理系统软件哪个比较好?提升培训机构运营效率

    在当前教育行业的激烈竞争环境中 培训机构需要不断提升自身管理水平以应对市场挑战 随着科技的发展 越来越多的培训机构开始引入管理系统 以提升运营效率 解决各种痛点问题 那么 培训机构管理系统软件哪个比较好 下面让我们一起来了解一下 培训机构管
  • 按照层次遍历结果打印完全二叉树

    按照层次遍历结果打印完全二叉树 按照推论结果 l 层首个节点位置 2 h l 1 l 层节点间距 2 h l 1 1 编码实现 public static
  • 八股文打卡day20——操作系统(3)

    面试题 线程同步的方式有哪些 我的回答 多线程同时访问和修改某个数据的话 会造成数据的不一致和冲突问题 所以就需要线程同步 线程同步的方式有 1 互斥锁 互斥锁就是 当一个资源被访问和操作时 会对这个资源加锁 把这个资源锁定 其他线程不能对
  • 题解 | #删除字符串中出现次数最少的字符# 利用map统计

    比预期的要低 HR打电话说是14级 不分ABC 说制造类供应链类工资和研发体系不一样 整体就要低一些 offer选择 大家帮忙看看 offer选择 大家帮忙看看 有奖活动 什么事是你实习了才知道的 春招会有好的国央企吗 招前端实习生 北京快
  • 题解 | #删除字符串中出现次数最少的字符# 利用map统计

    比预期的要低 HR打电话说是14级 不分ABC 说制造类供应链类工资和研发体系不一样 整体就要低一些 offer选择 大家帮忙看看 offer选择 大家帮忙看看 有奖活动 什么事是你实习了才知道的 春招会有好的国央企吗 招前端实习生 北京快
  • EasyRecovery2024永久免费版电脑数据恢复软件

    EasyRecovery是一款操作安全 价格便宜 用户自主操作的非破坏性的只读应用程序 它不会往源驱上写任何东西 也不会对源驱做任何改变 它支持从各种各样的存储介质恢复删除或者丢失的文件 其支持的媒体介质包括 硬盘驱动器 光驱 闪存 以及其
  • 智康护居家养老服务上门介绍

    近年来 我国老龄化进程不断加速 养老服务成为社会关注的热点之一 居家养老服务上门作为养老服务的一项重要服务方式 受到越来越多老人和家庭的青睐 居家养老服务上门分为生活照料 基础照护 健康管理 探访服务等几个方面 下面我们就来详细介绍它们 生
  • css学习之路:sass学习基础篇

    SCSS 一 动态的样式语言 让CSS有变量的概念 css有很多的缺点 语法不够强大 没有变量和合理的样式复用机制 导致难以维护 我们就可以使用动态样式语言 赋予CSS新的特性 常见的动态样式语言 scss sass scss兼容sass
  • 设计创新,流程优化:3D开发HOOPS在数字化工厂中的多面应用

    随着科技的不断发展 数字化转型已经成为各行各业的共同趋势 而工业领域也不例外 在这一浩大的变革浪潮中 Tech Soft 3D的 HOOPS 正以其卓越的性能和多功能性 成为数字化工厂领域的关键推动力 数字化工厂概述 数字化工厂是指通过将传
  • Ontrack EasyRecovery(易恢复中国)2024专业数据文件恢复软件

    Ontrack EasyRecovery 易恢复中国 是全球著名数据厂商Kroll Ontrack出品的一款专业数据文件恢复软件 EasyRecovery数据恢复软件支持恢复不同存储介质数据 硬盘 光盘 U盘 移动硬盘 数码相机 RAID磁
  • CSS学习之路: 基础学习篇

    css基础 一 css3 概述 1 1 什么是css Cascading style sheets 层叠样式表 级联样式表 简称样式表 1 2 css作用 对页面中html元素进行美化 1 3 HTML和css的关系 HTML 负责页面结构
  • LeetCode-数组-双指针-中等难度

    文章目录 双指针 1 删除有序数组中的重复项 入门 1 1 题目描述 1 2 解题思路 1 3 代码实现 2 删除有序数组中的重复项 II 简单