识别数组中的最大异常值-LeetCode
3371.识别数组中的最大异常值 🎯 问题描述 描述: 给你一个整数数组 nums。 数组中恰好包含一个异常值 xxx,其余 n−1n-1n−1 个元素的和可以表示为 2y2y2y(即剩余元素的和是偶数,且该和的一半 yyy 必须存在于剩余元素中)。 数学模型满足方程: x+2y=totalx + 2y = \text{total} x+2y=total 其中: xxx 是我们要找的异常值。 yyy 是剩余元素中的某一个值(基准值)。 total 是数组所有元素之和。 请你返回最大的异常值 xxx。 说明: 这是一个哈希表计数结合方程变换的问题。 我们可以通过变换方程 x+2y=totalx + 2y = \text{total}x+2y=total,得到两种不同的解题视角。 💻 解题思路 思路1:枚举异常值 x(正向思维) 核心逻辑 我们尝试假设数组中的每一个数都是异常值 xxx。 假设当前数 xxx 被移除了。 计算剩余元素的和:Srem=total−xS_{rem} = \text{total} - xSrem=total−x。 根据方程,剩余元素...
镜像对之间最小绝对距离-LeetCode
3761.镜像对之间最小绝对距离 🎯 问题描述 描述: 给你一个整数数组 nums。 如果两个下标 i 和 j 满足 nums[i] 和 nums[j] 互为镜像数(即一个数是另一个数的数字反转,例如 123 和 321),则称它们构成一个镜像对。 请你返回所有镜像对中,下标距离 |i - j| 的最小值。 如果不存在镜像对,返回 -1。 说明: 这是一个哈希表结合贪心策略的问题。 镜像定义:x 的镜像是 reverse(x)。注意,如果一个数是回文数(如 121),它的镜像是它自己。 核心难点:我们需要同时匹配 x 和 reverse(x)。 策略:利用哈希表存储“最近一次出现的位置”。关键在于,我们将原数和镜像数映射到同一个逻辑空间中进行更新。 示例: 示例 1: 12345678输入:nums = [12, 21, 3, 3]输出:2解释:- i=0, num=12. 镜像=21. 哈希表更新 count[12]=0, count[21]=0.- i=1, num=21. 检查 count[21]. 存在(值为0). 距离 = |1-0|=...
K和数对的最大数目-LeetCode
1679. K 和数对的最大数目 🎯 问题描述(来源于LeetCode) 描述: 给你一个整数数组 nums 和一个整数 k。 在一步操作中,你可以选择数组中的两个数字,如果它们的和等于 k,就将它们从数组中移除。 请你返回你可以执行的最大操作数目。 说明: 这是一个哈希表计数结合贪心算法的问题。 核心逻辑是:对于每个数字 num,查找其互补数 k - num 是否存在。 如果存在,则配对成功,操作数加一,并减少互补数的计数。 如果不存在,则将当前数字加入哈希表,等待后续的互补数。 示例: 示例 1: 123456输入:nums = [1,2,3,4], k = 5输出:2解释:- 移除 1 和 4 (1+4=5)- 移除 2 和 3 (2+3=5)- 总共 2 次操作。 示例 2: 123456输入:nums = [3,1,3,4,3], k = 6输出:1解释:- 只能移除一对 3 (3+3=6)- 剩下的数字无法组成和为 6 的数对。- 总共 1 次操作。 💻 解题思路 思路1:哈希表 + 贪心匹配 思路1:代码实现 12345...
与对应负数同时存在的最大正整数-LeetCode
2441. 与对应负数同时存在的最大正整数 🎯 问题描述(来源于LeetCode) 描述: 给你一个不包含任何零的整数数组 nums,找出自身与对应的负数都在数组中存在的最大正整数 k。 返回正整数 k,如果不存在这样的整数,返回 -1。 说明: 这是一个哈希表查找问题。 核心逻辑是遍历数组,对于每个数字,检查其相反数是否已经出现过。 如果出现过,则更新最大值。 示例: 示例 1: 123输入:nums = [-1,2,-3,3]输出:3解释:3 是唯一一个自身与对应的负数都在数组中存在的正整数。 示例 2: 123输入:nums = [-1,10,6,7,-7,1]输出:7解释:1 和 7 都满足条件,但 7 更大。 💻 解题思路 思路1:哈希表(一次遍历) 思路1:代码实现 123456789101112131415161718class Solution: def findMaxK(self, nums: List[int]) -> int: # 哈希表,记录已经遍历过的数字 find = d...
买卖股票的最佳时机-LeetCode
121. 买卖股票的最佳时机 🎯 问题描述(来源于LeetCode) 描述: 给定一个数组 prices,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择某一天买入这只股票,并选择在未来的某一个不同的日子卖出该股票。 设计一个算法来计算你所能获取的最大利润。 返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0。 说明: 这是一个经典的贪心算法或动态规划问题。 核心逻辑是维护一个“历史最低价格”,并在每一天计算如果今天卖出能获得的最大利润。 通过一次遍历即可完成查找。 示例: 示例 1: 12345输入:[7,1,5,3,6,4]输出:5解释:- 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5。- 注意利润不能是 7-1 = 6,因为卖出价格需要大于买入价格,且必须在买入之后卖出。 示例 2: 1234输入:[7,6,4,3,1]输出:0解释:- 在这种情况下,没有交易完成,所以最大利润为 0。 💻 解题思路 思路1...
使数组平衡的最少移除数目-LeetCode
3634-使数组平衡的最少移除数目 🎯 问题描述(来源于LeetCode) 描述: 给你一个整数数组 nums 和一个整数 k。 你需要移除最少数量的元素,使得剩余数组中最大值不超过最小值的 k 倍。 即:对于剩余数组中的任意元素,满足 max <= min * k。 请你返回最少需要移除的元素个数。 说明: 如果数组为空或只有一个元素,天然满足条件。 题目等价于寻找一个最长的子序列,使得该子序列满足上述倍数关系。 示例: 示例 1: 123456输入: nums = [1, 3, 6, 8], k = 2输出: 2解释: 排序后为 [1, 3, 6, 8]。我们可以保留 [3, 6] (6 <= 3*2) 或者 [6, 8] (8 <= 6*2),最长长度为 2。需要移除的元素数量 = 4 - 2 = 2。 示例 2: 123输入: nums = [1, 1, 1], k = 1输出: 0解释: 所有元素相等,不需要移除。 💻 解题思路 思路1:排序 + 滑动窗口 排序: 由于只关心数值的倍数关系,顺序无关紧要。 排序后,子序列的...
删掉一个元素以后全为1的最长子数组-LeetCode
🎯 问题描述(来源于LeetCode) 描述:给你一个二进制数组 nums,你可以在其中删除至多一个元素。请你返回删除一个元素后,数组中全为 1 的最长子数组的长度。 说明:如果数组全是 1,你必须删除一个,所以结果要减 1。 示例: 示例 1: 123输入: nums = [1,1,0,1]输出: 3解释: 删除下标 2 的 0,得到 [1,1,1]。 示例 2: 123输入: nums = [1,1,1]输出: 2解释: 必须删除一个 1,结果为 [1,1]。 💻 解题思路 思路:滑动窗口 (Sliding Window) 维护窗口:维护一个窗口,使其最多包含 1 个 0。 移动指针: right 指针遍历数组,将元素加入窗口。 如果窗口内 0 的数量超过 1,则移动 left 指针收缩窗口。 更新答案:在窗口合法时,利用 Counter 直接获取窗口内 1 的数量更新最大值。 边界处理:如果最大长度等于数组长度,说明全是 1,必须减 1。 思路1:代码实现 123456789101112131415161718192021class S...
删除子数组的最大得分-LeetCode
1695. 删除子数组的最大得分 🎯 问题描述(来源于LeetCode) 描述: 给你一个整数数组 nums。你需要从数组中删除一个含有若干不同元素的子数组(即子数组中不能有重复元素)。 删除子数组的得分是该子数组所有元素的和。 请你返回可以获得的最大得分。 说明: 这是一个不定长滑动窗口问题。 核心逻辑是维护一个“所有元素互不相同”的窗口。 当遇到重复元素时,收缩左边界,直到窗口内再次满足无重复条件。 与“无重复字符的最长子串”不同的是,这里优化的目标是元素和最大,而不是长度最长。 示例: 示例 1: 12345输入:nums = [4,2,4,5,6]输出:17解释:最优子数组是 [2,4,5,6],和为 17。(注意:不能包含第一个 4,因为后面还有一个 4) 示例 2: 1234输入:nums = [5,2,1,2,5,2,1,2,5]输出:8解释:最优子数组是 [5,2,1] 或 [1,2,5],和为 8。 💻 解题思路 思路1:不定长滑动窗口 思路1:代码实现 1234567891011121314151617181920...
在排序数组中查找元素的第一个和最后一个位置-LeetCode
34. 在排序数组中查找元素的第一个和最后一个位置 🎯 问题描述(来源于LeetCode) 描述: 给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。 如果数组中不存在目标值 target,返回 [-1, -1]。 你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。 说明: 这是一个二分查找问题。 核心逻辑是找到目标值的下界(第一个大于等于目标值的位置)。 通过两次二分查找,分别找到目标值的起始位置和结束位置。 示例: 示例 1: 123输入:nums = [5,7,7,8,8,10], target = 8输出:[3,4]解释:目标值 8 在数组中的开始位置是 3,结束位置是 4。 示例 2: 123输入:nums = [5,7,7,8,8,10], target = 6输出:[-1,-1]解释:目标值 6 不在数组中。 💻 解题思路 思路1:二分查找(下界) 思路1:代码实现 12345678910111213141516171819202122...
增量元素之间的最大差值-LeetCode
2016. 增量元素之间的最大差值 🎯 问题描述(来源于LeetCode) 描述: 给你一个下标从 0 开始的整数数组 nums,该数组的大小为 n,请你找出 nums 中符合条件的最大差值 nums[j] - nums[i]。 条件: 0 <= i < j < n nums[i] < nums[j] 如果不存在符合条件的 i 和 j,返回 -1。 说明: 这是一个贪心算法问题,与“买卖股票的最佳时机”非常相似。 核心逻辑是维护一个“历史最小值”,并在遍历过程中计算当前值与历史最小值的差值。 通过一次遍历即可完成查找。 示例: 示例 1: 1234567输入:nums = [7,1,5,4]输出:4解释:- 选择 i = 1, j = 2。- nums[1] = 1, nums[2] = 5。- 差值 = 5 - 1 = 4。- 这是满足条件的最大差值。 示例 2: 1234输入:nums = [9,4,3,2]输出:-1解释:- 不存在满足条件的 i 和 j,因为数组是递减的。 💻 解题思路 思路1:贪心算法(...














