好数对的数目-LeetCode
1512. 好数对的数目 🎯 问题描述(来源于LeetCode) 描述: 给你一个整数数组 nums。 如果一组数字 (i, j) 满足 nums[i] == nums[j] 且 i < j,那么它就是一个好数对。 请你返回好数对的数目。 说明: 这是一个计数问题。 核心逻辑是统计每个数字出现的频率,然后利用组合数学公式计算好数对的数量。 对于出现 n 次的数字,其好数对的数量为 Cn2=n(n−1)2C_n^2 = \frac{n(n-1)}{2}Cn2=2n(n−1)。 示例: 示例 1: 12345678输入:nums = [1,2,3,1,1,3]输出:4解释:- (0,3) -> nums[0] == nums[3] == 1- (0,4) -> nums[0] == nums[4] == 1- (3,4) -> nums[3] == nums[4] == 1- (1,2) -> nums[1] == nums[2] == 3- 总共有 4 个好数对。 示例 2: 1234输入:nums = [1,1,...
寻找比目标字母大的最小字母-LeetCode
744. 寻找比目标字母大的最小字母 🎯 问题描述(来源于LeetCode) 描述: 给你一个排序后的字符列表 letters,列表中只包含小写英文字母。 另给出一个目标字母 target,请你寻找在这一有序列表里比目标字母大的最小字母。 在比较时,字母是依序循环出现的。 如果目标字母 target 大于或等于列表中的最后一个字母,则返回列表中的第一个字母。 说明: 这是一个二分查找问题。 核心逻辑是寻找上界(第一个大于目标值的位置)。 需要处理循环数组的特性(即如果找不到比目标大的字母,则返回第一个字母)。 示例: 示例 1: 123输入: letters = ["c", "f", "j"], target = "a"输出: "c"解释: 比 'a' 大的最小字母是 'c'。 示例 2: 123输入: letters = ["c", "f", "j&qu...
尽可能使字符串相等-LeetCode
1208. 尽可能使字符串相等 🎯 问题描述(来源于LeetCode) 描述: 给你两个长度相同的字符串 s 和 t。 将 s 中的第 i 个字符变到 t 中的第 i 个字符需要 |s[i] - t[i]| 的开销(即两个字符 ASCII 码值的差的绝对值)。 用于变更字符串的最大预算是 maxCost。在转化字符串时,总开销应当小于等于该预算。 如果可以将 s 的某个子字符串转化为 t 中对应的子字符串,请返回可以转化的最大长度。 如果不存在可以转化的子字符串,返回 0。 说明: 这是一个不定长滑动窗口问题。 核心逻辑是维护一个窗口,使得窗口内所有字符的转换开销之和(总开销)不超过 maxCost。 当总开销超过预算时,收缩左边界。 示例: 示例 1: 12345678910输入:s = "abcd", t = "bcdf", maxCost = 3输出:3解释:s 中的 "abc" 可以转化为 t 中的 "bcd"。开销分别为:|a-b|=1, |b-c|=1, |c...
数位和相等数对的最大和-LeetCode
2342. 数位和相等数对的最大和 🎯 问题描述(来源于LeetCode) 描述: 给你一个下标从 0 开始的数组 nums ,数组中的元素都是 正 整数。 请你选出两个下标 i 和 j(i != j),且 nums[i] 的数位和 与 nums[j] 的数位和相等。 请你找出所有满足条件的下标 i 和 j ,找出并返回 nums[i] + nums[j] 可以得到的 最大值_。_如果不存在这样的下标对,返回 -1。 说明: 这是一个哈希表结合贪心算法的问题。 核心逻辑是将数字按照“数位和”进行分组。 对于同一个数位和组内的数字,为了使两数之和最大,我们只需要保留该组中最大的两个数(或者遍历时维护当前遇到的最大值)。 示例: 示例 1: 123456输入:nums = [18,43,36,13,7]输出:54解释:- 数位和为 9 的数有:18 (1+8), 36 (3+6)。和为 18+36=54。- 数位和为 7 的数有:43 (4+3), 7 (7)。和为 43+7=50。- 最大和为 54。 示例 2: 123输入:nums = [10...
面试题 16.24-数对和-LeetCode
面试题 16.24. 数对和 🎯 问题描述(来源于LeetCode) 描述: 设计一个算法,找出数组中两数之和为指定值的所有整数对。一个数只能属于一个数对。 给定一个整数数组 nums 和一个目标值 target,请返回所有满足条件的数对。 说明: 这是一个哈希表计数结合贪心算法的问题。 核心逻辑是:对于每个数字 num,查找其互补数 target - num 是否已经出现过且未被使用。 如果存在,则组成一个数对,并减少互补数的可用数量。 如果不存在,则将当前数字加入哈希表,等待后续的互补数。 示例: 示例 1: 12345输入:nums = [5,6,5], target = 11输出:解释:- 5 + 6 = 11- 第一个 5 和 6 配对,第二个 5 无法配对。 示例 2: 1234输入:nums = [5,6,5,6], target = 11输出:[[5,6],[5,6]]解释:- 可以组成两对 (5,6)。 💻 解题思路 思路1:哈希表 + 贪心匹配 思路1:代码实现 12345678910111213141516171...
数组列表中的最大距离-LeetCode
624. 数组列表中的最大距离 🎯 问题描述(来源于LeetCode) 描述: 给定 m 个已按升序排列的数组,你需要从两个不同的数组中各选一个整数,计算它们的距离(即两数差的绝对值),并返回所有可能选择中的最大距离。 说明: 这是一个贪心算法问题。 核心逻辑是:最大距离一定由某个数组的最小值和另一个数组的最大值构成。 由于数组已经排序,每个数组的最小值是其第一个元素,最大值是其最后一个元素。 通过一次遍历,维护已遍历数组的最小值和最大值,并在每一步计算当前数组与之前数组的最大距离。 示例: 示例 1: 12345输入:arrays = [[1,2,3],[4,5],[1,2,3]]输出:4解释:- 从第一个数组选 1,从第二个数组选 5,距离 = |5-1| = 4。- 这是最大距离。 示例 2: 1234输入:arrays = [[1],[1]]输出:0解释:- 只能选 1 和 1,距离 = 0。 💻 解题思路 思路1:贪心算法(一次遍历) 思路1:代码实现 1234567891011121314151617181920class...
最多K次重复元素的最长子数组-LeetCode
2958. 最多 K 次重复元素的最长子数组 🎯 问题描述(来源于LeetCode) 描述: 给你一个整数数组 nums 和一个整数 k。 如果一个子数组中每个元素的出现次数都不超过 k 次,我们就称这个子数组是好子数组。 请你返回 nums 中最长好子数组的长度。 说明: 这是一个不定长滑动窗口问题。 核心逻辑是维护一个窗口,使得窗口内任意元素的出现次数都不超过 k 次。 当某个元素的出现次数超过 k 时,收缩左边界。 示例: 示例 1: 12345输入:nums = [1,2,3,1,2,3,1,2], k = 2输出:6解释:子数组 [1,2,3,1,2,3] (索引 0 到 5) 中,1, 2, 3 各出现 2 次,满足条件。如果再加一个 1,1 的出现次数变为 3,超过 k=2。 示例 2: 1234输入:nums = [1,2,1,2,1,2,1,2], k = 1输出:2解释:每个元素最多出现 1 次。最长好子数组是 [1,2] 或 [2,1]。 💻 解题思路 思路1:不定长滑动窗口 思路1:代码实现 12345678910...
正整数和负整数的最大计数-LeetCode
2529. 正整数和负整数的最大计数 🎯 问题描述(来源于LeetCode) 描述: 给你一个按非递减顺序排列的数组 nums。 请你判断正整数和负整数的数目,并返回正整数数目和负整数数目的最大值。 负整数:小于 0 的整数。 正整数:大于 0 的整数。 注意:0 既不是正整数也不是负整数。 说明: 这是一个二分查找问题。 核心逻辑是利用数组的有序性,通过二分查找快速定位 0 的边界。 通过两次二分查找,分别找到负整数的个数和正整数的个数。 示例: 示例 1: 123456输入:nums = [-2,-1,-1,1,2,3]输出:3解释:- 负整数有 3 个:-2, -1, -1。- 正整数有 3 个:1, 2, 3。- 最大值为 3。 示例 2: 123456输入:nums = [-3,-2,-1,0,0,1,2]输出:3解释:- 负整数有 3 个:-3, -2, -1。- 正整数有 2 个:1, 2。- 最大值为 3。 💻 解题思路 思路1:二分查找(下界) 思路1:代码实现 123456789101112131415161718...
水果成篮-LeetCode
904. 水果成篮 🎯 问题描述(来源于LeetCode) 描述: 你正在探访一家农场,农场从左到右种植了一排果树。这些树用一个整数数组 fruits 表示,其中 fruits[i] 是第 i 棵树上的水果种类。 你想要尽可能多地收集水果。然而,农场的主人设定了一些严格的规矩: 你只有两个篮子,并且每个篮子只能装单一类型的水果。每个篮子能够装的水果数量不限。 你可以选择任意一棵树开始采摘,但必须从这棵树开始依次向右采摘每棵树上的水果(即采摘连续的子数组)。 一旦你遇到某棵树上的水果不属于你篮子中的类型,你必须停止采摘。 给定一个整数数组 fruits,返回你可以收集的水果的最大数目。 说明: 这是一个不定长滑动窗口问题。 核心逻辑是维护一个窗口,使得窗口内不同水果种类的数量不超过 2 种。 当种类数量超过 2 时,收缩左边界。 示例: 示例 1: 123输入:fruits = [1,2,1]输出:3解释:我们可以采摘 [1,2,1],所有树都可以采摘。 示例 2: 123输入:fruits = [0,1,2,2]输出:3解释:我们可以采摘 [...
等价多米诺骨牌对的数量-LeetCode
1128. 等价多米诺骨牌对的数量 🎯 问题描述(来源于LeetCode) 描述: 给你一个多米诺骨牌列表 dominoes,其中 dominoes[i] = [a, b]。 如果两个多米诺骨牌是等价的,即满足以下任一条件: a == c 且 b == d a == d 且 b == c 也就是说,骨牌可以旋转 180 度后相等。 请你找出列表中等价多米诺骨牌对的数量 (i, j),其中 0 <= i < j < dominoes.length。 说明: 这是一个哈希表计数问题。 核心逻辑是将骨牌标准化(例如排序),使得等价的骨牌拥有相同的键。 利用组合数学或累加计数法计算对数。 示例: 示例 1: 12345输入:dominoes = [[1,2],[2,1],[3,4],[5,6]]输出:1解释:- [1,2] 和 [2,1] 是等价的(旋转后相同)。- 只有一对等价骨牌。 示例 2: 12345输入:dominoes = [[1,2],[1,2],[1,1],[1,2],[2,2]]输出:3解释:- [1,2] 出现了...













