l0oser

l0oser

Thoughts, stories and ideas.

迭代

K 个一组翻转链表

给你链表的头节点 head,每 k 个节点一组进行翻转,请你返回修改后的链表。 k 是一个正整数,它的值小于或等于链表的长度。 如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。 你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。 示例 1: 输入:head = [1,2,3,4,5], k = 2 输出:[2,1,4,3,5] 示例 2: 输入:head = [1,2,3,4,5], k = 3 输出:[3,2,1,4,5] 提示:
9 min read
多指针

颜色分类

给定一个包含红色、白色和蓝色,共 n 个元素的数组 nums。 请原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。 我们使用整数 0、1 和 2 分别表示红色、白色和蓝色。 必须在不使用库内置的 sort 函数的情况下解决这个问题。 示例 1: 输入:nums = [2,0,2,1,1,0] 输出:[0,0,1,1,2,2] 解释: 该数组包含两个 0、两个 1 和两个 2。 将它们原地排序后,所有 0 排在最前面,接着是所有
6 min read
链表

两两交换链表中的节点

给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。 你必须在不修改节点内部的值的情况下完成本题,也就是只能进行节点交换。 示例 1: 输入:head = [1,2,3,4] 输出:[2,1,4,3] 示例 2: 输入:head = [] 输出:[] 示例 3: 输入:head = [1] 输出:[1] 提示: * 链表中节点的数目在范围 [0, 100] 内 * 0 <= Node.val <= 100 解法一(迭代): /** * Definition for singly-linked list. * struct ListNode
6 min read
贪心

划分字母区间

给你一个字符串 s。 我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。 例如,字符串 "ababcc" 能够被分为 ["abab", "cc"],但类似 ["aba", "bcc"] 或 ["ab", "ab", "cc"] 的划分是非法的。 注意,划分结果需要满足:将所有划分结果按顺序连接,得到的字符串仍然是 s。 返回一个表示每个字符串片段长度的列表。 示例 1: 输入:s = "ababcbacadefegdehijhklij" 输出:[9,7,
8 min read
链表

两数相加

给你两个非空的链表 l1 和 l2,表示两个非负整数。 它们每位数字都是按照逆序的方式存储的,并且每个节点只能存储一位数字。 请你将两个数相加,并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外,这两个数都不会以 0 开头。 示例 1: 输入:l1 = [2,4,3], l2 = [5,6,4] 输出:[7,0,8] 解释:342 + 465 = 807。 示例 2: 输入:l1 = [0], l2 = [0] 输出:[0] 示例 3: 输入:l1 = [9,9,9,
6 min read
贪心

跳跃游戏

给你一个非负整数数组 nums。 你最初位于数组的第一个下标。 数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标。 如果可以,返回 true;否则,返回 false。 示例 1: 输入:nums = [2,3,1,1,4] 输出:true 解释:可以先跳 1 步,从下标 0 到达下标 1,然后再从下标 1 跳 3 步到达最后一个下标。 示例 2: 输入:nums = [3,2,1,0,4] 输出:false 解释:无论怎样,总会到达下标为 3
6 min read
算法

合并两个有序链表

将两个升序链表 l1 和 l2 合并为一个新的升序链表并返回。 新链表是通过拼接给定的两个链表的所有节点组成的,不需要创建新的数据节点。 两个链表都按照非递减顺序排列,也就是允许存在相等的节点值。 示例 1: 输入:l1 = [1,2,4], l2 = [1,3,4] 输出:[1,1,2,3,4,4] 示例 2: 输入:l1 = [], l2 = [] 输出:[] 示例 3: 输入:l1 = [], l2 = [0] 输出:[0] 提示: * 两个链表的节点数目范围是 [0, 50] * -100 <= Node.val <
7 min read
贪心

买卖股票的最佳时机

给定一个数组 prices,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择某一天买入这只股票,并选择在未来的某一个不同的日子卖出这只股票。 请设计一个算法,计算你所能获取的最大利润。 如果不能获取任何利润,返回 0。 示例 1: 输入:prices = [7,1,5,3,6,4] 输出:5 解释:在第 2 天价格为 1 时买入,在第 5 天价格为 6 时卖出,最大利润为 6 - 1 = 5。 注意不能计算 7 - 1 = 6,因为卖出必须发生在买入之后。 示例
6 min read
链表

环形链表 II

给定一个链表的头节点 head,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置,索引从 0 开始。 如果 pos 是 -1,则在该链表中没有环。 注意: * pos 不作为参数进行传递。 * pos 仅仅是为了标识链表的实际情况。 * 不允许修改链表。 示例 1: 输入:head = [3,2,0,-4], pos = 1 输出:返回索引为 1 的链表节点 解释:链表中有一个环,其尾部连接到第二个节点。 示例 2: 输入:head
7 min read
正反遍历

最长有效括号

给你一个只包含 '(' 和 ')' 的字符串 s。 请你找出最长有效括号子串的长度。 有效括号子串必须满足: * 格式正确 * 连续 * 左右括号能够正确匹配 例如,"(()())" 是格式正确的括号字符串。 示例 1: 输入:s = "(()" 输出:2 解释:最长有效括号子串是 "()" 示例 2: 输入:s = ")()())" 输出:4 解释:最长有效括号子串是 "()()" 示例 3: 输入:s = "" 输出:0 提示:
9 min read
链表

环形链表

给你一个链表的头节点 head,判断链表中是否有环。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置,索引从 0 开始。 注意: * pos 不作为参数进行传递。 * pos 仅仅是为了标识链表的实际情况。 如果链表中存在环,则返回 true。 否则,返回 false。 示例 1: 输入:head = [3,2,0,-4], pos = 1 输出:true 解释:链表中有一个环,其尾部连接到第二个节点。 示例 2: 输入:head = [1,2], pos = 0 输出:
7 min read
动态规划

分割等和子集

给你一个只包含正整数的非空数组 nums。 请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。 每个数组元素只能放入其中一个子集,不能重复使用。 示例 1: 输入:nums = [1,5,11,5] 输出:true 解释:数组可以分割成 [1,5,5] 和 [11]。 示例 2: 输入:nums = [1,2,3,5] 输出:false 解释:数组不能分割成两个元素和相等的子集。 提示: * 1 <= nums.length <= 200 * 1 <= nums[i] <= 100 动态规划(0-
8 min read
动态规划

乘积最大子数组

给你一个整数数组 nums。 请你找出数组中乘积最大的非空连续子数组,并返回该子数组所对应的乘积。 该子数组中至少包含一个数字。 测试用例的答案是一个 32 位整数。 请注意,一个只包含一个元素的数组的乘积就是这个元素的值。 示例 1: 输入:nums = [2,3,-2,4] 输出:6 解释:子数组 [2,3] 有最大乘积 6。 示例 2: 输入:nums = [-2,0,-1] 输出:0 解释:结果不能为 2,因为 [-2,-1] 不是子数组。 提示: * 1 <= nums.length <= 2 * 10^
8 min read
链表

反转链表

给你单链表的头节点 head。 请你反转链表,并返回反转后的链表。 示例 1: 输入:head = [1,2,3,4,5] 输出:[5,4,3,2,1] 示例 2: 输入:head = [1,2] 输出:[2,1] 示例 3: 输入:head = [] 输出:[] 提示: * 链表中节点的数目范围是 [0, 5000] * -5000 <= Node.val <= 5000 进阶: 链表可以选用迭代或递归方式完成反转。你能否用两种方法解决这道题? 解法一(迭代): /** * Definition for
7 min read
链表

相交链表

给你两个单链表的头节点 headA 和 headB。 请你找出并返回两个单链表相交的起始节点。 如果两个链表不存在相交节点,返回 null。 题目数据保证整个链式结构中不存在环。 注意: * 函数返回结果后,链表必须保持其原始结构。 * 链表相交指的是两个链表从某个节点开始,后续节点在内存中是同一批节点。 * 不能只比较节点值是否相等,必须比较节点本身是否相同。 自定义评测中会使用: * intersectVal:相交的起始节点的值。如果不存在相交节点,这一值为 0 * listA:第一个链表 * listB:第二个链表 * skipA:在 listA 中从头节点开始跳到交叉节点的节点数 * skipB:在 listB 中从头节点开始跳到交叉节点的节点数 评测系统会根据这些输入创建链式数据结构,并将两个头节点 headA 和 headB 传递给程序。 示例 1: 输入:intersectVal = 8, listA = [4,1,8,4,
9 min read
动态规划

单词拆分

给你一个字符串 s 和一个字符串列表 wordDict 作为字典。 如果可以利用字典中出现的一个或多个单词拼接出 s,则返回 true。 注意: * 不要求字典中出现的单词全部都使用。 * 字典中的单词可以重复使用。 示例 1: 输入:s = "leetcode", wordDict = ["leet", "code"] 输出:true 解释:返回 true 因为 "leetcode" 可以由 "leet" 和 "code" 拼接成。 示例 2: 输入:s = "applepenapple&
7 min read
动态规划

零钱兑换

给你一个整数数组 coins,表示不同面额的硬币;以及一个整数 amount,表示总金额。 计算并返回可以凑成总金额所需的最少硬币个数。 如果没有任何一种硬币组合能组成总金额,返回 -1。 你可以认为每种硬币的数量是无限的。 示例 1: 输入:coins = [1, 2, 5], amount = 11 输出:3 解释:11 = 5 + 5 + 1 示例 2: 输入:coins = [2], amount = 3 输出:-1 示例 3: 输入:coins = [1], amount = 0 输出:0 提示: * 1 <= coins.length
7 min read