当前位置: 首页 > news >正文

[Java][算法 双指针]Day 02---LeetCode 热题 100---04~07

LeetCode 热题 100---04~07

第一题:移动零

思路

找到每一个为0的元素 然后移到数组的最后  但是需要注意的是  要在给定的数组原地进行修改  并且其他非零元素的相对顺序不能改变  我们采用双指针法

定义两个指针i和j  i和j一开始分别都在0索引位置  然后判断j所在位置元素数值  如果等于0 则往下走一位 反之 则将数值赋值到i位置 j和i同时向下走一位

这样子 i总在j后面  j所到的非零元素 都会按照相对顺序依次赋值到i的位置  当j走到重点  i必然还没走到重点(除非整个数组没有0元素) 此时j会停止 而其他非零元素已经全部到达i的前方位置

接下来只需要遍历一遍i~j  将这部分的元素置零即可  大致过程如下(最后将两箭头之间的元素置零即可)

第二题:盛最多水的容器

解法一  暴力法(超时)

最简单直接的方法就是双重for嵌套  依次遍历 两两求体积 最后取最大值即可

思路是可行的 但是在数据量大的情况下 时间超时也是没办法的

class Solution {public int maxArea(int[] height) {if(height.length==1 || height.length==0) return 0;int max=0;for (int i = 0; i < height.length; i++) {for(int j=i+1;j<height.length;j++){int v=(j-i)*Math.min(height[i],height[j]);if(v>max) max=v;}}return max;}
}

解法二 双指针法

首先  我们直到  求两个板子能装水的体积 就是 Min(板A,板B)*AB之间的距离

那么 按照这个思路  我们让AB分别从数组最两端开始 那么可以确定的是我们之后每次都只向内移动变化 那么 AB之间的距离 这个变量就是单调递减的  那么剩下的变化因素就是 Min(板A,板B)

A,B板的移动 都会影响该数值   现在我们来分析 假设我们A板是较短的那块板子

当我们移动A板  即移动短板  A'板的长度可能长于也可能短于A板

如果A'短于A板子 那么Min(A',B)肯定是A'  比Min(A,B)小  AB距离变小 那么整个体积肯定减小

如果A'长于A板子  那么Min(A',B)等于A'或者B(需要看A'和B哪个长)  但是无论如何肯定会比Min(A,B)大  但是AB之间的距离减小 所以最后两者的乘积 体积V的变化情况就不一定了 所以是可能变大 可能变小 可能不变

当我们移动B板  即移动短板  B'板的长度可能长于也可能短于B板

如果B'短于B板子 那么Min(A,B')可能是A也可能是B'   比Min(A,B)小  AB距离变小 那么整个体积肯定减小

如果B'长于B板子  因为短板效应 那么Min(A,B')还是等于A  但是AB之间距离减小 所以体积一定减小

综上  移动长版  体积一定减小  移动短板  体积可能变大

所以 我们双指针可以分别从两端开始  每次移动短的那一块 然后记录出最大体积值即可

class Solution {public int maxArea(int[] height) {if(height.length==0||height.length==1) return 0;int i=0;int v=0;int j=height.length-1;int max=0;while(i<j){if(height[i]>height[j]){v=height[j]*(j-i);j--;}else{v=height[i]*(j-i);i++;}if(v>max) max=v;}return max;}
}

第三题:三数之和

思路

首先是要记得特殊情况直接判断length小于3和数组为null直接范围[]

然后 如果整个数组的最小数都大于0 那么也可以直接返回  所以这就需要我们实现排序

然后对于正常情况  即我们要找到三个数  使其和等于0  最简单直接的 当然是for循环的嵌套 

很容易理解和实现 但是时间复杂度肯定是很大的

为了简化寻找的过程 我们只需要一个循环数 其他的都用固定表达式表示即可

假设我们对数组进行了排序   我们让i从0开始遍历  然后定义变量j=i+1 g=length-1作为双指针  我们在用i遍历的时候  每到一个位置 我们需要在j和g之间遍历找数据

每次计算出nums[i]+nums[j]+nums[g]来判断是否等于0  因为整个数组是有序的 那么我们就可以根据和0的大小比较来直到该如何移动j和g 小于动j  大于动g

(思想类似于[Java][算法 哈希]Day 01---LeetCode 热题 100---01~03-CSDN博客中第一大题的移动思想)

class Solution {public List<List<Integer>> threeSum(int[] nums) {if(nums.length<3||nums==null) return new ArrayList<>();List<List<Integer>> list=new ArrayList<>();Arrays.sort(nums);int i=0;for(i=0;i<nums.length;i++){// 去重if(i>0 && nums[i]==nums[i-1]) continue;int j=i+1,g=nums.length-1;if(nums[i]>0) break;while(j<g){int sum=nums[i]+nums[j]+nums[g];if(sum==0){list.add(Arrays.asList(nums[i],nums[j],nums[g]));while(j < g && nums[j] == nums[j+1]) {j++;}while(j< g && nums[g] == nums[g-1]){g--;}j++;g--;}else if(sum>0){g--;}else if(sum<0){j++;}}}return list;}
}

第四题:接雨水

思路

对于这个题目 我们不应该集中想法去整体求值 而应该去想办法如何单独求出每一个的值 然后相加

对于每一个位置 i 能达到的水柱高度和其左边的最高柱子、右边的最高柱子有关,我们分别称这两个柱子高度为 l_max 和 r_max位置 i 最大的水柱高度就是 min(l_max, r_max)*height[i]

根据这个思路 我们就知道 需要在遍历的时候  找到该位置的左右两边的最高的柱子  然后又选左右两边最高的中的较小的那个

解法一:暴力法

int trap(int[] height) {int n = height.length;int res = 0;for (int i = 1; i < n - 1; i++) {int l_max = 0, r_max = 0;// 找右边最高的柱子for (int j = i; j < n; j++)r_max = Math.max(r_max, height[j]);// 找左边最高的柱子for (int j = i; j >= 0; j--)l_max = Math.max(l_max, height[j]);// 如果自己就是最高的话,// l_max == r_max == height[i]res += Math.min(l_max, r_max) - height[i];}return res;
}

 解法二:双指针法

我们利用双指针  一个从最左边移动 一个从最右边移动 边走边算的模式 

每次走到一个点 先比较该点数值和历史记录的最大值  用于及时更新最大值

更新完最大值之后 比较两边的最大值  取出较小的那个进行计算 最后再移动小的那个

(因为计算是去小数值的 那么计算完之后代表该次计算完成  只有移动小的才能保证不忽略 不重复)

class Solution {int trap(int[] height) {int left = 0, right = height.length - 1;int l_max = 0, r_max = 0;int res = 0;while (left < right) {l_max = Math.max(l_max, height[left]);r_max = Math.max(r_max, height[right]);// res += min(l_max, r_max) - height[i]if (l_max < r_max) {res += l_max - height[left];left++;} else {res += r_max - height[right];right--;}}return res;}
}

相关文章:

[Java][算法 双指针]Day 02---LeetCode 热题 100---04~07

LeetCode 热题 100---04~07 第一题&#xff1a;移动零 思路 找到每一个为0的元素 然后移到数组的最后 但是需要注意的是 要在给定的数组原地进行修改 并且其他非零元素的相对顺序不能改变 我们采用双指针法 定义两个指针i和j i和j一开始分别都在0索引位置 然后判断j所…...

【问题解决】如何将一个服务器的docker迁移到另一个服务器

要将Docker容器从一台机器迁移到另一台机器&#xff0c;可以按照以下步骤操作&#xff1a; 在机器A上提交容器为镜像&#xff1a; 使用docker commit命令将运行中的容器保存为新的镜像。这里需要容器的ID或名称&#xff0c;以及你想要命名的目标镜像名。 docker commit [容器…...

C++单例模式详解

目录 0. 前言 1. 懒汉式单例模式 1.1 最简单的单例模式 1.2 防止内存泄漏 1.2.1 智能指针的方法 1.2.2 静态嵌套的方法 1.3 保证线程安全 1.4 C11版本的优雅解决方案 2. 饿汉式单例模式 0. 前言 起因是在程序中重复声明了一个单例模式的变量&#xff0c;后来程序怎么调…...

LLM应用开发与落地:流式响应

一、背景 最近智能客服产品给到一个游戏客户那边&#xff0c;客户那边的客服负责人体验后认为我们产品回答的准确率是还是比较高的。同时&#xff0c;他反馈了几个需要改进的地方&#xff0c;其中一个就是机器人回复慢。机器人回复慢有很多原因&#xff0c;也有优化方式&#…...

神经网络 | 基于 CNN 模型实现土壤湿度预测

Hi&#xff0c;大家好&#xff0c;我是半亩花海。在现代农业和环境监测中&#xff0c;了解土壤湿度的变化对于作物生长和水资源管理至关重要。通过深度学习技术&#xff0c;特别是卷积神经网络&#xff0c;我们可以利用过去的土壤湿度数据来预测未来的湿度趋势。本文将使用 Pad…...

江科大STM32 终

目录 SPI协议10.1 SPI简介W25Q64简介10.3 SPI软件读写W25Q6410.4 SPI硬件外设读写W25Q64 BKP备份寄存器、PER电源控制器、RTC实时时钟11.0 Unix时间戳代码示例&#xff1a;读写备份寄存器BKP11.2 RTC实时时钟 十二、PWR电源控制12.1 PWR简介代码示例&#xff1a;修改主频12.3 串…...

《MySQL 简易速速上手小册》第10章:未来趋势和进阶资源(2024 最新版)

文章目录 10.1 MySQL 在云计算和容器化中的应用10.1.1 基础知识10.1.2 重点案例&#xff1a;使用 Python 部署 MySQL 到 Kubernetes10.1.3 拓展案例 1&#xff1a;在 AWS RDS 上部署 MySQL 实例10.1.4 拓展案例 2&#xff1a;使用 Docker 部署 MySQL 10.2 MySQL 和 NoSQL 的整合…...

Stable Diffusion 模型下载:GhostMix(幽灵混合)

文章目录 模型介绍生成案例案例一案例二案例三案例四案例五案例六案例七案例八案例九案例十 下载地址 模型介绍 GhostMix 是绝对让你惊艳的模型&#xff0c;也是自己认为现在最强的2.5D模型。我认为模型的更新应该是基于现有的画面整体不大变的前提下&#xff0c;提高模型的成…...

django解决Table ‘xx‘ already exists的方法

1&#xff0c;首先看已存在的这个库表结构是什么样的&#xff0c;先让对应的model.py恢复到和他一样的字段 2&#xff0c;删除对应app下的migrations目录里面除__init__.py文件的其他所有文件 3&#xff0c;回到manage.py所在目录执行python manage.py makemigrations 4&#x…...

qt学习:arm摄像头+c调用v412框架驱动+qt调用v412框架驱动 显示摄像头画面

目录 跟内核进行数据通信的函数 编程步骤 c代码 头文件 打开摄像头文件 /dev/videox 获取当前主机上&#xff08;开发板&#xff09;摄像头列表信息 设置当前摄像头的画面格式 比如说 设置 采集图像的宽度为640 高度 480 在内核空间中&#xff0c;申请一个缓冲区队列…...

Linux 36.2@Jetson Orin Nano基础环境构建

Linux 36.2Jetson Orin Nano基础环境构建 1. 源由2. 步骤2.1 安装NVIDIA Jetson Linux 36.2系统2.2 必备软件安装2.3 基本远程环境2.3.1 远程ssh登录2.3.2 samba局域网2.3.3 VNC远程登录 2.4 开发环境安装 3. 总结 1. 源由 现在流行什么&#xff0c;也跟风来么一个一篇。当然&…...

牛客网SQL264:查询每个日期新用户的次日留存率

官网链接&#xff1a; 牛客每个人最近的登录日期(五)_牛客题霸_牛客网牛客每天有很多人登录&#xff0c;请你统计一下牛客每个日期新用户的次日留存率。 有一个登录(login。题目来自【牛客题霸】https://www.nowcoder.com/practice/ea0c56cd700344b590182aad03cc61b8?tpId82 …...

echarts 曲线图自定义提示框

<!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>曲线图</title><!-- 引入 ECharts 库 -->…...

幻兽帕鲁服务器怎么搭建?Palworld多人联机教程

玩转幻兽帕鲁服务器&#xff0c;阿里云推出新手0基础一键部署幻兽帕鲁服务器教程&#xff0c;傻瓜式一键部署&#xff0c;3分钟即可成功创建一台Palworld专属服务器&#xff0c;成本仅需26元&#xff0c;阿里云服务器网aliyunfuwuqi.com分享2024年新版基于阿里云搭建幻兽帕鲁服…...

DAY39: 动态规划不同路径问题62

Leetcode: 62 不同路径 机器人从(0 , 0) 位置出发&#xff0c;到(m - 1, n - 1)终点。 基本思路 1、确定dp数组&#xff08;dp table&#xff09;以及下标的含义 dp[i][j] &#xff1a;表示从&#xff08;0 &#xff0c;0&#xff09;出发&#xff0c;到(i, j) 有dp[i][j]条…...

idea开发工具的简单使用与常见问题

1、配置git 选择左上角目录file->setting 打开&#xff0c;Version Control 目录下Git&#xff0c;选择git安装目录下的git.exe文件&#xff1b; 点击test&#xff0c;出现git版本&#xff0c;则表示git识别成功&#xff0c;点击右下角确认即可生效。 2、配置node.js 选…...

使用 WMI 查询安全软件信息

在这篇文章中&#xff0c;我们将详细介绍如何使用 Windows Management Instrumentation (WMI) API 来查询当前计算机上安装的安全软件的基本信息。我们将分析代码的各个部分&#xff0c;并解释每个步骤所涉及的技术和原理。 一、什么是 WMI&#xff1f; WMI 是 Windows Manag…...

创建TextMeshPro字体文件

相比于Unity的Text组件&#xff0c;TextMesh Pro提供了更强大的文本格式和布局控制&#xff0c;更高级的文本渲染技术&#xff0c;更灵活的文本样式和纹理支持&#xff0c;更好的性能以及更易于使用的优点。但unity自带TextMeshPro字体不支持中文。这里使用普通字体文件生成Tex…...

信创ARM架构QT应用开发环境搭建

Linux ARM架构QT应用开发环境搭建 前言交叉工具链Ubuntu上安装 32 位 ARM 交叉工具链Ubuntu上安装 64 位 ARM 交叉工具链 交叉编译 QT 库下载 QT 源码交叉编译 QT 源码 Qt Creator交叉编译配置配置 Qt Creator Kits创建一个测试项目 小结 前言 有没有碰到过这种情况&#xff1…...

使用SPM_batch进行批量跑脚本(matlab.m)

软件&#xff1a;spm8matlab2023bwin11 数据格式&#xff1a; F:\ASL\HC\CBF\HC_caishaoqing\CBF.nii F:\ASL\HC\CBF\HC_caishaoqing\T1.nii F:\ASL\HC\CBF\HC_wangdonga\CBF.nii F:\ASL\HC\CBF\HC_wangdonga\T1.nii clear spmdirD:\AnalysisApps\spm8; datadirF:\ASL\HC\CBF…...

在rocky linux 9.5上在线安装 docker

前面是指南&#xff0c;后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...

java 实现excel文件转pdf | 无水印 | 无限制

文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

Java编程之桥接模式

定义 桥接模式&#xff08;Bridge Pattern&#xff09;属于结构型设计模式&#xff0c;它的核心意图是将抽象部分与实现部分分离&#xff0c;使它们可以独立地变化。这种模式通过组合关系来替代继承关系&#xff0c;从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...

【JavaSE】多线程基础学习笔记

多线程基础 -线程相关概念 程序&#xff08;Program&#xff09; 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序&#xff0c;比如我们使用QQ&#xff0c;就启动了一个进程&#xff0c;操作系统就会为该进程分配内存…...

并发编程 - go版

1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程&#xff0c;系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...

【WebSocket】SpringBoot项目中使用WebSocket

1. 导入坐标 如果springboot父工程没有加入websocket的起步依赖&#xff0c;添加它的坐标的时候需要带上版本号。 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId> </dep…...

【java面试】微服务篇

【java面试】微服务篇 一、总体框架二、Springcloud&#xff08;一&#xff09;Springcloud五大组件&#xff08;二&#xff09;服务注册和发现1、Eureka2、Nacos &#xff08;三&#xff09;负载均衡1、Ribbon负载均衡流程2、Ribbon负载均衡策略3、自定义负载均衡策略4、总结 …...

李沐--动手学深度学习--GRU

1.GRU从零开始实现 #9.1.2GRU从零开始实现 import torch from torch import nn from d2l import torch as d2l#首先读取 8.5节中使用的时间机器数据集 batch_size,num_steps 32,35 train_iter,vocab d2l.load_data_time_machine(batch_size,num_steps) #初始化模型参数 def …...

作为点的对象CenterNet论文阅读

摘要 检测器将图像中的物体表示为轴对齐的边界框。大多数成功的目标检测方法都会枚举几乎完整的潜在目标位置列表&#xff0c;并对每一个位置进行分类。这种做法既浪费又低效&#xff0c;并且需要额外的后处理。在本文中&#xff0c;我们采取了不同的方法。我们将物体建模为单…...