【算法刷题】leetcode hot 100 双指针

文章目录

  • 283. 移动零
  • 11. 盛最多水的容器
  • 15. 三数之和
  • 42. 接雨水


283. 移动零

在这里插入图片描述
https://leetcode.cn/problems/move-zeroes/description/?envType=study-plan-v2&envId=top-100-liked

解法一:
找到第一个等于0的下标,然后继续向右找到第一个不等于0的下标,交换,循环结束即可:

    public void moveZeroes(int[] nums) {int i=0,j=0;while(i<nums.length && j<nums.length){while (i<nums.length && nums[i]!=0){i++;}j = i+1;while (j<nums.length && nums[j]==0){j++;}if(j < nums.length){nums[i]=nums[j];nums[j]=0;}}}

解法二(推荐):

统计不为0的个数:

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

11. 盛最多水的容器

在这里插入图片描述

leetcode: https://leetcode.cn/problems/container-with-most-water/description/?envType=study-plan-v2&envId=top-100-liked

移动较短的一端是关键:

  • 移动较短的一端可能增加水量,因为面积取决于较短的高度。
  • 如果移动较长的一端,宽度减少,但高度不会增加,面积一定不会更大。
    public int maxArea(int[] height) {int left = 0;int right = height.length - 1;int max = 0;while (left < right) {if (height[left] < height[right]) {max = Math.max(max, height[left] * (right - left));left++;}else {max = Math.max(max, height[right] * (right - left));right--;}}return max;}

15. 三数之和

在这里插入图片描述

  1. leetcode:https://leetcode.cn/problems/3sum/description/?envType=study-plan-v2&envId=top-100-liked

  2. 联想两数之和怎么解决的?
    【找到两个数之和为target的数组下标。】通过哈希表,遍历这个数组的同时,判断是否存放了与当前num[i]相加=target的值,没有的话将当前的num[i]存放到哈希表中。

        // <Value, Index>Map<Integer, Integer> map = new HashMap<>();for (int i = 0;i < nums.length; i++) {int complete = target - nums[i];if (map.containsKey(complete)) {return new int[]{map.get(complete), i};}map.put(nums[i], i);}

这里的三数之和:nums[i] + nums[j] + nums[k] == 0i,j,k不相同。我们从下标为0的数开始,一个一个遍历它们可能存在的答案组合的可能性,即在固定数字 nums[i] 后,用双指针在数组的剩余部分([i+1, n-1])寻找两数之和为 −nums[i] 的组合。

    public List<List<Integer>> threeSum(int[] nums) {Arrays.sort(nums);Set<List<Integer>> res = new HashSet<>();for (int i = 0; i < nums.length - 2; i++) {int p = i+1, q = nums.length - 1;while (p < q) {int comp = nums[i] + nums[p] + nums[q];if (comp == 0) {res.add(Arrays.asList(nums[i], nums[p], nums[q]));p++;q--;}else if (comp > 0) {q--;}else {p++;}}}return res.stream().toList();}

42. 接雨水

在这里插入图片描述

  1. leetcode:https://leetcode.cn/problems/trapping-rain-water/description/?envType=study-plan-v2&envId=top-100-liked

  2. 双指针法:

(1)定义两个指针 leftright,分别指向数组的两端。

(2)定义两个变量 leftMaxrightMax,分别记录从左到右和从右到左的最大高度。

(3)根据左右指针高度比较:

  • 如果 height[left] < height[right],则可以确定 left 柱子的雨水高度为 leftMax - height[left]
  • 否则,确定 right 柱子的雨水高度为 rightMax - height[right]

(4)移动较低的一侧的指针,继续计算。

    public int trap(int[] height) {// 定义两个指针int left = 0, right = height.length - 1;// 保存左右两端最大的值int leftMax = 0, rightMax = 0;int ans = 0;while (left < right) {// 更新左侧最大高度if (height[left] < height[right]) {if (height[left] > leftMax) {leftMax = height[left];}else {ans += leftMax - height[left];}left++;}else {// 更新右侧最大高度if (height[right] > rightMax) {rightMax = height[right];}else {ans += rightMax - height[right];}right--;}}return ans;}
  1. 动态规划

预处理数组 leftMax[i]rightMax[i]

  • leftMax[i] 表示第 i 个柱子左侧的最大高度。
  • rightMax[i] 表示第 i 个柱子右侧的最大高度。

遍历每个柱子,计算其雨水高度:water[i] = min(leftMax[i], rightMax[i]) - height[i]

public int trap(int[] height) {if (height == null || height.length < 2) {return 0;}int n = height.length;int[] leftMax = new int[n];int[] rightMax = new int[n];// 计算左侧最大高度leftMax[0] = height[0];for (int i = 1; i < n; i++) {leftMax[i] = Math.max(leftMax[i - 1], height[i]);}// 计算右侧最大高度rightMax[n - 1] = height[n - 1];for (int i = n - 2; i >= 0; i--) {rightMax[i] = Math.max(rightMax[i + 1], height[i]);}// 计算雨水总量int ans = 0;for (int i = 0; i < n; i++) {ans += Math.min(leftMax[i], rightMax[i]) - height[i];}return ans;
}

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

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

相关文章

Flutter Xcode 16+ iOS 18.1 使用image_pickers无法弹出选择图片的视图问题

解决 Flutter Xcode 16 使用 image_pickers 无法弹出选择图片视图的问题 在开发 Flutter 应用时&#xff0c;图片选择功能是常见的需求之一。image_pickers 库因其便捷性和功能丰富性&#xff0c;成为了许多开发者的选择。然而&#xff0c;随着 Xcode 版本的不断更新&#xff…

高斯混合模型 (Gaussian Mixture Model, GMM) 算法详解与PyTorch实现

高斯混合模型 (Gaussian Mixture Model, GMM) 算法详解与PyTorch实现 目录 高斯混合模型 (Gaussian Mixture Model, GMM) 算法详解与PyTorch实现1. 高斯混合模型 (GMM) 算法概述1.1 高斯分布1.2 GMM的优势2. GMM的核心技术2.1 模型定义2.2 参数估计2.3 损失函数3. PyTorch实现G…

【蓝桥杯选拔赛真题60】C++寻宝石 第十四届蓝桥杯青少年创意编程大赛 算法思维 C++编程选拔赛真题解

目录 C++寻宝石 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 五、运行结果 六、考点分析 七、推荐资料 C++寻宝石 第十四届蓝桥杯青少年创意编程大赛C++选拔赛真题 一、题目要求 1、编程实现 有N(1<N<100)个盒子排成一排,每个盒子都放…

计算机组成原理(九):乘法器

乘法器原理 乘法器的工作原理可以用二进制乘法来说明。二进制乘法和十进制乘法类似&#xff0c;通过部分积的累加得到结果。 部分积的生成 在二进制乘法中&#xff0c;每一位的乘积是两个二进制数位的 与运算&#xff08;0 0 0&#xff0c;1 0 0&#xff0c;0 1 0&…

【汇编】x86汇编编程寄存器资源心中有数

1. CPU状态及控制寄存器 TR&#xff0c;GDTR&#xff0c;LDTRcr0-cr3EFLAGS 等等 2. 业务计算寄存器&#xff08;我起的名字&#xff09; 业务寄存器用于访问内存、参数传递、数据传递、计算。 段寄存器6个&#xff1a; cs&#xff0c;ds&#xff0c;es&#xff0c;ss&…

vue封装axios请求

在vue项目中我们发送请求一般是使用axios 我们可以封装axios来避免冗余代码 首先引入axios npm install axios创建环境配置文件 NODE_ENV development VITE_APP_TITLE dev VITE_APP_BASE_API /test VITE_SERVE "http://127.0.0.1"上面是创建dev配置文件 也可以…

Nginx入门笔记

Nginx入门笔记 一、Nginx基本概念二、代理1、正向代理2、反向代理 三、准备工作1、CentOS 7安装nginx&#xff08;1&#xff09;. 安装必要的依赖&#xff08;2&#xff09;下载nginx&#xff08;3&#xff09;编译安装&#xff08;4&#xff09;编译并安装 Nginx(5)启动nginx …

基于旋转框的目标检测算法简单实操

使用labelme工具&#xff0c;使用多边形方式进行标注。 pip install labelme 标注完成后只需要将标注的数据使用opencv的最小外接矩形框进行转化即可。 labelme标注的多边形格式数据转换成COCO旋转框格式&#xff0c;转换脚本代码如下&#xff1a; import os import json impo…

重塑视频创作的格局!ComfyUI-Mochi本地部署教程

一、介绍 mochi是近期Genmo公司开源的先进视频生成模型&#xff0c;具有高保真运动和强大的提示遵循性。此模型的发布极大的缩小了闭源和开源视频生成系统之间的差距。 目前&#xff0c;视频生成模型与现实之间存在巨大差距。其中最影响视频生成的两个关键功能也就是运动质量和…

el-table自定义按钮控制扩展expand

需求&#xff1a;自定义按钮实现表格扩展内容的展开和收起&#xff0c;实现如下&#xff1a; 将type“expand”的表格列的宽度设置为width"1"&#xff0c;让该操作列不展示出来&#xff0c;然后通过ref动态调用组件的内部方法toggleRowExpansion(row, row.expanded)控…

Attention计算中的各个矩阵的维度都是如何一步步变化的?

在Transformer模型中&#xff0c;各个矩阵的维度变化是一个关键的过程&#xff0c;涉及到输入、编码器、解码器和输出等多个阶段。以下是详细的维度变化过程&#xff1a; 输入阶段 输入序列&#xff1a;假设输入序列的长度为seq_len&#xff0c;每个单词或标记通过词嵌入&…

Ubuntu 22.04 英伟达开发环境 CUDA 12.4 | cuDNN 9.0.0 | TensorRT 10.1 版本安装指南

NVIDIA 驱动安装 前置 笔者近期重整服务器&#xff0c;计划重新安装操作系统并配置新的开发环境。服务器的主要配置如下&#xff1a; Dell PowerEdge R730 Intel Xeon E5-2630v3 x2 64GB ECC DDR4 NVIDIA GeForce RTX 2080 Ti Rev. A Ubuntu 22.04.5 LTS x86_64 (No Desktop…

数据结构-栈、队列和数组

栈 栈的定义 栈是只允许在一端进行插入或删除操作的线性表。首先栈式一种线性表&#xff0c;但限定这种线性表只能在某一端进行插入和删除操作&#xff0c;如图所示。 栈包括&#xff1a; 栈顶&#xff08;Top&#xff09;。允许进入插入删除的那一端。 栈底&#xff08;Butt…

源代码编译安装X11及相关库、vim,配置vim(3)

一、vim插件安装 首先安装插件管理器Vundle ()。参照官网流程即可。vim的插件管理器有多个&#xff0c;只用Vundle就够了。然后~/.vimrc里写上要安装的插件: filetype offset rtp~/.vim/bundle/Vundle.vim call vundle#begin() Plugin VundleVim/Vundle.vim Plugin powerline…

Mysql快速列出来所有列信息

文章目录 需求描述实现思路1、如何查表信息2、如何取字段描述信息3、如何将列信息一行展示4、拼接最终结果 需求描述 如何将MySQL数据库中指定表【tb_order】的所有字段都展示出来&#xff0c;以备注中的中文名为列名。 实现思路 最终展示效果&#xff0c;即拼接出可执行执行…

LLM大模型实践10-聊天机器人

大型语言模型带给我们的激动人心的一种可能性是&#xff0c;我们可以通过它构建定制的聊天机器人 &#xff08;Chatbot&#xff09;&#xff0c;而且只需很少的工作量。在这一章节的探索中&#xff0c;我们将带你了解如何利用会话形式&#xff0c;与具 有个性化特性&#xff08…

用python实现烟花代码,完整代码拿走不谢

有时候用python实现一些有趣的代码&#xff0c;既有趣&#xff0c;又能提升知识 使用Python实现动态烟花代码 效果如下&#xff1a; 不废话&#xff0c;直接上代码&#xff1a; import pygame from random import randint, uniform, choice import mathvector pygame.math…

[IoT]物联网(IoT)网络的安全性

确保物联网(IoT)网络的安全性是至关重要的&#xff0c;以下是一些关键措施来保障网络的安全性&#xff1a; 1. 数据加密 传输加密&#xff1a;使用TLS/SSL协议对数据传输进行加密&#xff0c;确保数据在传输过程中不被窃听或篡改。存储加密&#xff1a;对存储在设备或服务器上…

【Java项目】基于SpringBoot的【校园交友系统】

【Java项目】基于SpringBoot的【校园交友系统】 技术简介&#xff1a;系统软件架构选择B/S模式、SpringBoot框架、java技术和MySQL数据库等&#xff0c;总体功能模块运用自顶向下的分层思想。 系统简介&#xff1a;系统主要包括管理员和用户。 (a) 管理员的功能主要有首页、个人…

window.print()预览时表格显示不全

问题描述&#xff1a;使用element的table组件&#xff0c;表格列宽为自适应&#xff0c;但使用window.print()方法预览的页面会直接按预览宽度截取表格内容进行展示&#xff0c;造成表格可能的显示不全问题 解决方法&#xff1a;添加如下样式 media print {::v-deep {// 表头…