首页 > 其他分享 >Leetcode刷题笔记8.12-8.16

Leetcode刷题笔记8.12-8.16

时间:2024-08-16 17:05:34浏览次数:9  
标签:slow nums fast 节点 数组 8.12 8.16 Leetcode 指针

Leetcode刷题笔记8.12-8.16

19.删除倒数第n个链表结点(8.12)

  1. 一个巧妙删除倒数第n个结点的trick
    该方法避免了对链表的一次全面扫描来获得总长度
// 返回链表的倒数第 k 个节点
ListNode findFromEnd(ListNode head, int k) {
    ListNode p1 = head;
    // p1 先走 k 步
    for (int i = 0; i < k; i++) {
        p1 = p1.next;
    }// 注意这里是向后处理k次
    ListNode p2 = head;
    // p1 和 p2 同时走 n - k 步
    while (p1 != null) {
        p2 = p2.next;
        p1 = p1.next;
    }
    // p2 现在指向第 n - k + 1 个节点,即倒数第 k 个节点
    return p2;
}
  1. 在这个真题的处理上,建立了虚拟结点来处理边界问题
    为了防止出现空指针的情况,比如说链表总共有 5 个节点,题目就让你删除倒数第 5 个节点,也就是第一个节点,那按照算法逻辑,应该首先找到倒数第 6 个节点。但第一个节点前面已经没有节点了,这就会出错。但有了我们虚拟节点 dummy 的存在,就避免了这个问题,能够对这种情况进行正确的删除。

26. 删除有序数组中的重复项(8.14)

  1. 双指针技巧:用于在链表或数组中原地索引或修改,这类过程一般需要数组中元素自身作比较,使用双指针(可以是不同步移动、同步移动)
    左右指针是两个指针相向而行或者相背而行;快慢指针是两个指针同向而行,一快一慢。
    对于单链表来说,大部分技巧都属于快慢指针,因为无法直接定位到链表的末尾。单链表的六大解题套路 都涵盖了,比如链表环判断,倒数第 K 个链表节点等问题,它们都是通过一个 fast 快指针和一个 slow 慢指针配合完成任务。
  2. 【原地修改】:
    如果不是原地修改的话,直接new int[],把去重之后的元素放进这个新数组中,然后返回这个新数组即可。但是原地删除,不允许new新数组,只能在原数组上操作,然后返回一个长度,这样就可以通过返回的长度和原始数组得到我们去重后的元素有哪些了。
    所以该题无所谓去重后剩余空间中的数字,无需考虑剩余空间的处理。
    3.采用快慢指针策略:让慢指针 slow 走在后面,快指针 fast 走在前面探路,找到一个不重复的元素就赋值给 slow 并让 slow 前进一步。这样,就保证了 nums[0..slow] 都是无重复的元素,当 fast 指针遍历完整个数组 nums 后,nums[0..slow] 就是整个数组去重之后的结果。
class Solution {
    public int removeDuplicates(int[] nums) {
        if (nums.length == 0) {
            return 0;
        }
        int slow = 0, fast = 0;
        while (fast < nums.length) {
            if (nums[fast] != nums[slow]) {
                slow++;
                // 维护 nums[0..slow] 无重复
                nums[slow] = nums[fast];
            }
            fast++;
        }
        // 数组长度为索引 + 1
        return slow + 1;
    }
}

27.移除元素(8.16)

  1. 这道题和上一道思路很像,通过fast指针遍历后移来扫描元素,在满足条件时替换(赋值)slow指针,本质上是删除重复/不需要的元素,同时缩短整个数组
    把nums中所有值为val的元素原地删除,依然需要使用快慢指针技巧:
    如果 fast 遇到值为 val 的元素,则直接跳过,否则就赋值给 slow 指针,并让 slow 前进一步

标签:slow,nums,fast,节点,数组,8.12,8.16,Leetcode,指针
From: https://www.cnblogs.com/Wyuf1314/p/18355190

相关文章

  • 8.16 PTA练习
    7-1-11装箱问题假设有N项物品,大小分别为s1​、s2​、…、si​、…、sN​,其中si​为满足1≤si​≤100的整数。要把这些物品装入到容量为100的一批箱子(序号1-N)中。装箱方法是:对每项物品,顺序扫描箱子,把该物品放入足以能够容下它的第一个箱子中。请写一个程序模拟这种装箱过程,......
  • 11. 盛最多水的容器【 力扣(LeetCode) 】
    一、题目描述给定一个长度为n的整数数组height。有n条垂线,第i条线的两个端点是(i,0)和(i,height[i])。找出其中的两条线,使得它们与x轴共同构成的容器可以容纳最多的水。返回容器可以储存的最大水量。说明:你不能倾斜容器。二、测试用例示例1:输入:[1,......
  • 15. 三数之和【 力扣(LeetCode) 】
    一、题目描述给你一个整数数组nums,判断是否存在三元组[nums[i],nums[j],nums[k]]满足i!=j、i!=k且j!=k,同时还满足nums[i]+nums[j]+nums[k]==0。请你返回所有和为0且不重复的三元组。注意:答案中不可以包含重复的三元组。二、测试用例示例1:输......
  • leetcode 383赎金信
    给你两个字符串:ransomNote 和 magazine ,判断 ransomNote 能不能由 magazine 里面的字符构成。如果可以,返回 true ;否则返回 false 。magazine 中的每个字符只能在 ransomNote 中使用一次。思路:使用unordered_map容器统计magazine的字符频率,再遍历ransomNote中的......
  • 8.16
    一、学习内容1.Java注解是附加在代码中的一些元信息,用于一些工具在编译、运行时进行解析和使用,起到说明、配置的功能2.应用:(1)生成文档(2)编译时进行格式检查3.分类:标准注解,元注解,自定义注解(1)标准注解:包括@Override、@Deprecated、@SuppressWarnings等,使用这些注解后编译器就会......
  • 表现良好的最长时间段(LeetCode)
    题目给你一份工作时间表 hours,上面记录着某一位员工每天的工作小时数。我们认为当员工一天中的工作小时数大于 8 小时的时候,那么这一天就是「劳累的一天」。所谓「表现良好的时间段」,意味在这段时间内,「劳累的天数」是严格 大于「不劳累的天数」。请你返回「表现良好......
  • LeetCode530 二叉搜索树的最小绝对差
    前言题目:530.二叉搜索树的最小绝对差文档:代码随想录——二叉搜索树的最小绝对差编程语言:C++解题状态:成功解决!思路注意题目中的二叉搜索树,这个条件暗示每个节点的左子节点肯定小于该节点,右子节点肯定大于该节点。因此,使用中序遍历可以获得一个递增的有序数组,最......
  • LeetCode501 二叉搜索树中的众数
    前言题目:501.二叉搜索树中的众数文档:代码随想录——二叉搜索树中的众数编程语言:C++解题状态:不会…思路利用二叉搜索树性质的同时再加上双指针法。代码/***Definitionforabinarytreenode.*structTreeNode{*intval;*TreeNode*lef......
  • 【Leetcode 594 】 最长和谐子序列 —— 这是假的滑动窗口吧!
    和谐数组是指一个数组里元素的最大值和最小值之间的差别 正好是 1 。现在,给你一个整数数组 nums ,请你在所有可能的子序列中找到最长的和谐子序列的长度。数组的子序列是一个由数组派生出来的序列,它可以通过删除一些元素或不删除元素、且不改变其余元素的顺序而得到。示......
  • LeetCode每日一题----特殊数组二
    解析:1.int[]nums:一个整数数组。2.int[][]queries:一个二维整数数组,每个一维数组包含两个整数,表示查询的范围。该方法的主要功能是根据给定的nums数组和一系列查询queries,判断每个查询区间[queries[i][0],queries[i][1]]内的元素是否都具有相同的奇偶性。返回一个布......