删除有序数组中的重复项 -LeetCode
26. 删除有序数组中的重复项 🎯 问题描述(来源于LeetCode) 描述: 给你一个 非严格递增排列 的数组 nums,请你 原地 删除重复出现的元素,使每个元素只出现一次,返回删除后数组的新长度。 元素的相对顺序应该保持一致。 不要使用额外的数组空间,你必须在 原地 修改输入数组,并在使用 O(1) 额外空间的条件下完成。 说明: 数组已排序。 返回新长度 slow 后,不需要考虑数组中超出新长度后面的元素。 示例: 示例 1: 123输入: nums = [1,1,2]输出: 2, nums = [1,2,_]解释: 函数应返回新长度 2,并且原数组的前两个元素被修改为 1, 2。 示例 2: 12输入: nums = [0,0,1,1,1,2,2,3,3,4]输出: 5, nums = [0,1,2,3,4,_,_,_,_,_] 💻 解题思路 思路:快慢指针(覆盖法) 算法步骤 如果数组长度为 0,直接返回 0。但代码中未处理空数组,不过题目保证 nums 长度至少为 1。 初始化慢指针 slow = 1,指向下一个不重复元素应该放置的位置。...
找出数组中的所有 K 近邻下标 -LeetCode
2200. 找出数组中的所有 K 近邻下标 🎯 问题描述(来源于LeetCode) 描述: 给你一个下标从 0 开始的整数数组 nums 和两个整数 key 和 k。 K 近邻下标 定义为 nums 中某个下标 i,满足至少存在一个下标 j 使得 |i - j| <= k 且 nums[j] == key。 以列表形式返回所有 K 近邻下标,按 递增顺序 排序。 说明: 一个下标可能对应多个 key 位置,但只计入一次。 示例: 示例 1: 123输入: nums = [3,4,9,1,3,3], key = 3, k = 2输出: [0,1,2,3,4,5]解释: key 出现在下标 0、4、5,扩展区间 [0,2]、[2,6]、[3,7],覆盖 [0,5]。 示例 2: 123输入: nums = [1,2,3,4,5], key = 2, k = 1输出: [0,1,2]解释: key 在索引 1,区间 [0,2],因此 0、1、2 都是近邻。 💻 解题思路 思路:快慢指针扫描(一次遍历,线性时间) 快指针 fast:遍历数组,寻找值为 ke...
有效三角形的个数-LeetCode
611. 有效三角形的个数 🎯 问题描述(来源于LeetCode) 描述: 给定一个包含非负整数的数组 nums,返回其中可以组成三角形三条边的三元组个数。 三角形的条件是:任意两边之和大于第三边,等价于较短两边之和大于最长边。 说明: 三元组 (i, j, k) 满足 i < j < k,且 nums[i] + nums[j] > nums[k]。 数组长度 1 <= n <= 1000。 示例: 示例 1: 123输入: nums = [2,2,3,4]输出: 3解释: 有效组合: (2,2,3), (2,3,4), (2,3,4) 共 3 个。 示例 2: 12输入: nums = [4,2,3,4]输出: 4 💻 解题思路 思路:排序 + 双指针(固定最短边,滑动中边) 算法步骤 将数组 nums 升序排序。 外层循环 slow 从 0 到 n-3,固定最短边 num = nums[slow]。 如果 num == 0,由于三角形边长必须为正数,直接跳过。 初始化 mid = slow + 1,指向可能的次短边(中...
删除字符串两端相同字符后的最短长度-LeetCode
1750. 删除字符串两端相同字符后的最短长度 🎯 问题描述(来源于LeetCode) 描述: 给你一个只包含字符 'a'、'b' 和 'c' 的字符串 s,你可以执行以下操作任意次: 选择字符串的一个非空前缀和一个非空后缀,要求前缀和后缀的所有字符都相同,且前缀和后缀的字符相同(即 s[0] == s[-1])。然后删除前缀和后缀,剩余部分拼接成新字符串。 求在执行任意次操作后,字符串可能的最短长度。 说明: 每次操作必须同时删除前缀和后缀,且前缀和后缀的字符必须相同。 如果两端字符不同,则无法继续操作,返回当前长度。 示例: 示例 1: 123输入: s = "ca"输出: 2解释: 两端字符 'c' 和 'a' 不同,无法删除,长度为 2。 示例 2: 123456输入: s = "cabaabac"输出: 0解释: 初始: "cabaabac" 两端都为 'c',删除所有 'c' 得到 "abaab...
反转一个字符串里的字母后反转特殊字符-LeetCode
3823. 反转一个字符串里的字母后反转特殊字符 🎯 问题描述(来源于LeetCode) 描述: 给定一个字符串 s,该字符串只包含小写字母和特殊字符 "!@#$%^&*()"。 请先反转字符串中所有字母的顺序(但保持字母在原字母位置),再反转所有特殊字符的顺序(保持特殊字符在原来特殊字符位置),然后返回结果字符串。 说明: 字母和特殊字符互不干扰,各自反转。 反转是指将同类字符的顺序倒置。 示例: 示例 1: 123456输入: s = ")ebc#da@f("输出: "(fad@cb#e)"解释: 1. 提取字母 "ebc daf"?实际上字母按顺序为 e,b,c,d,a,f → 反转后 f,a,d,c,b,e。 2. 特殊字符顺序为 ),#,@,( → 反转后 (, @, #, )。 3. 填充后得到 "(fad@cb#e)"。 示例 2: 12输入: s = "z"输出: "z" 示例 3: 12...
字典序最小回文串-LeetCode
2697. 字典序最小回文串 🎯 问题描述(来源于LeetCode) 描述: 给定一个由小写英文字母组成的字符串 s,你每次操作可以将任意一个字符修改为任意一个小写字母。 请你返回将 s 变成回文串所需的最少操作次数?不,本题要求构造一个字典序最小的回文串,即通过修改某些字符(不限制操作次数),使得最终字符串是回文串,且字典序最小。 说明: 字典序比较:按从左到右的顺序比较字符。 回文串:正读反读相同。 可以修改任意位置的字符为任意小写字母。 示例: 示例 1: 123输入: s = "egcfe"输出: "efcfe"解释: 将 'g' 改为 'f',得到 "efcfe" 是回文串,且字典序最小。 示例 2: 123输入: s = "abcd"输出: "abba"解释: 将 'c' 改为 'b','d' 改为 'a',得到 "abba...
给植物浇水 II-LeetCode
2105. 给植物浇水 II 🎯 问题描述(来源于LeetCode) 描述: Alice 和 Bob 计划给一排植物浇水。植物排成一行,从左到右编号为 0 到 n-1。 Alice 从最左边(植物 0)开始,Bob 从最右边(植物 n-1)开始,他们同时向中间移动。 Alice 的水壶容量为 capacityA,Bob 的水壶容量为 capacityB。 当他们到达一株植物时,如果水壶中的水不足以浇灌该植物,他们必须重新装满自己的水壶(在当前位置),然后才能浇水。 他们各自独立行动,但每次只能浇一株植物。 如果两人同时到达同一株植物(即中间只剩一株植物),则水壶中剩余水量较多的人去浇灌(如果两人水量相同,Alice 去浇)。 求他们总共需要重新装满水壶的次数。 说明: 初始水壶是满的(容量分别为 capacityA 和 capacityB)。 植物需要的水量由 plants[i] 给出。 示例: 示例 1: 123456输入: plants = [2,2,3,3], capacityA = 5, capacityB = 5输出: 1解释: Alice 浇 0 ...
反转单词前缀-LeetCode
2000. 反转单词前缀 🎯 问题描述(来源于LeetCode) 描述: 给定一个字符串 word 和一个字符 ch,找出 ch 在 word 中第一次出现的位置(下标从 0 开始)。反转从位置 0 到该位置(含)的所有字符,并返回反转后的字符串。如果 ch 不存在于 word 中,则返回原字符串。 说明: 只需要反转前缀,不修改后缀。 示例: 示例 1: 123输入: word = "abcdefd", ch = "d"输出: "dcbaefd"解释: "d" 第一次出现在下标 3,反转前 4 个字符 "abcd" → "dcba"。 示例 2: 123输入: word = "xyxzxe", ch = "z"输出: "zxyxxe"解释: "z" 第一次出现在下标 2,反转前 3 个字符 "xyz" → "zyx"。 �...
反转字符串前缀 -LeetCode
3794. 反转字符串前缀 - Reverse String Prefix 🎯 问题描述(来源于LeetCode) 描述: 给定一个字符串 s 和一个整数 k,将字符串的前 k 个字符进行反转。其余字符保持原来的顺序。返回反转后的字符串。 说明: 1 <= s.length <= 100 0 <= k <= s.length(根据常见实现推断,可自行验证) 示例: 示例 1: 123输入: s = "abcd", k = 2输出: "bacd"解释: 前 2 个字符 "ab" 反转为 "ba",得到 "bacd"。 示例 2: 123输入: s = "xyz", k = 3输出: "zyx"解释: 前 3 个字符即整个字符串反转。 💻 解题思路 思路:字符串切片拼接 算法步骤 将字符串 s 分成两部分:前缀 pre = s[:k](前 k 个字符)和后缀 suf = s[k:](剩余字符)。...
垂直翻转子矩阵-LeetCode
3643. 垂直翻转子矩阵 🎯 问题描述(来源于LeetCode) 描述: 给你一个 m x n 的整数矩阵 grid,以及三个整数 x、y 和 k。 x 和 y 表示一个 正方形子矩阵 的左上角下标,k 表示该正方形子矩阵的边长。 你的任务是垂直翻转该子矩阵的行顺序(即上下翻转),并返回更新后的矩阵。 说明: 垂直翻转:子矩阵的第一行与最后一行交换,第二行与倒数第二行交换,以此类推。 子矩阵外的元素保持不变。 你可以直接在原矩阵上修改,也可以使用额外空间。 示例: 示例 1: 123输入: grid = [[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]], x = 1, y = 0, k = 3输出: [[1,2,3,4],[13,14,15,8],[9,10,11,12],[5,6,7,16]]解释: 目标子矩阵为行 1-3、列 0-2。翻转前行顺序为:[5,6,7]、[9,10,11]、[13,14,15];翻转后行顺序变为:[13,14,15]、[9,10,11]、[5,6,7],列3保持不变。 示例 2: ...










