Python技术迷

被裁后。人事把工资给我少算了,她跟我说算了。。

作为一个程序员,看到这种被裁员后的工资算错的情况,真的只能感叹“这是什么操作?”

有网友吐槽说,人事把自己23个工作日算成了22个,结果还让她自己放弃那200块钱的差额,真的是让人又气又笑。你想,200块,虽然不多,但这也算是一份应得的权利,不是别人施舍给你的。

Image

裁员时候,人事总是慢条斯理地算工资,明明有错,问她结果就是“算了,别计较了”,这话说的倒是轻松。我只能想,真的是人事部门的“高效”呀,连这样的小细节都能忽视,没点责任感,真心不适合做这些事。

Image

如果我碰到这种事,200块我肯定不会让步。毕竟,都是自己辛苦赚来的钱,就算是裁员,也不能让人觉得你在“放水”。你说呢?【备注:文末可领最新资料】。

算法题:带限制的子序列和

在进行算法题时,最重要的挑战之一就是如何将问题抽象化,并使用合适的数据结构和算法高效地解决它。

今天,我们来探讨一个经典的算法问题:带限制的子序列和。这类问题常常要求我们在某些限制条件下找到最大或最小的子序列,通常需要用到动态规划、贪心算法等技术。让我们一步步解析这个问题。

假设题目要求我们给定一个数组 nums 和一个整数 k,我们需要从数组中找出一个子序列,使得子序列的和最大,并且子序列的元素间满足某种限制条件。最常见的限制可能是:子序列中的两个元素的索引差必须满足某个条件,或者元素的值不能相邻等。我们以一个常见的“隔元素”的子序列问题为例来进行分析。

假设题目给出的是一个整数数组 nums,我们需要找到一个子序列,使得选中的元素和最大,同时,任意两个选中的元素之间的差距至少为 k。这就意味着,选中的元素之间不能相邻,也不能差距太小。

思路解析

这个问题最直观的解法可能是暴力搜索,尝试所有可能的子序列,但这样的做法显然是不可行的,尤其当 nums 数组的长度较大时,时间复杂度会急剧增加。我们需要一种更高效的方式来解决这个问题。最好的选择是动态规划(DP)。

我们可以使用一个 dp 数组,其中 dp[i] 表示以 nums[i] 作为子序列末尾元素时的最大和。接下来,我们考虑每个元素 nums[i] 是否可以加入之前的某个子序列中。为了满足限制条件,只有当 i 与之前的某个索引 j 满足 i - j >= k 时,nums[i] 才能与 nums[j] 共同构成一个合法的子序列。

动态规划的递推关系

  • 初始状态:dp[i] = nums[i],即每个元素至少能作为一个子序列,和就是它本身。
  • 状态转移:对于每一个 dp[i],我们需要遍历所有之前的元素 dp[j],其中 j < i 且 i - j >= k,选择一个使得 dp[j] 和 nums[i] 之和最大的情况。

我们的递推公式为:

dp[i] = max(dp[i], dp[j] + nums[i]) 其中 j < i 且 i - j >= k

这样,最终的结果就是 dp 数组中的最大值。

代码实现

def maxSubsequenceSum(nums, k):
    n = len(nums)
    if n == 0:
        return 0

        dp = [0] * n  # dp[i]表示以nums[i]为结尾的子序列和的最大值
    dp[0] = nums[0]  # 初始状态,第一个元素只有自己

        for i in range(1, n):
        dp[i] = nums[i]  # 至少可以单独选nums[i]作为子序列
        for j in range(i-1, -1, -1):  # 遍历所有可能的前驱元素
            if i - j >= k:  # 确保符合限制条件
                dp[i] = max(dp[i], dp[j] + nums[i])  # 更新dp[i]

        return max(dp)  # 返回所有dp[i]的最大值

代码解析

  1. 初始化:我们创建一个 dp 数组来存储每个子序列的和,并初始化 dp[0] 为 nums[0],因为第一个元素的子序列和就是它本身。
  2. 状态转移:对每个 i,我们从前一个元素 j 开始遍历,确保 i - j >= k,然后更新 dp[i] 的最大值。
  3. 返回结果:最后返回 dp 数组中的最大值,这就是满足条件的子序列和的最大值。

时间复杂度分析

这个算法的时间复杂度为 O(n^2),因为我们对于每一个 i 都需要检查前面的所有可能的 j,所以最坏情况下的时间复杂度是二次的。对于较小的 n 值来说,二次复杂度是可以接受的,但如果 n 较大,可能需要对算法进行优化。

优化:使用单调队列

为了提高效率,可以使用单调队列来优化这个动态规划问题。通过维护一个递减的队列,我们能够快速找到符合条件的最大 dp[j],从而避免了对所有 j 进行遍历。优化后的算法的时间复杂度可以降到 O(n)

最后,我为大家打造了一份deepseek的入门到精通教程,完全免费:https://www.songshuhezi.com/deepseek

也可以看我写的这篇文章《DeepSeek满血复活,直接起飞!》来进行本地搭建。

对编程、职场感兴趣的同学,大家可以联系我微信:golang404,拉你进入“程序员交流群”。
🔥虎哥私藏精品 热门推荐🔥

虎哥作为一名老码农,整理了全网最全《python高级架构师资料合集》。

资料包含了《IDEA视频教程》、《最全python面试题库》、《最全项目实战源码及视频》及《毕业设计系统源码》,总量高达650GB,全部免费领取