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

    @Override
    public 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;
            }
            // 不管这轮是载走了首位两个人,还是只能带走最胖的那个人,船的数量都+1
            res = 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));
    }
}

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

# Kafka_深入探秘者(10):kafka 监控

Kafka_深入探秘者&#xff08;10&#xff09;&#xff1a;kafka 监控 一、kafka JMX 1、JMX &#xff1a;全称 Java Managent Extension 在实现 Kafka 监控系统的过程中&#xff0c;首先我们要知道监控的数据从哪来&#xff0c;Kafka 自身提供的监控指标(包括 broker 和主题的…

Zabbix如何帮助企业将监控数据转化为竞争优势

By Fernanda Moraes 在我们生活的高度互联世界中&#xff0c;变化以越来越快和激烈的速度发生。这影响了消费者的认知与行为&#xff0c;迫使零售商寻找更有效的方式来吸引客户。Linx 是 StoneCo 集团旗下的一家公司&#xff0c;也是零售技术专家&#xff0c;Linx了解这一点&am…

无线麦克风领夹哪个牌子好,2024年领夹麦克风品牌排行榜推荐

​随着短视频热潮的兴起&#xff0c;越来越多的人倾向于用vlog记录日常生活&#xff0c;同时借助短视频和直播平台开辟了副业。在这一过程中&#xff0c;麦克风在近两年内迅速发展&#xff0c;从最初的简单收音功能演变为拥有多样款式和功能&#xff0c;以满足视频创作的需求。…

数据脱敏学习

数据脱敏是一种保护敏感信息的方法&#xff0c;它通过修改或删除数据中的敏感部分&#xff0c;使得数据在保持一定可用性的同时&#xff0c;不再直接关联到个人隐私或重要信息。 自然人指可以直接或间接标识 直接标识&#xff1a;如姓名、身份证号码、家庭住址、电话号码、电…

生命在于折腾——Macbook虚拟机开启360核晶

首先启动PD虚拟机&#xff0c;打开360&#xff0c;发现提示如下&#xff1a; 此时将虚拟机关机。 打开该虚拟机设置&#xff1a; 将虚拟机监控程序改为Parallels&#xff0c;并启动nested虚拟化。 改好后截图如下&#xff1a; 保存设置&#xff0c;开机 此时就可以开启了…

手机恢复已删除数据,3种情况下的解决办法,史诗级教程

手机已经变成了我们生活中的“黑匣子”&#xff0c;记录着我们的通讯录、照片、视频、聊天记录等各种重要数据。然而&#xff0c;由于误删、系统崩溃或其他不可预测的情况&#xff0c;我们可能会面临数据丢失的风险。 本文将为你提供一份史诗级的教程&#xff0c;详细介绍3种不…

10种超强图像特征提取算法Python代码实现

声明&#xff1a;文章是从本人公众号中复制而来&#xff0c;因此&#xff0c;想最新最快了解各类算法的家人&#xff0c;可关注我的VX公众号&#xff1a;python算法小当家&#xff0c;不定期会有很多免费代码分享~ 图像特征提取是计算机视觉和图像处理的关键步骤&#xff0c;因…

零基础STM32单片机编程入门(四)ADC详解及实战含源码视频

文章目录 一.概要二.STM32F103C8T6单片机ADC外设特点三.STM32单片机ADC内部结构图1.ADC相关引脚说明2.ADC通道分类3.触发源4.转换周期5.电压转换计算6.更精确电压转换计算 四.规则通道ADC采集信号流向1.单次转换模式2.连续转换模式 五.CubeMX配置一个ADC采集例程六.CubeMX工程源…

Nginx反向代理实现Vue跨域注意事项

1、通过搜索引擎访问Nginx官网——免费使用——NGINX开源版(免费下载)或者通过以下链接直接访问Nginx下载页面下载对应的版本(下载页面)。以下以1.24.0为例 2、修改nginx的配置文件&#xff0c;在conf文件夹下&#xff0c;文件名为nginx.conf&#xff1b;以下是我修改完的配置…

【Python数据分析与可视化】:使用【Matplotlib】实现销售数据的全面分析 ——【Matplotlib】数模学习

目录 安装Matplotlib 1.打开PyCharm&#xff1a; 2.打开终端&#xff1a; 3.安装Matplotlib&#xff1a; 4.确认安装&#xff1a; 导入Matplotlib 创建简单的折线图 代码解析&#xff1a; 创建子图 代码解析&#xff1a; 创建柱状图 代码解析&#xff1a; 创建散点…

总结一下Linux、Windows、Ubuntu、Debian、CentOS等到底是啥?及它们的区别是什么

小朋友你总是有很多问好 你是否跟我一样&#xff0c;不是计算机科班出身&#xff0c;很多东西都是拿着在用&#xff0c;并不知道为什么&#xff0c;或者对于它们的概念也是稀里糊涂的&#xff0c;比如今天说的这个。先简单描述下&#xff0c;我先前的疑问&#xff1a; Linux是…

《昇思25天学习打卡营第9天 | 昇思MindSpore使用静态图加速》

第九天 本节了解到AI编译框架分为两种运行模式&#xff0c;分别是动态图模式以及静态图模式。MindSpore默认情况下是以动态图模式运行&#xff0c;但也支持手工切换为静态图模式。 1.动态图模式 动态图的特点是计算图的构建和计算同时发生&#xff08;Define by run&#xff09…

Studying-代码随想录训练营day23| 39.组合总和、40.组合总和II、131.分割回文串

第23天&#xff0c;回溯part02&#xff0c;回溯两个题型组合&#xff0c;切割(ง •_•)ง&#x1f4aa; 目录 39.组合总和 40.组合总和II 131.分割回文串 总结 39.组合总和 文档讲解&#xff1a;代码随想录组合总和 视频讲解&#xff1a;手撕组合总和 题目&#xff1a;…

一文汇总VSCode多光标用法

光标的创建 按住alt&#xff0c;鼠标左键单击&#xff0c;在单击位置生成光标/删除光标 按住ctrlalt&#xff0c;单击↑/↓&#xff0c;在每行同一个位置&#xff08;若某一行较短&#xff0c;则在行尾&#xff09;生成光标&#xff0c;这个不会删除光标&#xff0c;只会在光标…

点击获取2024SIAL西雅国际食品展上海展后报告

随着2024年SIAL 西雅展&#xff08;上海&#xff09;的圆满落幕&#xff0c;我们不仅见证了一场食品与饮料行业的国际盛会&#xff0c;更是感受到了上海这座城市独有的魅力与活力。在这里&#xff0c;我们回顾了上海展的辉煌成就&#xff0c;同时&#xff0c;我们也满怀期待地展…

基于横纵向的混合联邦学习原理分析

近期陆续接触到关于混合联邦学习的概念&#xff0c;但基于横纵向的混合联邦实际的应用案例却几乎没有看到&#xff0c;普遍是一些实验性的课题&#xff0c;因此这一领域知识没有被很好普及。本篇文章的目的&#xff0c;主要是分析讨论关于横纵向混合联邦学习的业务场景、应用架…

Linux Redis 服务设置开机自启动

文章目录 前言一、准备工作二、操作步骤2.1 修改redis.conf文件2.2 创建启动脚本2.3 设置redis 脚本权限2.4 设置开机启动2.5 验证 总结 前言 请各大网友尊重本人原创知识分享&#xff0c;谨记本人博客&#xff1a;南国以南i、 提示&#xff1a;以下是本篇文章正文内容&#x…

【Electron】Electron入门实现

Electron 学习笔记 Electron 是一个开源框架&#xff0c;允许开发者使用网页技术&#xff08;HTML、CSS 和 JavaScript&#xff09;来构建跨平台的桌面应用程序。它由 GitHub 开发并维护&#xff0c;最初是为了支持开发 Atom 编辑器。Electron 结合了 Chromium&#xff08;用于…

海外仓一件代发业务优化指南:成本构成分析及优化策略

一件代发是大部分海外仓的核心业务&#xff0c;不过随着海外仓市场竞争的加剧&#xff0c;仓库经营成本上涨成了普遍现象。 今天我们会结合众多海外仓的实际情况&#xff0c;综合分析海外仓一件代发业务成本的构成&#xff0c;成本激增的原因以及对应的优化策略&#xff0c;希…

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

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