《五月集训》第十五日——广度优先搜索

这篇博客探讨了如何利用广度优先搜索(BFS)解决数组嵌套问题,如LeetCode的565题,以及二进制手表问题,如401题。在565题中,通过遍历并标记已使用的元素找到最大集合的大小。而在401题中,通过暴力枚举所有可能的小时和分钟组合,找到符合特定LED亮灯数量的时间表示。博客还预告了未来将学习和应用图的BFS相关知识来解决其他问题。

前言

这是五月集训的第十五日,今日的训练内容是 广度优先搜索

解题报告

1.力扣565

原题链接

565. 数组嵌套

题目概述

索引从0开始长度为N的数组A,包含0到N - 1的所有整数。找到最大的集合S并返回其大小,其中 S[i] = {A[i], A[A[i]], A[A[A[i]]], … }且遵守以下的规则。

假设选择索引为i的元素A[i]为S的第一个元素,S的下一个元素应该是A[A[i]],之后是A[A[A[i]]]… 以此类推,不断添加直到S出现重复的元素。

解题思路

使用题目所给的方式对数组进行遍历就可以了,为了防止遍历过程中出现重复,只需要在遍历的同时把被使用过的元素赋值为 -1 即可。

源码剖析

int arrayNesting(int* nums, int numsSize)
{
    int cnt = 0;
    int max = 0, tmp;
    int i,j;
    if (nums == NULL) {
        return -1;
    }
    for (i = 0; i < numsSize; i++){
        j = i;
        while (j < numsSize && nums[j] != -1) {
            cnt++;
            tmp = nums[j];
            nums[j] = -1;
            j = tmp;
        }
        max = cnt > max ? cnt : max;
        cnt = 0;
    }
    return max;
}

将当前位置的值赋予下标,并标记下当前的数据,使其变成 -1

2.力扣401

原题链接

401. 二进制手表

题目概述

二进制手表顶部有 4 个 LED 代表 小时(0-11),底部的 6 个 LED 代表 分钟(0-59)。每个 LED 代表一个 0 或 1,最低位在右侧。
给你一个整数 turnedOn ,表示当前亮着的 LED 的数量,返回二进制手表可以表示的所有可能时间。你可以 按任意顺序 返回答案。

小时不会以零开头:

例如,“01:00” 是无效的时间,正确的写法应该是 “1:00” 。
分钟必须由两位数组成,可能会以零开头:

例如,“10:2” 是无效的时间,正确的写法应该是 “10:02” 。

解题思路

暴力枚举

源码剖析

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
 int countbit(int n)
 {
     int count=0;
     while(n)
     {
         count++;
         n=n&(n-1);
     }
     return count;
 }
char ** readBinaryWatch(int turnedOn, int* returnSize)
{
    char**ret=(char**)malloc(sizeof(char*)*12*60);
    *returnSize=0;
    for(int i=0;i<12;i++)
    {
        for(int j=0;j<60;j++)
        {
            if(countbit(i)+countbit(j)==turnedOn)
            {
                ret[(*returnSize)]=malloc(sizeof(char)*6);
                sprintf(ret[(*returnSize)++],"%d:%02d",i,j);
            }
        }
    }
    return ret;
}

3.力扣1079

原题链接

1079. 活字印刷

题目概述

你有一套活字字模 tiles,其中每个字模上都刻有一个字母 tiles[i]。返回你可以印出的非空字母序列的数目。

解题思路

先做记录,预计在这两天学完图的广度优先搜索相关知识之后回来重刷

源码剖析


4.力扣1219

原题链接

1219. 黄金矿工

题目概述

同上

解题思路

源码剖析


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值