拿下Google offer,只要搞定小小的“背包”?

不论是Google,还是Facebook,在面试时总会考察背包问题。作为动态规划类问题中非常重要的一个类别,背包问题已经慢慢地成为了面试高频题。

v2-37c3926d91dff224a10b68f7cbb6e9d8_b.jpg

Google考过背包问题变形,Facebook考过多重背包,Uber把背包换成了别的词就直接拿出来用了,但是很多人都在这个问题上,跪了......

v2-d98e65c96b97214a25a02faef6ad55be_b.jpg

看起来是简单的数学问题,但背后的算法逻辑相当复杂,短时间分析不出来,基本上就跪了。

今天我们就来一起攻克一道背包面试真题。

题目描述
给出一个都是正整数的数组 nums,其中没有重复的数。从中找出所有的和为 target 的组合个数。

样例

样例1

        输入: nums = [1, 2, 4] 和 target = 4
输出: 6
解释:
可能的所有组合有:
[1, 1, 1, 1]
[1, 1, 2]
[1, 2, 1]
[2, 1, 1]
[2, 2]
[4]
      

样例2

        输入: nums = [1, 2] 和 target = 4
输出: 5
解释:
可能的所有组合有:
[1, 1, 1, 1]
[1, 1, 2]
[1, 2, 1]
[2, 1, 1]
[2, 2]
      

参考答案

        class Solution {
public:
    int combinationSum4(vector<int>& nums, int target) {
        int n = nums.size();
        int f[target+1];
        memset(f, 0, sizeof(f));
        
        f[0] = 1;
        for (int i = 1; i <= target; i++) {
            for (int j = 0; j < n; j++) 
            if (i - nums[j] >= 0){
                f[i] += f[i-nums[j]];
            }
        }
        return f[target];
    }
};

      

这道题你会做吗?除了这道面试真题,我们还在LintCode上整理了10道高频背包问题,包括0-1背包、完全背包、多重背包。

把这些做上2遍,等于面试题目全掌握~

v2-d6878ef5b79ca926fc99e13071a01e40_b.jpg
LintCode上的背包问题合集

这些题自己一个人做可能会没思路,效率低?

不用担心,《背包问题四讲》精心总结了面试应对套路,并配套 LintCode 独家背包题库,能有效提升解决背包问题的速度。

v2-17423338e70e3bb4e3054e58f36943ce_b.jpg

这门原价$199的课程,现在$1秒杀!

参与方式:

戳我免费试听后,添加九章Sunny微信jiuzhang15,回复【知乎背包】+试听报名截图即可$1购买本课程。

参与条件:

九章新用户(未在九章购买过课程的都算新用户哦~)

发布了438 篇原创文章 · 获赞 64 · 访问量 11万+

猜你喜欢

转载自blog.csdn.net/JiuZhang_ninechapter/article/details/103666918