楼主: D__nancy
跳转到指定楼层
上一主题 下一主题
收起左侧

Bloomberg电面

🔗
 楼主| D__nancy 2016-6-3 22:56:08 | 只看该作者
全局:
aojing 发表于 2016-6-3 06:31
没看懂题,,为什么是返回10?

多谢安慰啊~不过我觉得肯定跪了,刚面完五分钟的时候想到中间更新result的时候貌似更新错了
回复

使用道具 举报

🔗
 楼主| D__nancy 2016-6-3 22:58:32 | 只看该作者
全局:
ptbrxlphx 发表于 2016-6-3 08:10
时间复杂度为所有点的个数

我用的是BFS, 找到所有可以reach的3的点,中间不断地更新现在得到的3组成图形的边数

这是后来才想到的,当时面的时候跟新错了,没考虑完全
回复

使用道具 举报

🔗
 楼主| D__nancy 2016-6-3 23:00:14 | 只看该作者
全局:
chplushsieh 发表于 2016-6-3 16:42
找出「所有」為3的點,好像有點不對。我理解是:只有和題目給定的matrix[2][1]相連的3,才納入考慮。所以 ...

是的,找到所有从<x,y> 能reach的3的点组成的图形
我用的是BFS,中间不断地更新当前的图形的边数
回复

使用道具 举报

🔗
 楼主| D__nancy 2016-6-3 23:14:42 | 只看该作者
全局:
aojing 发表于 2016-6-3 06:31
没看懂题,,为什么是返回10?

同学看下面的评论吧,我回复了。
就是所有能reach的所有3组成的图形的边长
回复

使用道具 举报

🔗
dong882205 2016-6-19 06:47:47 | 只看该作者
全局:
int cal(vector<vector<int>> &g, int a, int b)
{
    int n=g.size();
    if(!n)return 0;
    int m=g[0].size();
    if(!m) return 0;
    queue<pair<int,int>> q;
    int k=g[a][b];
    int res=0;
    q.emplace(a,b);
    const vector<int> d={0,1,0,-1,0};
    while(q.size())
    {
        int i=q.front().first, j=q.front().second;
        int ct=0;
        q.pop();
        if(g[i][j]==-k) continue;
        for(int cc=0;cc<4;cc++)
        {
            int ii=i+d[cc], jj=j+d[cc+1];
            if(ii<0||ii>=n||jj<0||jj>=m) continue;
            if(g[ii][jj]==k||g[ii][jj]==-k) ct++;
            if(g[ii][jj]==k)
                q.emplace(ii,jj);
        }
        g[i][j]=-k;
        res+=(4-ct);
    }
    return res;
}
回复

使用道具 举报

🔗
Jailf 2016-6-28 07:01:33 | 只看该作者
全局:
用C++写了一个DFS版本的,仅供参考
void helper(vector<vector<int>> & board, vector<vector<int>> & visited, int r, int c, int target, vector<int> & result, vector<pair<int, int>> & dir)
{
        if (r >= 0 && r<board.size() && c >= 0 && c<board[0].size()){
                if (visited[r][c] == 0 && board[r][c] == target){
                        //update four value;
                        if (r>result[0])
                                result[0] = r;
                        if (r<result[1])
                                result[1] = r;
                        if (c<result[2])
                                result[2] = c;
                        if (c>result[3])
                                result[3] = c;

                        visited[r][c] = 1;

                        for (auto d : dir){
                                helper(board, visited, r + d.first, c + d.second, target, result, dir);
                        }
                }
        }

        return;
}


int findMaxRec(vector<vector<int>> & board, int i, int j)
{
        //iterate every connected target and update the left, right, top, bottom value.

        //DFS
        vector<int> result = { i, i, j, j }; //bottom, top, left, right
        int target = board[i][j];
        vector<vector<int>> visited(board.size(), vector<int>(board[0].size(), 0));
        vector<pair<int, int>> dir = { { 1, 0 }, { -1, 0 }, { 0, 1 }, { 0, -1 } };

        helper(board, visited, i, j, target, result, dir);

        return (result[0] - result[1] + 1 + result[3] - result[2] + 1) * 2;
}

int main()
{
        vector<vector<int>> board = { { 0, 1, 2, 3, 4 }, { 0, 3, 0, 1, 7 }, { 0, 3, 0, 1, 7 }, { 0, 3, 3, 1, 7 } };
        cout<<findMaxRec(board, 2, 1);

        system("pause");
        return 0;
}
回复

使用道具 举报

🔗
tobebeyond 2016-7-30 13:44:15 | 只看该作者
全局:
不是说B家主要考C/C++吗?
回复

使用道具 举报

🔗
leyhzm 2016-8-4 01:03:23 | 只看该作者
全局:
DFS找到所有不重复的符合条件的点,设置一个数为num=0,每找到一个点,这个数num-2.
点的个数*4-num就是答案。
回复

使用道具 举报

🔗
何打发123 2016-8-15 00:48:35 | 只看该作者
全局:
感谢楼主分享~~~
回复

使用道具 举报

🔗
何打发123 2016-8-15 00:50:26 | 只看该作者
全局:
请问
3 1 2 3 4
3 3 0 1 7
3 3 0 1 7
0 3 3 1 7  如果长这样的话 应该返回的边长是不是12?

补充内容 (2016-8-15 00:51):
还是应该是14?。。 题目理解我还是有点问题 bb现在怎么这么难了>.<,,...
回复

使用道具 举报

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

本版积分规则

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