LeetCode·每日一题·1042. 不邻接植花·模拟

作者:小迅
链接:https://leetcode.cn/problems/flower-planting-with-no-adjacent/solutions/2228005/mo-ni-zhu-shi-chao-ji-xiang-xi-by-xun-ge-dnoq/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

题目LeetCode·每日一题·1042. 不邻接植花·模拟_第1张图片

 

示例LeetCode·每日一题·1042. 不邻接植花·模拟_第2张图片

 

思路

题意 -> 在给定位置种1-4种不同的花,要求相邻位置的花不一样。

题目已经说的很清楚了,只要求相邻位置的花不一样,那么可以使用数组记录每一个位置的相邻位置,题目规定了每一个位置最多有三个相邻位置,每一个位置都没有记录,因此需要开辟n个位置每个位置有三个空间的二维数组,用于记录位置。

所有位置都记录完成之后,可以从1开始枚举每一个位置,对于任意一个位置初始都有四种花选择,然后枚举当前位置之前的相邻位置种花情况,舍弃掉与它们相同的花种,剩余的所有花都是可以的,重复上述过程直到枚举到最后即可

代码注释超级详细

代码




/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* gardenNoAdj(int n, int** paths, int pathsSize, int* pathsColSize, int* returnSize) {
    int adj[n][3], adjSize[n];//adf记录相邻位置,adjsize记录当前位置的可用空余空间
    memset(adjSize, 0, sizeof(adjSize));
    for (int i = 0; i < pathsSize; i++) {//记录每一个位置的相邻位置
        int x = paths[i][0] - 1;
        int y = paths[i][1] - 1;
        adj[x][adjSize[x]++] = y;
        adj[y][adjSize[y]++] = x;
    }
    int *ans = (int *)calloc(sizeof(int), n);
    for (int i = 0; i < n; i++) {//枚举每一个位置
        bool colored[5] = {0};//初始4种花都可以用
        for (int j = 0; j < adjSize[i]; j++) {//枚举相邻位置种什么花 
            int vertex = adj[i][j];
            colored[ans[vertex]] = true;//可以进一步缩小范围到当前位置之前的位置
        }
        for (int j = 1; j <= 4; j++) { //选择任意一种有效花
            if (colored[j] == 0) { //有效花
                ans[i] = j;
                break;
            }
        }
    }
    *returnSize = n;
    return ans;
}


作者:小迅
链接:https://leetcode.cn/problems/flower-planting-with-no-adjacent/solutions/2228005/mo-ni-zhu-shi-chao-ji-xiang-xi-by-xun-ge-dnoq/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

你可能感兴趣的:(LeetCode刷题笔记,leetcode,算法,职场和发展)