代码随想录一刷-Day09

2023-10-27

LeetCode27. 移除元素

public int removeElement(int[] nums, int val) {
    if (nums.length == 0) {
        return 0;
    }

    // 双指针
    int slow = 0, fast = 0;
    while (fast < nums.length) {
        nums[slow] = nums[fast];
        // 当 slow 指向的数值不为目标值,两个指针一起移动
        if (nums[slow] != val) {
            slow++;
            fast++;
        } else {
            // 慢指针指向的值是目标值,慢指针停下,快指针移动
            fast++;
        }
    }

    return slow;
}

时间复杂度:O(n)
空间复杂度:O(1)



LeetCode206.反转链表

public ListNode reverseList(ListNode head) {
    if (head == null || head.next == null) {
        return head;
    }
    // 普通的方法
    // 虚拟头
    ListNode dummyHead = new ListNode(-1, head);

    ListNode pre = dummyHead;
    ListNode cur = head;
    // ListNode next = head.next;

    while (cur != null) {
        ListNode temp = cur.next;
        cur.next = (pre == dummyHead ? null : pre);
        pre = cur;
        cur = temp;
    }

    return pre;
}

时间复杂度:O(n)
空间复杂度:O(1)



LeetCode19.删除链表的倒数第N个节点

取巧的方法,因为题目说明节点数最多只有30个,因此可以这样偷鸡

如果节点数量不明确,则不可使用

public ListNode removeNthFromEnd(ListNode head, int n) {
    if (head == null) {
        return head;
    }

    // 投机取巧的方法,使用中间数组
    // ∵题目中说明节点数量最多 30
    ListNode[] array = new ListNode[30];
    ListNode cur = head;
    int len = 0;
    while (cur != null) {
        array[len++] = cur;
        cur = cur.next;
    }

    int index = len - n;
    // 当需要删除的位置在 0 的时候,返回 head 之后的节点即可
    if (index == 0) {
        return head.next;
    }
    ListNode pre = array[index - 1];
    ListNode del = array[index];
    pre.next = del.next;
    del.next = null;

    return head;
}

时间复杂度:O(n)
空间复杂度:O(n)

Carl 的题解:

public ListNode removeNthFromEnd(ListNode head, int n) {
    // 又忘记了
    // 使用双指针可以提高空间复杂度
    // 快指针先走 n-1 步,之后快慢指针一起移动,当快指针指向末尾时,慢指针指向的节点就是需要删除的

    // 使用虚拟头可以减少特殊情况
    ListNode dummy = new ListNode(-1, head);
    //int slow = 0, fast = 0;
    ListNode slowN = dummy, fastN = dummy;
    while (n > 0) {
        fastN = fastN.next;
        n--;
    }
    // slowN 和 fastN 一起移动,直到 fastN.next 为空
    while (fastN.next != null) {
        slowN = slowN.next;
        fastN = fastN.next;
    }
    // 删除 slowN 的下一个节点
    slowN.next = slowN.next.next;

    return dummy.next;
}

时间复杂度:O(n)
空间复杂度:O(1)



面试题 02.07. 链表相交

这题记得,有点开心

public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
    if (headA == null || headB == null) {
        return null;
    }
    // 好像记得
    // 首先求出两个链表各自的长度
    // 再计算两个长度的差值 n,此差值就是快慢指针相差的步长
    // 快指针先走 n 步,然后两个指针一起移动并开始比较
    ListNode curA = headA;
    int lenA = 0;
    while (curA.next != null) {
        curA = curA.next;
        lenA++;
    }

    ListNode curB = headB;
    int lenB = 0;
    while (curB.next != null) {
        curB = curB.next;
        lenB++;
    }

    ListNode fastN, slowN;
    int n = 0;
    if (lenA > lenB) {
        fastN = headA;
        slowN = headB;
        n = lenA - lenB;
    } else {
        fastN = headB;
        slowN = headA;
        n = lenB - lenA;
    }

    // 快指针先走 n 步
    while (n > 0) {
        fastN = fastN.next;
        n--;
    }
    // 快慢指针一起走
    while (fastN != null && slowN != null) {
        if (fastN == slowN) {
            return fastN;
        }
        fastN = fastN.next;
        slowN = slowN.next;
    }
    return null;
}

时间复杂度:O(n + m)
空间复杂度:O(1)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

代码随想录一刷-Day09 的相关文章

随机推荐

  • check_hostname requires server_hostname

    代理服务器 Proxy Server 的功能是代理网络用户去取得网络信息 形象地说 它是网络信息的中转站 是个人网络和Internet服务商之间的中间代理机构 负责转发合法的网络信息 对转发进行控制和登记 vpn
  • myslq服务安装启动

    D Program Files x86 MySQL MySQL Server 5 5 bin gt mysqld exe install Service successfully installed D Program Files x86
  • 【MATLAB】三维图像绘制+图形对象句柄

    目录 一 三维曲面绘图 二 图形对象句柄 1 三位图形属性设置 2 动态图 用循环语句 pause 叠加画图 hold on hold on 的基础上刷新画图 set h xdata x ydata y 每次重置点 曲线或曲面 的横纵坐标
  • Could not read Username Error for Git

    在用使用Vundle安装neocomplete时失败 查看log提示could not read Username for https github com Device not configured 经检查这里提示的Username是指n
  • vue3中,this.$router.push刷新当前页面,该页面不重新加载需要手动刷新的解决方案

    1 demo vue 在this router push demo 后 demo vue没有刷新也没有重新加载 但是路由地址已经变了 只是需要手动刷新 2 解决 监听一下当前路由 watch route to from to表示要跳转的路由
  • 固定资产可视化智能管理系统

    什么是资产管理 企业一般有设备 工具 IT通讯 仪器 载具 文档 家具和一些其他的资产 比如某个制造企业现状 共计约有8000个资产分布存在于30个区域 包括实验室 办公室和工厂 其中每年新入资产预估为2000个 报废资产预计1800个 在
  • Python 3D函数图形投影到2D坐标轴上

    1 contourf函数命令 cmap matplotlib cm jet norm matplotlib colors Normalize vmin min np array sol vmax max np array sol plt c
  • 统计学习方法 第七章习题答案

    习题7 1 题目 比较感知机的对偶形式与线性可分支持向量机的对偶形式 解答 感知机 原始形式 min w b
  • linux:linux基础命令(一)

    前言 为什么要学linux 为了运维 项目上线 所以要了解linux操作系统 什么是LNMP linux nginx mysql php小常识 一个用Linux Shell编写的可以为CentOS RadHat Debian Ubuntu
  • 进程和子进程

    进程和子进程 父子进程有独立的数据段 堆 栈 共享代码段 Linux中每个进程都有4G的虚拟地址空间 独立的3G用户空间和共享的1G内核空间 fork 创建的子进程也不例外 子进程资源的由来 1G内核空间既然是所有进程共享 因此fork 创
  • input type=“file”上传文件(一)

    使用input标签 type file 的时候就可以上传文件 为input标签添加change事件 调用函数
  • qt 添加动作 (QAction)

    Qt 5 mainwindow h ifndef MAINWINDOW H define MAINWINDOW H include
  • 3Dgame_homework7

    3D游戏 作业7 智能巡逻兵 要求 游戏设计要求 程序设计要求 提示 相关理论 实现过程与代码 智能巡逻兵 要求 游戏设计要求 创建一个地图和若干巡逻兵 使用动画 每个巡逻兵走一个 3 5 个边的凸多边型 其位置数据是相对地址 即每次确定下
  • 静态库调用动态库或者静态库(Cmake例子)

    1 静态库无论调用动态库还是静态库都只需要include库的头文件 2 要在调用该静态库的地方添加库引用 并设置路径 结论 其实静态库调用动态库或者静态库 只是在用到库方法的地方把该方法添加到LIB当中 真正使用的地方才会把这些库LINK起
  • flutter_blue优化(FlutterBlue.instance.scan搜索重复、搜索结果处理、更新之前保存缓存数据、保存连接成功的设备)

    1 搜索列表优化 FlutterBlue instance scan搜索重复 搜索结果处理 更新之前保存缓存数据 2 保存连接过的设备 3 十进制转十六进制 4 写入十六进制数据 json scan dart 实体类 主要是使用flutte
  • Spring Boot是什么?它的优点是什么?

    Spring Boot是什么 它的优点是什么 Spring Boot是一个基于Spring框架的快速开发框架 它旨在简化Spring应用程序的开发过程和部署流程 Spring Boot提供了自动化配置和约定大于配置的方式 使开发人员可以专注
  • JavaWeb--- Filter(过滤器)学习

    Filter 过滤器 处理中文乱码 登录验证 1 xml依赖
  • 教你用Python做图像处理

    质量 速度 廉价 选择其中两个 提到图像处理第一个想到的库就是PIL 全称Python Imaging Library Python 图像处理类库 它提供了大量的图像操作 比如图像缩放 裁剪 贴图 模糊等等 很多时候它需要配合numpy库一
  • 无盘服务器怎么看使用情况,无盘服务器回写盘查看

    无盘服务器回写盘查看 内容精选 换一换 华为云帮助中心 为用户提供产品简介 价格说明 购买指南 用户指南 API参考 最佳实践 常见问题 视频帮助等技术文档 帮助您快速上手使用华为云服务 由于某些机型的服务器没有配备SDI卡 或者其他服务器
  • 代码随想录一刷-Day09

    LeetCode27 移除元素 public int removeElement int nums int val if nums length 0 return 0 双指针 int slow 0 fast 0 while fast lt