📣 独立日限时特惠: VIP通行证立减$68
楼主: cynthiazp
跳转到指定楼层
上一主题 下一主题
收起左侧

脸家加面,似乎他家最近新题很多?

🔗
mingzhou1987 2017-8-4 09:01:20 | 只看该作者
全局:
backtrack + dfs解法,算是subset的变种题把
void dfs(vector<int> nums, int idx, int &res, vector<int> &cur, int target)
{
    if(idx == nums.size())
    {
        return;
    }
    else
    {
        for(int i = idx; i < nums.size(); i++)
        {
            cur.push_back(nums[i]);
            if((cur.size() == 1 && cur[0] < target) || (cur[0] + cur.back() < target))
            {
                for(auto it : cur)
                {
                    cout<<it<<" ";
                }
                cout<<endl;
                res++;
                dfs(nums, i + 1, res, cur, target);
            }
            cur.pop_back();
            while(i < nums.size() - 1 && nums[i] == nums[i + 1])i++;
        }
    }
}
int count(vector<int> nums, int target)
{
    int res = 0;
    vector<int> cur;
    dfs(nums, 0, res, cur, target);
    return res;
}

int main()
{
    vector<int> nums = {2, 2, 3, 5, 7};
    cout<<count(nums, 8)<<endl;
   
}

补充内容 (2017-8-4 10:30):
if condition里(cur.size() == 1 && cur[0] < target) 条件去掉才对
回复

使用道具 举报

🔗
flgt2014 2017-8-4 09:04:19 | 只看该作者
全局:
twosumii 发表于 2017-8-4 07:27
并不是新题,你刷的不够 >

应该是 while i <= j  ?
while i < j 的时候结果会少了一个[3] (比如用LZ给的例子)
回复

使用道具 举报

🔗
flgt2014 2017-8-4 09:19:41 | 只看该作者
全局:
mingzhou1987 发表于 2017-8-4 08:54
楼主第二题,result得加上5和7.

[5] 和 [7] 不满足条件吧?最大最小值都是本身,相加大于K了
回复

使用道具 举报

🔗
熟狗脸 2017-8-4 09:29:45 | 只看该作者
全局:
楼主加面是电面后还是onsite后的加面啊?
回复

使用道具 举报

🔗
f1371342385 2017-8-4 09:41:39 | 只看该作者
全局:
LZ这都是原题 :(
回复

使用道具 举报

🔗
chris612ku 2017-8-4 10:00:59 | 只看该作者
全局:
楼主
第一题如果用two pointer的话,题目的两个数组应该是sorted的吧?
假如没sort好是不是用hashmap 或 hashset 才会比较好?

补充内容 (2017-8-4 10:11):
第二题应该就是用two pointer吧?两层循环=》O(n^2)

补充内容 (2017-8-4 10:16):
不对  第二题想了一想  O(n)应该就可以解出来了
回复

使用道具 举报

🔗
mingzhou1987 2017-8-4 10:26:10 | 只看该作者
全局:
flgt2014 发表于 2017-8-4 09:19
[5] 和 [7] 不满足条件吧?最大最小值都是本身,相加大于K了

我理解有误,sorry,楼主的例子是对的
回复

使用道具 举报

🔗
Darkduke68 2017-8-4 11:25:20 | 只看该作者
全局:
twosumii 发表于 2017-8-4 07:27
并不是新题,你刷的不够 >

two pointers 正解。 不过 while 条件我觉得应该是i <= j, 不然会漏掉单一元素的子集。

res = 0
i, j = 0, len(s)-1
while i <= j:
    if s[i] +s[j] < k:
        res += pow(2, j-i)
        i += 1
    else:
        j -= 1
return res
回复

使用道具 举报

🔗
mingzhou1987 2017-8-4 11:48:54 | 只看该作者
全局:
如果用夹击求2次幂的解法遇到重复元素怎么破?譬如这个例子,{2, 3, 3, 5, 5, 7, 7} target为8,
2和5 range之间有两个3,如果都只包含一个3的子集,只能算一个

回复

使用道具 举报

🔗
scredwood 2017-8-4 13:13:09 | 只看该作者
全局:
mingzhou1987 发表于 2017-8-4 11:48
如果用夹击求2次幂的解法遇到重复元素怎么破?譬如这个例子,{2, 3, 3, 5, 5, 7, 7} target为8,
2和5 ran ...

如果你实在想双指针,那么就先预处理把重复去掉咯。。。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表