LeetCode(63)UniquePath2

题目如下:

Follow up for "Unique Paths":
Now consider if some obstacles are added to the grids. How many unique paths would there be?
An obstacle and empty space is marked as 1 and 0 respectively in the grid.
For example,
There is one obstacle in the middle of a 3x3 grid as illustrated below.
[
  [0,0,0],
  [0,1,0],
  [0,0,0]
]
The total number of unique paths is 2.
Note: m and n will be at most 100.

分析如下:

采用和上一题 Unique Path类似的思路(思路一,动态规划),额外增加一个条件判断:如果obstacleGrid[i][j]==1,则说明有障碍,不能在(i,j)点累计路径条数,否则,在(i,j)点累积的路径条数为(i-1,j)和(i,j-1)的路径条数之和。

我的代码:

//12ms过大集合
class Solution {
public:
    int uniquePathsWithObstacles(vector<vector<int> > &obstacleGrid) {
        int length_max=(int)obstacleGrid.size();
        if(length_max==0)
            return 0;
        int length_min=(int)obstacleGrid[0].size();
        if(length_min==0)
            return 0;
        vector<int> res_vec(length_min,0);
        if(obstacleGrid[0][0]==1)
            return 0;
        res_vec[0]=1;
        for(int i=1;i<length_min;i++)
            if(res_vec[i-1]!=0&&obstacleGrid[0][i]==0)
                res_vec[i]=1;
        for(int i=1;i<length_max;i++){
            if(res_vec[0]!=0&&obstacleGrid[i][0]==0)
                res_vec[0]=1;
            else
                res_vec[0]=0;
            for(int j=1;j<length_min;j++){
                if(obstacleGrid[i][j]==1)
                    res_vec[j]=0;
                else
                    res_vec[j]+=res_vec[j-1];
            }
        }
        return res_vec[length_min-1];
    }
};

小结如下:

(1) 上一题Unique Path1中使用了组合数学的方法来解答,其实不太适合本题,因为数学公式没法明确给出。上一题也尝试使用了递归的办法,提交超时,本题使用递归,依然提交超时,递归确实开销比较大了。
(2) 之前遇到过相似的迷宫问题,当时使用了堆栈或者队列来解决,所以这个问题我也尝试着使用队列去解决。发现,当输入的obstacleGrid矩阵比较小的时候,还不会超时,当输入的obstacleGrid矩阵较大(如20*30)时,就超时了。是否说明队列的办法不适合这个场景?队列的办法更适合找到一条合适的路径,而不是计算一共有多少合适的路径?

这是使用队列方法却超时的代码,不知道有没有什么更好的办法可以使得虽然使用队列但是却不超时呢?

//使用队列方法却超时的代码
    int uniquePathsWithObstacles(vector<vector<int> > &obstacleGrid) {
        if(obstacleGrid.size()==0)
            return 0;
        if(obstacleGrid[0].size()==0)
           return 0;
        int row_limit=(int)obstacleGrid.size()-1;
        int col_limit=(int)obstacleGrid[0].size()-1;
        GRID_NODE node1={0,0};
        int path_count=0;
        queue<GRID_NODE> que;
        que.push(node1);
        while(!que.empty()){
            GRID_NODE tmp_node=que.front();
//            std::cout<<"tmp_node.x="<<tmp_node.x<<"tmp_node.y="<<tmp_node.y<<std::endl;
            que.pop();
            if((tmp_node.x+1<=row_limit)&&(obstacleGrid[tmp_node.x+1][tmp_node.y]!=1))
                que.push({tmp_node.x+1, tmp_node.y});
            if((tmp_node.y+1<=col_limit)&&(obstacleGrid[tmp_node.x][tmp_node.y+1]!=1))
                que.push({tmp_node.x, tmp_node.y+1});
            if((tmp_node.x==row_limit)&&(tmp_node.y==col_limit))
                path_count++;
        }
        return path_count;
    }


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
智慧校园整体解决方案是响应国家教育信息化政策,结合教育改革和技术创新的产物。该方案以物联网、大数据、人工智能和移动互联技术为基础,旨在打造一个安全、高效、互动且环保的教育环境。方案强调从数字化校园向智慧校园的转变,通过自动数据采集、智能分析和按需服务,实现校园业务的智能化管理。 方案的总体设计原则包括应用至上、分层设计和互联互通,确保系统能够满足不同用户角色的需求,并实现数据和资源的整合与共享。框架设计涵盖了校园安全、管理、教学、环境等多个方面,构建了一个全面的校园应用生态系统。这包括智慧安全系统、校园身份识别、智能排课及选课系统、智慧学习系统、精品录播教室方案等,以支持个性化学习和教学评估。 建设内容突出了智慧安全和智慧管理的重要性。智慧安全管理通过分布式录播系统和紧急预案一键启动功能,增强校园安全预警和事件响应能力。智慧管理系统则利用物联网技术,实现人员和设备的智能管理,提高校园运营效率。 智慧教学部分,方案提供了智慧学习系统和精品录播教室方案,支持专业级学习硬件和智能化网络管理,促进个性化学习和教学资源的高效利用。同时,教学质量评估中心和资源应用平台的建设,旨在提升教学评估的科学性和教育资源的共享性。 智慧环境建设则侧重于基于物联网的设备管理,通过智慧教室管理系统实现教室环境的智能控制和能效管理,打造绿色、节能的校园环境。电子班牌和校园信息发布系统的建设,将作为智慧校园的核心和入口,提供教务、一卡通、图书馆等系统的集成信息。 总体而言,智慧校园整体解决方案通过集成先进技术,不仅提升了校园的信息化水平,而且优化了教学和管理流程,为学生、教师和家长提供了更加便捷、个性化的教育体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值