每日一题·565.数组嵌套·深度优先搜索

链接:https://leetcode.cn/problems/array-nesting/solution/chun-by-xun-ge-v-nro5/
来源:力扣(LeetCode)

题目

示例

思路

解题思路
看到题目先想到了并查集,但是看了看,用并查集有点大材小用,而且题目给定的关系图,用并查集并不好维护头节点
根据题目的需要时找给定数组中最大的图,那么可以根据题目思路,进行直接模拟,并且每个图都是不相交的

深度优先搜索
定义数组 set 记录我们的路径,每经过一个点就记录一下,然后遍历整个数组寻找最大环,每到一个数组元素,就将此元素作为图的起始位置,利用深度优先搜索遍历整个图
当我们遇到 set 中已经走过时

  1. 在遍历数组中遇见,说明此元素是已搜索过的图中某一元素,因为图都是不相交的,所以此元素可以跳过
  2. 在遍历图中遇见,说明此元素是图的起始位置,当前图结束了

最后返回最大图即可
原地遍历
和深度优先搜索思路一下,我们将每个节点作为图的起始位置遍历图,保存每次遍历的最大值,但这样显然会重复遍历

代码

深度优先搜索


#define MAX(a , b) ((a) > (b) ? (a) : (b))
//递归搜索图的大小

int dfs(int * nums, int inode, int * set)
{
    if(set[inode] != 0)
    {
        return 0;
    }
    set[inode] = 1;
    return (dfs(nums, nums[inode], set) + 1);
}
/*
int arrayNesting(int* nums, int numsSize)
*int arrayNesting:寻找数组中最大的图
int* nums:数组
int numsSize:数组长度
返回值:最大图的总元素
*/
int arrayNesting(int* nums, int numsSize){
    int * set = malloc(sizeof(int) * numsSize);
    memset(set, 0, sizeof(int) * numsSize);
    int max = -1;
    for(int i = 0; i < numsSize; i++)
    {
        if(set[i] != 0)
        {
            continue;
        }
        int m = dfs(nums, i, set);
        max = MAX(max , m);
    }
    return max;
}

原地遍历

#define MAX(a, b) ((a) > (b) ? (a) : (b))
/*
int arrayNesting(int* nums, int numsSize)
*int arrayNesting:寻找数组中最大的图
int* nums:数组
int numsSize:数组长度
返回值:最大图的总元素
*/
int arrayNesting(int* nums, int numsSize){
    int ans = 0;
    for (int i = 0; i < numsSize; ++i) {
        int cnt = 0;
        while (nums[i] < numsSize) {
            int num = nums[i];
            nums[i] = numsSize;
            i = num;
            ++cnt;
        }
        ans = MAX(ans, cnt);
    }
    return ans;
}


时间空间复杂度

每日一题·565.数组嵌套·深度优先搜索_第1张图片

 

你可能感兴趣的:(LeetCode刷题笔记,深度优先,算法,leetcode)