怎么感觉it一下子就业崩溃了.....

文摘   2024-11-20 11:35   山西  
最近我刷到个帖子,网友们在吐槽:“怎么感觉IT一下子就业崩了?”


不得不说,这话题是真戳程序员的痛点,评论区全是“过来人”的呐喊声。咱们这些码农,原本敲代码敲得不见天日,现在连饭碗都开始发抖了,怎么不慌?
有网友直言:“以前校招大厂随便进,现在投简历跟投石子儿一样,全没回音。”
😢说实话,我也有类似感受,以前金三银四,面试能排满一周;现在别说金三银四了,连铁三铝四都快没影了。
还有人感慨:“什么都卷,连实习生都要985”。就算你敲出了百万行代码,没有“名校牌子”,都不好意思递简历。
不过,说实话,这一波IT就业寒潮是真的挺寒的。但大舅千万不能就此躺平,不然等行情好的时候,你连上车的机会都没有~

算法题:戳气球问题

聊一个经典的算法题:戳气球问题

问题描述

题目是这样的:你面前有若干气球,每个气球上都写着一个数字,表示戳破它能获得的金币。戳破气球会影响相邻气球的分值计算,你的目标是通过戳气球获得最多的金币。
假设气球数组为 nums,戳破第 i 个气球可以获得的金币为 nums[i-1] * nums[i] * nums[i+1]。如果气球的左边或右边没有气球,视为 1。你需要计算出最多能获得的金币数。

程序员视角解析

一看这种要“最优”的题目,我脑子里第一个蹦出来的就是动态规划(Dynamic Programming)。这种问题的套路一般是:分解问题、找状态转移方程、写代码。

动态规划拆解

动态规划的核心是“化整为零”,也就是通过局部最优来构造全局最优。
我们定义一个二维DP数组 dp[i][j],表示在开区间 (i, j) 中戳破所有气球能获得的最多金币。注意,ij 是开区间,所以 ij 的气球不会被戳。
状态转移方程
为了计算 dp[i][j],我们需要枚举开区间 (i, j) 中的每一个气球 k,把它作为最后一个被戳的气球。此时,分值由三部分组成:
  1. 戳破气球 k 的金币:nums[i] * nums[k] * nums[j]
  2. dp[i][k]:戳破 (i, k) 开区间内的所有气球的最大金币。
  3. dp[k][j]:戳破 (k, j) 开区间内的所有气球的最大金币。
所以状态转移方程为:
dp[i][j] = Math.max(dp[i][j], dp[i][k] + dp[k][j] + nums[i] * nums[k] * nums[j]);

边界条件

为了简化计算,我们在数组的首尾分别加入一个虚拟气球,值为 1,所以实际计算的数组是 nums = [1] + nums + [1]。初始状态下,区间长度为 1 或更小的 dp[i][j] 都是 0,因为没有气球可以戳。

动态规划代码实现

一番分析之后,直接上代码看看怎么实现吧:
public class BurstBalloons {
    public int maxCoins(int[] nums) {
        int n = nums.length;
        int[] newNums = new int[n + 2];
        newNums[0] = newNums[n + 1] = 1;
        System.arraycopy(nums, 0, newNums, 1, n);

        int[][] dp = new int[n + 2][n + 2];

        for (int len = 2; len <= n + 1; len++) {  // 区间长度
            for (int i = 0; i <= n + 1 - len; i++) {
                int j = i + len;  // 区间右端点
                for (int k = i + 1; k < j; k++) {  // 枚举最后一个气球
                    dp[i][j] = Math.max(dp[i][j], 
                                       dp[i][k] + dp[k][j] + newNums[i] * newNums[k] * newNums[j]);
                }
            }
        }
        return dp[0][n + 1];
    }

    public static void main(String[] args) {
        BurstBalloons bb = new BurstBalloons();
        int[] nums = {3158};
        System.out.println("Maximum coins: " + bb.maxCoins(nums));  // 输出:167
    }
}

核心代码讲解

  1. 扩展数组:在原数组两边加上 1,这样方便处理边界问题。
  2. 区间遍历:通过区间长度和起点,遍历所有可能的 (i, j) 开区间。
  3. 枚举最后一个气球:关键在于选对 k,也就是最后一个被戳破的气球。
    💡 想象一下,选定最后一个气球后,开区间 (i, j) 就被分成了两半,问题也就被分解了。

-END-


ok,今天先说到这,老规矩,给大家分享一份不错的副业资料,感兴趣的同学找我领取。

以上,就是今天的分享了,看完文章记得右下角给何老师点赞,也欢迎在评论区写下你的留言

程序媛山楂
5年+程序媛,专注于AI编程普及。本号主要分享AI编程、Chat账号、Chat教程、Sora教程、Suno AI、Sora账号、Sora提示词、AI换脸、AI绘画等,帮助解决各种AI疑难杂症。
 最新文章