Leetcode刷题详解——衣橱整理

2024-03-23 03:59

本文主要是介绍Leetcode刷题详解——衣橱整理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1. 题目链接:LCR 130. 衣橱整理

2. 题目描述:

家居整理师将待整理衣橱划分为 m x n 的二维矩阵 grid,其中 grid[i][j] 代表一个需要整理的格子。整理师自 grid[0][0] 开始 逐行逐列 地整理每个格子。

整理规则为:在整理过程中,可以选择 向右移动一格向下移动一格,但不能移动到衣柜之外。同时,不需要整理 digit(i) + digit(j) > cnt 的格子,其中 digit(x) 表示数字 x 的各数位之和。

请返回整理师 总共需要整理多少个格子

示例 1:

输入:m = 4, n = 7, cnt = 5
输出:18

提示:

  • 1 <= n, m <= 100
  • 0 <= cnt <= 20

3. 算法思路:

这是一道非常典型的搜索类问题

我们可以通过深搜或者宽搜,从[0,0]点出发,按照题目的规则一直往[m-1,n-1]位置走,

同时设置一个全局变量,每次走到一个合法的位置,就将全局变量加1,当我们把所有走到的路都走完之后,全局变量里存的就是最终答案

4. 算法流程:

  1. 定义变量和数组:在类Solution中,定义了以下成员变量和数组:

    • mncnt:分别表示矩阵的行数、列数和计数器。
    • vis:布尔数组,用于记录每个位置是否被访问过。
    • ret:整数变量,用于记录结果。
    • dxdy:两个整数数组,分别表示上下左右四个方向的偏移量。
  2. 函数wardrobeFinishing:这是算法的主函数,接收三个参数:矩阵的行数_m、列数_n和计数器_cnt。它的作用是调用深度优先搜索算法来解决问题,并返回结果。

    • 将参数赋值给成员变量mncnt
    • 调用dfs(0, 0)从矩阵的第一个位置开始进行深度优先搜索。
    • 返回结果ret
  3. 函数dfs:这是一个递归函数,用于执行深度优先搜索。它接收两个参数:当前位置的行坐标i和列坐标j

    • 将结果ret加1。
    • 标记当前位置为已访问。
    • 遍历四个方向(上、下、左、右),计算下一个位置的坐标。
    • 如果下一个位置在矩阵范围内且未被访问过且满足条件(通过调用check(x, y)函数判断),则继续递归调用dfs(x, y)进行深度优先搜索。
  4. 函数check:这是一个辅助函数,用于检查给定位置是否满足特定条件。它接收两个参数:当前位置的行坐标i和列坐标j

    • 初始化变量tmp为0,用于存储数字之和。
    • 使用循环,当i不为0时,执行以下操作:
      • i的个位数加入tmp
      • i除以10,去掉个位数。
    • 使用循环,当j不为0时,执行以下操作:
      • j的个位数加入tmp
      • j除以10,去掉个位数。
    • 判断tmp是否小于等于计数器cnt,如果是则返回true,否则返回false。

这个算法的目的是通过深度优先搜索遍历矩阵中的每个位置,并根据特定条件进行判断和处理。最终的结果存储在变量ret中,并通过函数wardrobeFinishing返回。

请添加图片描述

5. C++算法代码:

class Solution {int m, n, cnt; // 定义变量m、n、cnt,分别表示矩阵的行数、列数和计数器bool vis[101][101]; // 定义布尔数组vis,用于记录每个位置是否被访问过int ret; // 定义变量ret,用于记录结果int dx[4] = {0, 0, 1, -1}; // 定义数组dx,表示上下左右四个方向的偏移量int dy[4] = {1, -1, 0, 0}; // 定义数组dy,表示上下左右四个方向的偏移量public:int wardrobeFinishing(int _m, int _n, int _cnt) { // 定义函数wardrobeFinishing,接收三个参数:矩阵的行数、列数和计数器m = _m, n = _n, cnt = _cnt; // 将参数赋值给成员变量dfs(0, 0); // 从矩阵的第一个位置开始进行深度优先搜索return ret; // 返回结果}void dfs(int i, int j) { // 定义函数dfs,接收两个参数:当前位置的行坐标和列坐标ret++; // 结果加1vis[i][j] = true; // 标记当前位置为已访问for (int k = 0; k < 4; k++) { // 遍历四个方向int x = i + dx[k], y = j + dy[k]; // 计算下一个位置的坐标if (x >= 0 && x < m && y >= 0 && y < n && !vis[x][y] && check(x, y)) { // 如果下一个位置在矩阵范围内且未被访问过且满足条件dfs(x, y); // 继续深度优先搜索}}}bool check(int i, int j) { // 定义函数check,接收两个参数:当前位置的行坐标和列坐标int tmp = 0; // 定义变量tmp,用于存储数字之和while (i) { // 当i不为0时,执行循环tmp += i % 10; // 将i的个位数加入tmpi /= 10; // i除以10,去掉个位数}while (j) { // 当j不为0时,执行循环tmp += j % 10; // 将j的个位数加入tmpj /= 10; // j除以10,去掉个位数}return tmp <= cnt; // 判断tmp是否小于等于计数器,如果是则返回true,否则返回false}
};

这篇关于Leetcode刷题详解——衣橱整理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/837073

相关文章

C++对象布局及多态实现探索之内存布局(整理的很多链接)

本文通过观察对象的内存布局,跟踪函数调用的汇编代码。分析了C++对象内存的布局情况,虚函数的执行方式,以及虚继承,等等 文章链接:http://dev.yesky.com/254/2191254.shtml      论C/C++函数间动态内存的传递 (2005-07-30)   当你涉及到C/C++的核心编程的时候,你会无止境地与内存管理打交道。 文章链接:http://dev.yesky

十四、观察者模式与访问者模式详解

21.观察者模式 21.1.课程目标 1、 掌握观察者模式和访问者模式的应用场景。 2、 掌握观察者模式在具体业务场景中的应用。 3、 了解访问者模式的双分派。 4、 观察者模式和访问者模式的优、缺点。 21.2.内容定位 1、 有 Swing开发经验的人群更容易理解观察者模式。 2、 访问者模式被称为最复杂的设计模式。 21.3.观察者模式 观 察 者 模 式 ( Obser

【操作系统】信号Signal超详解|捕捉函数

🔥博客主页: 我要成为C++领域大神🎥系列专栏:【C++核心编程】 【计算机网络】 【Linux编程】 【操作系统】 ❤️感谢大家点赞👍收藏⭐评论✍️ 本博客致力于知识分享,与更多的人进行学习交流 ​ 如何触发信号 信号是Linux下的经典技术,一般操作系统利用信号杀死违规进程,典型进程干预手段,信号除了杀死进程外也可以挂起进程 kill -l 查看系统支持的信号

Jitter Injection详解

一、定义与作用 Jitter Injection,即抖动注入,是一种在通信系统中人为地添加抖动的技术。该技术通过在发送端对数据包进行延迟和抖动调整,以实现对整个通信系统的时延和抖动的控制。其主要作用包括: 改善传输质量:通过调整数据包的时延和抖动,可以有效地降低误码率,提高数据传输的可靠性。均衡网络负载:通过对不同的数据流进行不同程度的抖动注入,可以实现网络资源的合理分配,提高整体传输效率。增

Steam邮件推送内容有哪些?配置教程详解!

Steam邮件推送功能是否安全?如何个性化邮件推送内容? Steam作为全球最大的数字游戏分发平台之一,不仅提供了海量的游戏资源,还通过邮件推送为用户提供最新的游戏信息、促销活动和个性化推荐。AokSend将详细介绍Steam邮件推送的主要内容。 Steam邮件推送:促销优惠 每当平台举办大型促销活动,如夏季促销、冬季促销、黑色星期五等,用户都会收到邮件通知。这些邮件详细列出了打折游戏、

探索Elastic Search:强大的开源搜索引擎,详解及使用

🎬 鸽芷咕:个人主页  🔥 个人专栏: 《C++干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 引入 全文搜索属于最常见的需求,开源的 Elasticsearch (以下简称 Elastic)是目前全文搜索引擎的首选,相信大家多多少少的都听说过它。它可以快速地储存、搜索和分析海量数据。就连维基百科、Stack Overflow、

LeetCode--231 2的幂

题目 给定一个整数,编写一个函数来判断它是否是 2 的幂次方。 示例 示例 1:输入: 1输出: true解释: 20 = 1示例 2:输入: 16输出: true解释: 24 = 16示例 3:输入: 218输出: false class Solution {public:bool isPowerOfTwo(int n) {if (n <= 0) return fals

LeetCode--234 回文链表

题目 请判断一个链表是否为回文链表。 示例 示例 1:输入: 1->2输出: false示例 2:输入: 1->2->2->1输出: true /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode(int x) : val

LeetCode--220 存在重复元素 III

题目 给定一个整数数组,判断数组中是否有两个不同的索引 i 和 j,使得 nums [i] 和 nums [j] 的差的绝对值最大为 t,并且 i 和 j 之间的差的绝对值最大为 ķ。 示例 示例 1:输入: nums = [1,2,3,1], k = 3, t = 0输出: true示例 2:输入: nums = [1,0,1,1], k = 1, t = 2输出: true示例

LeetCode--217 存在重复元素

题目 给定一个整数数组,判断是否存在重复元素。如果任何值在数组中出现至少两次,函数返回 true。如果数组中每个元素都不相同,则返回 false。 示例 示例 1:输入: [1,2,3,1]输出: true示例 2:输入: [1,2,3,4]输出: false示例 3:输入: [1,1,1,3,3,4,3,2,4,2]输出: true class Solution {p