美团8.12笔试

给你一个长度为n的字符串,然后你可以将其分为x*y = n的二维数组,当四个方向字符相同时为联通块,求最小的连通块个数。

只过了20%,求各位佬指点一下:

#include <iostream>
#include <string>
#include <vector>
using namespace std;

class UFSets {
public:
    vector<int> vec;

    UFSets(int sz) {
        vec = vector<int>(sz, -1);
    }

    int Find(int x) {
        while (vec[x] > 0)x = vec[x];
        return x;
    }

    bool Union(int root1, int root2) {
        int r1 = Find(root1);
        int r2 = Find(root2);
        if (r1 == r2) {
            return false;
        }
        if (vec[r1] < vec[r2]) {
            vec[r2] = vec[r1] + vec[r2];
            vec[r1] = r2;
        }
        else {
            vec[r1] = vec[r1] + vec[r2];
            vec[r2] = r1;
        }
        return true;
    }
};

int main() {
    int n;
    cin >> n;
    string str;
    cin >> str;
    int minNumSets = 0x3f3f3f3f;
    // x=1 与 y=1效果一致,因此y直接从2开始就好了
    for (int x = 1; x < n / 2; x++) {
        if (n % x == 0) {
            int y = n / x;
            UFSets ufs(n);
            for (int i = 0; i < n; i++) {
                int posX = i / y;
                int posY = i % y;
                // 上边
                if (posX - 1 >= 0 && str[(posX-1)*x+posY] == str[i]) {
                    // 合并
                    ufs.Union((posX - 1) * x + posY, i);
                }
                // 左边
                if (posY - 1 >= 0 && str[posX * x + posY - 1] == str[i]) {
                    // 合并
                    ufs.Union(posX * x + posY - 1, i);
                }
            }
            // 检查ufs中的集合数量
            int numSets = 0;
            for (int i = 0; i < ufs.vec.size(); i++) {
                if (ufs.vec[i] < 0) {
                    numSets++;
                }
            }
            if (numSets < minNumSets) {
                minNumSets = numSets;
            }
        }
    }

    cout << minNumSets;
    return 0;
}
// 64 位输出请用 printf("%lld")

#美团信息集散地#
全部评论
我开始遍历的时候,是除以了个n/i。然后就被卡50了。然后发现,x与y相等的时候,并不一定结果相同。就换成了直接遍历n。在写这个题目的时候我刚好有个例子就测出来了aacaca.这个例子在x=2与y=2就可以体现出来不相同
点赞 回复 分享
发布于 2023-08-12 20:22 广东
可以考虑一下荣耀,南京和上海这边hc相对充足,https://www.nowcoder.com/share/jump/21920518161347041
点赞 回复 分享
发布于 2023-08-12 20:51 江苏
这题我印象里好像过了90?记不清了,我用的DFS。但是要先预处理一下x和y(矩阵的长宽)
点赞 回复 分享
发布于 2023-08-13 09:55 美国
好奇,截图不会被检测到吗
点赞 回复 分享
发布于 2023-08-13 13:25 江苏
岛屿数量问题
点赞 回复 分享
发布于 2023-08-14 15:55 陕西
没有看明白联通块是啥意思?
点赞 回复 分享
发布于 2023-08-18 00:20 湖北

相关推荐

HNU_fsq:建议直接出国,这简历太6了。自愧不如
点赞 评论 收藏
分享
09-27 18:15
门头沟学院 C++
在努力的小牛:来告诉你 录用评估挂就是同期好几个候选人,部门负责人选了其他人。
点赞 评论 收藏
分享
点赞 2 评论
分享
牛客网
牛客企业服务