题解 | #拜访# BFS

拜访

https://www.nowcoder.com/practice/491828fc7d93459db450b344c2aaaeef

class Solution {
  public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param CityMap int整型vector<vector<>>
     * @param n int整型
     * @param m int整型
     * @return int整型
     */
    int countPath(vector<vector<int> >& CityMap, int n, int m) {
        queue<pair<int, int>> qu;
        pair<int, int> destination;
        // 找到起点和终点,都找到了则退出循环
        bool flag1 = false, flag2 = false;
        for (int i = 0; i < n; i++) {
            if (flag1 && flag2) {
                break;
            }
            for (int j = 0; j < m; j++) {
                if (CityMap[i][j] == 1 ) {
                    qu.push({i, j});
                    flag1 = true;
                    continue;
                }
                if (CityMap[i][j] == 2 ) {
                    destination = {i, j};
                    flag2 = true;
                    continue;
                }
            }
        }
        // BFS
        int ans = 0;
        while (qu.size()) {
            int sz = qu.size();
            for (int i = 0; i < sz; i++) {
                // 取出队头坐标
                int x = qu.front().first;
                int y = qu.front().second;
                qu.pop();
                // 到达终点,计数加1,此时必是最小距离,而且处于队列同层的都是这个距离
                if (x == destination.first && y == destination.second) {
                    ans++;
                    continue;
                }
                // 标记为已访问
                CityMap[x][y] = -2;
                // 遍历四个方向
                for (const auto & [dx, dy] : vector<pair<int, int>>
                {{0, 1}, {0, -1}, {1, 0}, {-1, 0}}) {
                    int nx = x + dx;
                    int ny = y + dy;
                    if (nx >= 0 && nx < n && ny >= 0 && ny < m && (CityMap[nx][ny] == 0 ||
                            CityMap[nx][ny] == 2)) {
                        qu.push({nx, ny});
                    }
                }
            }
            // 遍历完一层后,如果找到了终点,一定是最小的,可以结束了
            if (ans != 0) {
                break;
            }
        }
        return ans;
    }
};

时间复杂度:BFS算法的时间复杂度为O(V+E),其中V为城市地图中的顶点数,E为城市地图中的边数。在这里,V为nm,E为4nm(每个顶点最多有四条边),因此BFS的时间复杂度为O(nm)。 综合起来,整体时间复杂度为O(n*m)

空间复杂度:需要一个队列qu来存储坐标,队列的最大可能大小为nm,因此空间复杂度为O(nm)

全部评论

相关推荐

咋六月了还有面试啊,有兄弟了解这个部门吗一面结束更新面完了家人们,纯纯kpi啊,上来就是一道题是打印多个字符串的笛卡尔积,库吃库吃写完了,结果又来一道协程调度的题。做题就做了40分钟,也没开摄像头,也没有反问,也没有八股,最后面试官跑路的时候被我拉住问了一个问题然后不耐烦的回答一句话跑路了。二面结束更新刚刚结束面试,新鲜出炉热乎的面经。二面面试官一改一面面试官懒懒洋洋的作风,也开了摄像头,这是本菜鸟经历的最全面的一次面试,有拷打项目、有八股、有场景题、有手撕、有shell编程题(我直接投降)、有智力题面试官水平很高,很发散,问的也很全,就是网络有点卡顿加上面试官说话稍微带点口音,导致有些问题听不清楚。八股的范围基本也就围绕后端老四样,外加项目上的相关知识。面试体验挺好,只不过有些题我直接就投降了,而且算法也没写到让面试官满意的程度。关于一面的两道手撕第一道可以理解为有多个字符串数组,每个数组里有多个字符串,求笛卡尔积第二道是并发三个协程,有序打印1、2、3三个数字,要求第一个协程打印一百次,第二个两百次,第三个三百次。大概是这个意思。更新已约hr面,后续我再探更新&nbsp;&nbsp;hr面结束转录用评估hr巨帅巨有气质,我看着屏幕,一人占据屏幕一半,鼠鼠真不愧是哥布林😂hr面确实主要是聊天,但我还是能感觉到一定压力,我觉得hr面主要考验情商吧,会说话就行,看hr给不给你舔他们的机会,我这个就没给,所以面的过程心里慌慌的。说要端午节以后才会有结果,等端午以后再探吧
查看2道真题和解析
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务