[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;}
}

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

爪哇部落算法组2024新生赛热身赛题解

第一题&#xff08;签到&#xff09;&#xff1a; 1、题意&#xff1a; 2、题解: 我们观察到happynewyear的长度是12个字符&#xff0c;我们直接从前往后遍历0到n - 12的位置&#xff08;这里索引从0开始&#xff09;&#xff0c;使用C的substr()函数找到以i开头的长度为12的字…

【Linux】进程学习(二):进程状态

目录 1.进程状态1.1 阻塞1.2 挂起 2. 进程状态2.1 运行状态-R进一步理解运行状态 2.2 睡眠状态-S2.3 休眠状态-D2.4 暂停状态-T2.5 僵尸状态-Z僵尸进程的危害 2.6 死亡状态-X2.7 孤儿进程 1.进程状态 1.1 阻塞 阻塞&#xff1a;进程因为等待某种条件就绪&#xff0c;而导致的…

leetcode(哈希表)49.字母异位词分组(C++详细解释)DAY5

文章目录 1.题目示例提示 2.解答思路3.实现代码结果 4.总结 1.题目 给你一个字符串数组&#xff0c;请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。 字母异位词 是由重新排列源单词的所有字母得到的一个新单词。 示例 示例 1: 输入: strs [“eat”, “tea”…

【JavaWeb】头条新闻项目实现 基本增删改查 分页查询 登录注册校验 业务功能实现 第二期

文章目录 一、为什么使用token口令二、登录注册功能2.1 登录表单提交后端代码&#xff1a; 2.2 根据token获取完整用户信息代码实现&#xff1a; 2.3 注册时用户名占用校验代码实现&#xff1a; 2.4 注册表单提交代码实现&#xff1a; 三、头条首页功能3.1 查询所有头条分类3.2…

第三讲 多重背包问题①——转化

【题目来源】AcWing 4. 多重背包问题 I 【题意分析】和完全背包问题类似&#xff0c;但是区别在于每一种物品的数量是有限的。 【解决方法】 1.转化为 0 / 1 0/1 0/1 背包问题 因为每一种物品数量有限&#xff0c;所以将每个物品看作单独的种类&#xff0c;可转化为 0 / 1 0/…

掌握Vue,开启你的前端开发之路!

介绍&#xff1a;Vue.js是一个构建数据驱动的Web应用的渐进式框架&#xff0c;它以简洁和轻量级著称。 首先&#xff0c;Vue.js的核心在于其视图层&#xff0c;它允许开发者通过简单的模板语法将数据渲染进DOM&#xff08;文档对象模型&#xff09;。以下是Vue.js的几个重要特点…

Git中为常用指令配置别名

目录 1 前言 2 具体操作 2.1 创建.bashrc文件 2.2 添加指令 2.3 使其生效 2.4 测试 1 前言 在Git中有一些常用指令比较长&#xff0c;当我们直接输入&#xff0c;不仅费时费力&#xff0c;还容易出错。这时候&#xff0c;如果能给其取个简短的别名&#xff0c;那么事情就…

力扣102. 二叉树的层序遍历 (复习vector和queue的常见用法

目录 题目描述 题目解析 题目答案 题目所用知识点 最后 题目描述 给你二叉树的根节点 root &#xff0c;返回其节点值的 层序遍历 。 &#xff08;即逐层地&#xff0c;从左到右访问所有节点&#xff09;。力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术…

K8S之运用节点选择器指定Pod运行的节点

node节点选择器的使用 使用场景实践使用nodeName使用nodeSelectornodeName和nodeSelector混合使用1、设置了nodeName 和 设置 Node上都不存在的标签。看调度情况2、设置nodeName 为node1 和 设置 node2上才有的标签。看调度情况 实践总结 使用场景 默认情况&#xff0c;在创建…

c++二叉树寒假特训题目(2)

hello&#xff0c;我是Joseph&#xff0c;今天推出第二期c二叉树寒假特训题目。 第一期传送门 第一期答案传送门 这期有7题&#xff0c;目录如下。 目录 题目 二叉树结点查找 二叉树是否对称 ​编辑 二叉排序树 层次遍历 根据前序中序求后序 二叉树高度 ​编辑 二…

【通讯录案例-偏好设置 Objective-C语言】

一、刚才,我们plist存储,讲完了,这个plist,我直接,右键,打开 打开 不用xcode,我就用文本文档打开,打开方式:其他 选择:文本编辑 打开 好,这个里边儿啊,就是我们刚才存的一个Key:Value 它本质上,是一个xml 这是一种文件的格式, 等你们讲到网络的时候,实际上,…

MGIE官网体验入口 苹果多模态大语言模型AI图像编辑工具在线使用地址

MGIE是一项由苹果开源的技术&#xff0c;利用多模态大型语言模型&#xff08;MLLMs&#xff09;生成图像编辑指令&#xff0c;通过端到端训练&#xff0c;捕捉视觉想象力并执行图像处理操作&#xff0c;使图像编辑更加智能、直观。 MGIE官网体验入口https://github.com/apple/M…

上市公司人工智能转型指数及55个工具变量汇总数据集(2024.2月更新)

一、“智能化转型”发文趋势和主题分布 二、数据来源 上市公司年报、官网&#xff0c;中国知网及各期刊官网等三、时间跨度 工具变量&#xff1a;2022-2024年&#xff1b; 上市公司人工智能转型指数&#xff1a;2007-2021年四、数据范围 中国A股上市公司五、数据展示 序号…

单片机学习笔记---串口向电脑发送数据电脑通过串口控制LED

目录 串口向电脑发送数据 每隔一秒串口就发送一个递增的数给电脑 电脑通过串口控制LED 波特率的具体计算 HEX模式和文本模式 前两节是本节的理论基础&#xff0c;这节开始代码演示&#xff01; 串口向电脑发送数据 接下来先开始演示一下串口单向发送一个数字给电脑&…

ShardingSphere 5.x 系列【3】分库分表中间件技术选型

有道无术,术尚可求,有术无道,止于术。 本系列Spring Boot 版本 3.1.0 本系列ShardingSphere 版本 5.4.0 源码地址:https://gitee.com/pearl-organization/study-sharding-sphere-demo 文章目录 1. 前言2. My Cat3. ShardingSphere4. Dble5. Vitess6. 大厂开源6.1 Cobar6.…

[HTTP协议]应用层的HTTP 协议介绍

目录 1.前言 2.使用fiddler抓包来观察HTTP协议格式 3.HTTP协议的基本格式 2.1请求 2,1.1首行 2.1.2请求头 2.1.3空行 2.2响应 2.2.1首行 2.2.2响应头 键值对 ​编辑2.2.3空行 2.2.4载荷(响应正文) 3.认识URL 3.1关于URL encode 1.前言 我们在前面的博客中,简单的…

火星文:网络时代下的语言

引言 在互联网时代&#xff0c;网络语言的发展日新月异。火星文作为一种特殊的网络表达方式&#xff0c;近年来逐渐兴起并成为了网络文化的一部分。 火星文生成器 | 一个覆盖广泛主题工具的高效在线平台(amd794.com) https://amd794.com/huoxingwen 火星文的兴起时代 火星…

请手写几种js排序算法

什么是排序算法 冒泡排序选择排序插入排序快速排序归并排序&#xff08;Merge Sort&#xff09; 思想实现测试分析动画 快速排序 &#xff08;Quick Sort&#xff09; 思想实现测试分析动画 思考&#xff1a;快排和归并用的都是分治思想&#xff0c;递推公式和递归代码也非常相…

深度学习在知识图谱问答中的革新与挑战

目录 前言1 背景知识2 基于深度学习改进问句解析模型2.1 谓词匹配2.2 问句解析2.3 逐步生成查询图 3 基于深度学习的端到端模型3.1 端到端框架3.2 简单嵌入技术 4 优势4.1 深入的问题表示4.2 实体关系表示深挖4.3 候选答案排序效果好 5 挑战5.1 依赖大量训练语料5.2 推理类问句…

MacOS上怎么把格式化成APFS的U盘或者硬盘格式化回ExFAT?

一、问题 MacOS在更新MacOS Monterey后或者更高系统后发现&#xff0c;格式U盘或者硬盘只有4个APFS选项&#xff0c;那么我们该如何将APFS格式成ExFAT&#xff1f; 二、解答 将APFS的U盘或者硬盘拓展成MacOS的拓展格式即可&#xff0c;操作步骤如下 1、电脑接入U盘或者硬盘 2…