Skip to content

力扣每日一题【2025】

About 2703 wordsAbout 9 min

algoproblem-set

2025-02-20

记录2025年每日一题刷题过程。

2025-04

2874. 有序三元组中的最大值 II(20250402更新)

这里还有一道相同题目的简单题:2873. 有序三元组中的最大值 I

这两道题是第 365 场周赛题目,感兴趣的可以看下。

给你一个下标从 0 开始的整数数组 nums

请你从所有满足 i < j < k 的下标三元组 (i, j, k) 中,找出并返回下标三元组的最大值。如果所有满足条件的三元组的值都是负数,则返回 0

下标三元组 (i, j, k) 的值等于 (nums[i] - nums[j]) * nums[k]

开始想到的就是确定j的位置,然后在前面取最大值,和后面取最大值,这样的话,算数值就是最大的。

题目一和题目二的区别就是在于测试用例的范围上。

枚举 J

121. 买卖股票的最佳时机(20250403更新)

今天的每日一题是有序三元组II,昨天已经做过了,今天把买卖股票作为每日一题题目。

给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。

你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。

返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0

根据题意我们知道,想要获取的利润最大的话,我们就需要买的时候尽可能的小, 买的时候尽可能的大,所以就可以通过维护前缀最小值,或者维护后缀最大值的方式来求解。

维护前缀最小值

1123. 最深叶节点的最近公共祖先(20250404更新)

给你一个有根节点 root 的二叉树,返回它 最深的叶节点的最近公共祖先

回想一下:

  • 叶节点 是二叉树中没有子节点的节点
  • 树的根节点的 深度0,如果某一节点的深度为 d,那它的子节点的深度就是 d+1
  • 如果我们假定 A 是一组节点 S最近公共祖先S 中的每个节点都在以 A 为根节点的子树中,且 A 的深度达到此条件下可能的最大值。
Java

416. 分割等和子集(20250407更新)

标签:数组、动态规划

给你一个 只包含正整数非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。

统计数组总和;如果和为奇数,直接返回false;加入记忆化搜索数组。

设数组总和为s,求能否从nums中选出一个子序列,其元素的和恰好等于s/2。

开始定义dfs(target),表示求和为target的答案,但是和nums的元素关联不上,后面看了题解,将dfs修改成dfs(i, j),表示从nums[0]到nums[i]中,是否存在和为j的子序列。

考虑选或者不选nums[i]的情况,就得到递推公式:

  • 选: dfs(i-1, j-nums[i])
  • 不选:dfs(i-1, j)

求两者是否有一个满足条件。

Java

编码过程中的困难点:

  • 1、记忆化搜索数组memo是定义成int还是boolean类型?如何初始化?
    • 定义成int,初始化的时候默认-1, 这样在时候是就可以判断memo[i][j]是否等于-1;boolean不好判断。
    • 初始化只能每一层Arrays.fill(row, -1)来初始化。

3396. 使数组元素互不相同所需的最少操作次数(20250408更新)

标签:数组、哈希表

给你一个整数数组 nums,你需要确保数组中的元素 互不相同 。为此,你可以执行以下操作任意次:

  • 从数组的开头移除 3 个元素。如果数组中元素少于 3 个,则移除所有剩余元素。

**注意:**空数组也视作为数组元素互不相同。返回使数组元素互不相同所需的 最少操作次数

如果存在重复的值,每次移除前面三个元素,也就是移除数组的前缀,那么剩下的一定是nums的后缀,那么问题就变成了,求最长不重复的nums的后缀元素。

当第i个元素重复,那么前面下标从0到i的话就有i+1个元素,除以3上取整的话,通过转化就得到了结果:i/3 + 1

上取整下取整转换公式的证明

Java
class Solution {
    public int minimumOperations(int[] nums) {
        // 求nums的最长无重复元素后缀
        Set<Integer> seen = new HashSet<>();
        for (int i = nums.length - 1; i >= 0; i--) {
            // set.add 添加成功之后返回true, 添加失败返回false
            if (!seen.add(nums[i])) {
                // (i+1)/3上取整 = i/3下去整+1
                return i / 3 + 1;
            }
        }
        return 0;
    }
}

3375. 使数组的值全部为 K 的最少操作次数(20250409更新)

标签:数组、哈希表

给你一个整数数组 nums 和一个整数 k

如果一个数组中所有 严格大于 h 的整数值都 相等 ,那么我们称整数 h合法的

比方说,如果 nums = [10, 8, 10, 8] ,那么 h = 9 是一个 合法 整数,因为所有满足 nums[i] > 9 的数都等于 10 ,但是 5 不是 合法 整数。

你可以对 nums 执行以下操作:

  • 选择一个整数 h ,它对于 当前 nums 中的值是合法的。
  • 对于每个下标 i ,如果它满足 nums[i] > h ,那么将 nums[i] 变为 h

你的目标是将 nums 中的所有元素都变为 k ,请你返回 最少 操作次数。如果无法将所有元素都变 k ,那么返回 -1 。

真心觉得自己做题看到的就是题,灵神做题真的是连题目的裤衩都看透了😂。

题目的本质就是统计次大值的个数min(nums)和k的之间的关系, distinctCount表示数组中不同的元素个数

  • k > min(nums),无法满足直接返回-1
  • k == min(nums) ,返回dictinctCount - 1
  • k < min(nums), 返回distinctCount
自己写的代码

Changelog

Last Updated: View All Changelog
  • feat(sci): encomic: 复盘

    On 4/12/25

求求了,快滚去学习!!!

求求了求求了,快去学习吧!

【题单】贪心算法

不知道方向的时候,可以多看看书,书会给你指明下一步该干什么,加油!