【LeetCode】九、双指针算法:环形链表检测 + 救生艇

文章目录

  • 1、双指针算法
    • 1.1 对撞双指针
    • 1.2 快慢双指针
  • 2、leetcode141:环形链表
  • 3、leetcode881:救生艇

1、双指针算法

用两个指针来共同解决一个问题:

在这里插入图片描述

1.1 对撞双指针

比如先有一个有序的数组array

int[] array = {1, 4, 5, 7, 9}

先要找两个数,使得其和为12,且两个数不能相同。最先想到的是,两层循环,遍历array,如外层 i = 1,内层循环 j = 4 5 7 9,外层 i = 4,内层循环 j = 1 5 7 9……,但这样时间复杂度为O(n^2)。用对撞双指针优化:

在这里插入图片描述

在这里插入图片描述
对撞前即p1 <= p2,p1 = p2时,说明二者指向同一个元素,再往下就错开了。

1.2 快慢双指针

比如现在要检测一个链表是否为环形:

在这里插入图片描述

此时可用快慢双指针,慢的一次走一步,s = s.next,快的一次走两步,f = f.next.next,二者同时从队首出发:

在这里插入图片描述

移动三次后,快慢指针相遇了,这说明是个环形,否则二者不会相遇。

2、leetcode141:环形链表

在这里插入图片描述
和上面的快慢指针一样,代码实现:

public class P141 {public static boolean checkCycle(ListNode head) {if (null == head) {return false;}// 快慢指针,均从头节点开始ListNode slowPoint = head;ListNode fastPoint = head;// 这里的条件无需判断慢指针,如果是环形,大家都不为null// 如果不是环形,那一定是快指针先走完而出现null// 因此退出循环的条件是:快指针走完了,而快指针一次两步,所以走完的条件是当前已为空或者不够两步了while(fastPoint != null && fastPoint.next != null) {// 慢指针一次一步,快指针一次两步slowPoint = slowPoint.next;fastPoint = fastPoint.next.next;if (slowPoint.equals(fastPoint)){return true;}}return false;}
}

测试:

//链表节点类
public class ListNode {int val;ListNode next;public ListNode() {}public ListNode(int val, ListNode next) {this.val = val;this.next = next;}@Overridepublic String toString() {return "ListNode{" +"val=" + val +", next=" + next +'}';}
}
public class P141 {public static void main(String[] args) {ListNode tailNode = new ListNode(1, null);ListNode node4 = new ListNode(2, tailNode);ListNode node3 = new ListNode(2, node4);ListNode node2 = new ListNode(1, node3);ListNode node1 = new ListNode(0, node2);ListNode head = new ListNode(9, node1);tailNode.setNext(head);System.out.println(checkCycle(head));}
}

在这里插入图片描述

3、leetcode881:救生艇

在这里插入图片描述
其实本质是两个人的体重之和问题,和上面提到的对撞指针很像,不过一个是等号,一个是小于号,因此考虑先给所有人的体重从小到大排个序(因为排序是对撞指针移动的基础前提)

public class P881 {public static int calcMinShipNum (int[] weight, int limit) {if (weight == null || weight.length == 0 || limit <= 0) {return 0;}Arrays.sort(weight);// 头尾指针的位置int i = 0;int j = weight.length - 1;// 船的数量int res = 0;while (i <= j) {if (weight[i] + weight[j] < limit) {// 两个人可以乘一条船走,船的数量+1,头指针向右一位,尾指针向左一位i = i + 1;j = j - 1;} else {// 两个人体重总和超重,只让最胖的人走j = j - 1;}// 不管这轮是载走了首位两个人,还是只能带走最胖的那个人,船的数量都+1res = res + 1;}return res;}
}

测试:


public class P881 {public static void main(String[] args) {int[] weightArray = {3,5,3,4};System.out.println(calcMinShipNum(weightArray, 5));}
}

在这里插入图片描述

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

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

相关文章

什么是产线工控安全,如何保障产线设备的安全

什么是产线工控安全&#xff1f; 工控&#xff0c;指的是工业自动化控制&#xff0c;主要利用电子电气、机械、软件组合实现。即是工业控制系统&#xff0c;或者是工厂自动化控制。产线工控安全指的是工业控制系统的数据、网络和系统安全。随着工业信息化的迅猛发展&#xff0…

如何利用“AI交互数字人+展厅”拓展文娱消费空间?

打造新生代潮玩聚集地&#xff0c;打造演艺新空间&#xff0c;促进虚拟现实体验等文娱业态场景创新&#xff0c;成为了当下发展文旅消费新场景的一大重要手段。数字人汇集了虚拟现实、增强现实、全息投影、人工智能、实时传输语音合成等数字技术&#xff0c;可以利用数字人重构…

SpringBoot项目中获取IP地址

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言 OkHttp 是一个由 Square 开发的高效、现代的 HTTP 客户端库&#xff0c;用于 Android 和 Java 应用程序。它支持 HTTP/2 和 SPDY 等现代网络协议&#xff0c;…

Jmeter 进行http接口测试

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 本文主要针对http接口进行测试&#xff0c;使用 jmeter工具实现。 Jmeter工具设计之初是用于做性…

如何用Vue3和Plotly.js绘制动态3D图表?

本文由ScriptEcho平台提供技术支持 项目地址&#xff1a;传送门 Plotly.js: 使用Vue.js动态加载数据并绘制图表 应用场景 在数据可视化应用中&#xff0c;需要将数据动态加载到图表中并进行实时更新。本文将展示如何使用Plotly.js和Vue.js实现这一功能&#xff0c;从加载外…

MobPush iOS端海外推送最佳实现

推送注册 在AppDelegate里进行SDK初始化&#xff08;也可以在Info.plist文件中进行AppKey&#xff0c;AppSecret的配置&#xff09;并对通知功能进行注册以及设置推送的环境和切换海外服务器等&#xff0c;参考如下步骤代码&#xff1a; <span style"background-colo…

【深度学习】图形模型基础(1):使用潜在变量模型进行数据分析的box循环

1.绪论 探索数据背后的隐藏规律&#xff0c;这不仅是数据分析的艺术&#xff0c;更是概率模型展现其威力的舞台。在这一过程中&#xff0c;潜在变量模型尤为关键&#xff0c;它成为了数据驱动问题解决的核心引擎。潜在变量模型的基本理念在于&#xff0c;那些看似复杂、杂乱无…

又是一篇关于GD32堆栈的梳理+FreeRTOS的空间

GD32F103CB&#xff1a;SRAM 20K&#xff08;0x5000&#xff09; 这篇文章主要想讲清楚几个事情&#xff1a; 1、启动文件Stack_Size、Heap_Size的大小设置有啥影响&#xff1b; 2、FreeRTOS的内存&#xff1a;FreeRTOSConfig.h文件configTOTAL_HEAP_SIZE&#xff1b; 问题2…

讯飞星火V4.0 发布,全面对标GPT-4 Turbo

6月27日&#xff0c;讯飞星火V4.0如期而至&#xff0c;升级成为更懂你的AI助手。 七大核心能力持续突破&#xff0c;全面对标GPT-4 Turbo。在8个国际主流测试集中排名第一&#xff0c;讯飞星火以一份惹眼的成绩单&#xff0c;成为国内大模型的先行者。 发布会现场&#xff0c…

用数组模拟栈实现递归函数模拟

做算法课设时候看到题目要求模拟函数递归时候栈的入栈出栈过程。本来想着直接调用系统递归函数即可&#xff0c;可是发现系统函数栈的空间非常小大约只有3000层&#xff0c;很容易爆栈。于是便有了用栈去模拟递归函数的想法&#xff0c;但是上网查了下貌似相关代码比较少&#…

小马搬运物品-第13届蓝桥杯省赛Python真题精选

[导读]&#xff1a;超平老师的Scratch蓝桥杯真题解读系列在推出之后&#xff0c;受到了广大老师和家长的好评&#xff0c;非常感谢各位的认可和厚爱。作为回馈&#xff0c;超平老师计划推出《Python蓝桥杯真题解析100讲》&#xff0c;这是解读系列的第89讲。 小马搬运物品&…

如何与Honda建立EDI连接?

你是本田Honda的新供应商&#xff0c;需要具备EDI电子数据交换功能吗&#xff1f;在与本田Honda交换EDI消息时需要帮助吗&#xff1f;本文将带你快速了解Honda的EDI需求&#xff0c;明确EDI对接需要完成的工作。 项目背景 本田是一家世界领先的汽车制造商&#xff0c;在全球2…

仓库选址问题【数学规划的应用(含代码)】阿里达院MindOpt

本文主要讲述使用MindOpt工具优化仓库选址的数学规划问题。 视频讲解&#x1f448;&#x1f448;&#x1f448;&#x1f448;&#x1f448;&#x1f448;&#x1f448;&#x1f448;&#x1f448; 一、案例场景 仓库选址问题在现代物流和供应链管理中具有重要的应用。因为仓库…

《数据结构与算法基础 by王卓老师》学习笔记——2.2线性表的案例引入

案例一&#xff1a;一元多项式的运算 案例二&#xff1a;稀疏多项式的运算 案例三&#xff1a;图书信息管理系统 总结

【Leetcode】520. 检测大写字母

文章目录 题目思路代码复杂度分析时间复杂度空间复杂度 结果总结 题目 题目链接&#x1f517;我们定义&#xff0c;在以下情况时&#xff0c;单词的大写用法是正确的&#xff1a; 全部字母都是大写&#xff0c;比如 “USA” 。单词中所有字母都不是大写&#xff0c;比如 “le…

同心创建 共践食安 | 赵梦澈荣获食品安全大使

“民族要复兴&#xff0c;乡村必振兴”&#xff0c;为深入贯彻落实国家乡村振兴战略&#xff0c;推进乡村全面振兴不断取得新成效&#xff0c;助力全国优质食品农产品的宣传推广、市场营销、品牌创建工作&#xff0c;由中国食品安全报社主办&#xff0c;商业发展中心、健康中国…

python数据分析与可视化一

公共部分 # 引入数据分析工具 Pandas import pandas as pd # 引入数据可视化工具 Matplotlib import matplotlib.pyplot as plt # 引入数据可视化工具 Seaborn (基于matplotlib) import seaborn as sns # 解决输出时的列名对齐问题 pd.set_option(display.unicode.east_…

如何申请免费SSL证书以消除访问网站显示连接不安全提醒

在当今互联网时代&#xff0c;网络安全已成为一个不可忽视的问题。当用户浏览一些网站时&#xff0c;有时会看到浏览器地址栏出现“不安全”的提示&#xff0c;这意味着该网站没有安装SSL证书&#xff0c;数据传输可能存在风险。那么&#xff0c;如何消除这种不安全提醒&#x…

仓库管理系统16--入库管理

原创不易&#xff0c;打字不易&#xff0c;截图不易&#xff0c;多多点赞&#xff0c;送人玫瑰&#xff0c;留有余香&#xff0c;财务自由明日实现。 1、创建物资入库用户控件 <UserControl x:Class"West.StoreMgr.View.InStoreView"xmlns"http://schema…

CAS自旋解析

CAS全称CompareAndSwap(比较并交换)&#xff0c;是cpu的指令&#xff0c;调用时不涉及上下文的切换。Java中属于乐观锁的一种&#xff0c;具体流程如下图&#xff1a; 具体的实现使用的是Unsafe类去调用native修饰的compareAndSwap方法&#xff0c;4个字段分别是对象实例&#…