数据结构学习 jz13衣橱整理

news/2024/7/4 7:14:22

关键词:搜索算法 dfs bfs 回溯

题目:

各数位之和:

求法代码:

    int sums(int x)
    {
        int s=0;
        while(x!=0)
        {
            s+=x%10;
            x=x/10;
        }
        return s;
    }

总的思路:

这道题是求可以到达的格子数,想到可以用搜索算法来做,可以用dfs或者bfs。

可以去看这位大佬的分析。我基本是按照他的思路写的,但是把代码写的好看了一些。求各数位之和我用了封装好的sums函数,看起来舒服一些。

我一开始用传统的dfs做不出来也不知道为什么。

解法一:dfs 回溯

思路:

复杂度计算:

时间复杂度O(nm)

空间复杂度O(nm)

代码:

class Solution {
public:
    int wardrobeFinishing(int m, int n, int cnt) {
        vector<vector<int>> visited(m,vector<int>(n));
        return dfs(0,0,0,0,visited,m,n,cnt);
    }
    int dfs(int i,int j,int si,int sj,vector<vector<int>>& visited,int m,int n,int cnt)
    {
        if(si+sj>cnt||i>=m||j>=n||visited[i][j]) return 0;//中止条件
        visited[i][j]=1;//标记
        return 1+dfs(i+1,j,sums(i+1),sj,visited,m,n,cnt)+dfs(i,j+1,si,sums(j+1),visited,m,n,cnt);
    }
    int sums(int x)
    {
        int s=0;
        while(x!=0)
        {
            s+=x%10;
            x=x/10;
        }
        return s;
    }
};

解法二:bfs

思路:

 

复杂度计算:

时间复杂度O(nm)

空间复杂度O(nm)

代码:

class Solution {
public:
    int wardrobeFinishing(int m, int n, int cnt) {
        vector<vector<int>> visited(m,vector<int>(n));
        int res=0;
        queue<vector<int>> que;
        que.push({0,0,0,0});
        while(!que.empty())
        {
            vector<int> x=que.front();
            que.pop();
            int i=x[0],j=x[1],si=x[2],sj=x[3];
            if(i>=m||j>=n||si+sj>cnt||visited[i][j])
                continue;
            visited[i][j]=1;
            res++;
            que.push({i+1,j,sums(i+1),sj});
            que.push({i,j+1,si,sums(j+1)});
            
        }
        return res;
    }

    int sums(int x)
    {
        int s=0;
        while(x!=0)
        {
            s+=x%10;
            x=x/10;
        }
        return s;
    }
};


http://lihuaxi.xjx100.cn/news/1920475.html

相关文章

CSRF和SSRF原理、区别、防御方法

CSRF&#xff08;Cross-Site Request Forgery&#xff09;原理&#xff1a;CSRF是一种由攻击者构造形成&#xff0c;由服务端发起请求的一个安全漏洞。它是一种利用用户在已登录的网站中提交非法请求的行为&#xff0c;攻击者通过伪造用户提交的请求&#xff0c;将恶意请求发送…

FreeRTOS学习--56讲 软件定时器

软件定时器&#xff1a; 用户可自定义定时器的周期&#xff0c;当指定时间到达后调用回调函数&#xff0c;用户在回调函数中处理信息 硬件定时器: 芯片自带的定时器模块&#xff0c;精度高&#xff0c;能触发中断&#xff0c;用户在中断服务函数中处理信息 软件定时器…

oracle下载

前言&#xff1a; 官网上提供都是最新的什么19c 21c这些版本&#xff0c;我要的是 11g 12c 或者更老的 8i 9i 这些版本。 准备下载一个oracle12c 版本&#xff0c;但是找了很久&#xff0c;最终…详情请看下面 oracle 数据库版本介绍 Oracle数据库有多个长期支持版本&#x…

JAVA 如何实现多个资源服务器的同步?

在实现多个资源服务器的同步时&#xff0c;我们可以使用Java中的一些技术和工具。以下是一种可能的实现方式&#xff1a; 明确资源服务器同步的需求。假设我们有三个资源服务器&#xff0c;每个服务器上都存储了一些数据&#xff0c;我们需要确保这些数据在所有服务器上都是一…

兔子的序列

题目&#xff1a; 输入描述&#xff1a; 第一行一个整数 n&#xff0c;表示序列的长度。 第二行有 n 个整数 ai&#xff0c;表示序列中的 n 个数分别是多少。 输出描述&#xff1a; 输出仅一行&#xff0c;表示这个序列的名字&#xff0c;也就是这个序列中最大的非完全平方…

flutter flutter pub cache clean和flutter clean区别

flutter pub cache clean 和 flutter clean 是 Flutter 开发中两个不同的命令&#xff0c;它们的作用和使用场景有所不同。 flutter pub cache clean&#xff1a;这个命令用于清理 Flutter 的包缓存。在使用 Flutter 进行开发时&#xff0c;会下载和缓存一些第三方依赖包&#…

Linux压缩算法-zstd

文章目录 概述&#xff1a;ZSTD压缩算法介绍&#xff1a;ZSTD压缩算法下载&#xff1a;ZSTD压缩算法编译&#xff1a;1、ubuntu&#xff08;gcc编译&#xff09;&#xff1a;1.1、直接编译&#xff1a;1.2、编译库文件&#xff1a; 2、arm&#xff08;交叉编译库文件&#xff0…

【MYSQL】MYSQL 的学习教程(十)之 InnoDB 锁

数据库为什么需要加锁呢&#xff1f; 如果有多个并发请求存取数据&#xff0c;在数据就可能会产生多个事务同时操作同一行数据。如果并发操作不加控制&#xff0c;不加锁的话&#xff0c;就可能写入了不正确的数据&#xff0c;或者导致读取了不正确的数据&#xff0c;破坏了数…