(乱刷题系列)leetcode1345跳跃游戏

1345. 跳跃游戏 IV - 力扣(LeetCode)

 第一眼看过去还以为是dp,然后写了个WA代码

class Solution {
public:
    int minJumps(vector<int>& arr) {
    unordered_map<int,vector<int>>mp;
    for(int i=0;i<arr.size();i++)
        mp[arr[i]].push_back(i);
    int f[110000];
    memset(f,0x3f,sizeof f);
    f[0]=0;
    for(int i=0;i<arr.size();i++)
    {
        if(i-1>=0)f[i]=min(f[i-1]+1,f[i]);
        if(i+1<arr.size())f[i]=min(f[i],f[i+1]+1);
        if(mp[arr[i]].size()>1)
        {
            for(auto t:mp[arr[i]])
            {
                if(t!=i)f[i]=min(f[i],f[t]+1);
            }
        }
    }
      return f[arr.size()-1];
    }
};

WA代码看看就好

发现了如果是dp的话没有后效性,所以不是dp。

然后又想了想这题可以用bfs来写

首先将所有元素的下标存在哈希表里,然后bfs即可

const int N=110000;
class Solution {
public:
    int minJumps(vector<int>& arr) {
     unordered_map<int,vector<int>>mp;//哈希表用于存储相同元素的下标
     int dist[N];//最小的操作次数
     memset(dist,0x3f,sizeof dist);
     dist[0]=0;
    for(int i=0;i<arr.size();i++)
        mp[arr[i]].push_back(i);//将元素下标放入哈希表里
    bool st[N];//判重数组判断当前位置是否走过
    queue<int>q;
    q.push(0);
    memset(st,0,sizeof st);
    st[0]=true;

    while(q.size())
    {
        auto t=q.front();
        q.pop();

       if(t==arr.size()-1)return dist[arr.size()-1];

        if(t+1<arr.size()&&!st[t+1]&&dist[t+1]>dist[t]+1)
        {
            dist[t+1]=dist[t]+1;
            q.push(t+1);
            st[t+1]=true;
        }
        if(t-1>=0&&!st[t-1]&&dist[t]+1<dist[t-1])
        {
            dist[t-1]=dist[t]+1; 
            q.push(t-1);
            st[t-1]=true;
        }
        

        if(mp[arr[t]].size()>1)
        {
            for(auto i:mp[arr[t]])//遍历这个数组中相同元素
            {
                if(i!=t&&!st[i]&&dist[t]+1<dist[i])
                {
                    dist[i]=dist[t]+1;
                    q.push(i);
                    st[i]=true;
                }

            }
        }
    }

    return dist[arr.size()-1];
    }
};

然后会发现被卡,然后对其进行优化,优化思路就是一个元素只入队一次

const int N=110000;
class Solution {
public:
    int minJumps(vector<int>& arr) {
     unordered_map<int,vector<int>>mp;
     unordered_map<int,bool>s2;
     int dist[N];
     memset(dist,0x3f,sizeof dist);
     dist[0]=0;
    for(int i=0;i<arr.size();i++)
    {
        mp[arr[i]].push_back(i);
        s2[arr[i]]=false;
    }
    bool st[N];
    queue<int>q;
    q.push(0);
    memset(st,0,sizeof st);
    st[0]=true;

    while(q.size())
    {
        auto t=q.front();
        q.pop();

       if(t==arr.size()-1)return dist[arr.size()-1];

        if(t+1<arr.size()&&!st[t+1]&&dist[t+1]>dist[t]+1)
        {
            dist[t+1]=dist[t]+1;
            q.push(t+1);
            st[t+1]=true;
        }
        if(t-1>=0&&!st[t-1]&&dist[t]+1<dist[t-1])
        {
            dist[t-1]=dist[t]+1; 
            q.push(t-1);
            st[t-1]=true;
        }
        
        if(s2[arr[t]])continue;

        if(mp[arr[t]].size()>1)
        {
            for(auto i:mp[arr[t]])
            {
                if(s2[arr[t]])continue;
                if(i!=t&&!st[i]&&dist[t]+1<dist[i])
                {
                    dist[i]=dist[t]+1;
                    q.push(i);
                    st[i]=true;
                }

            }
        }
        s2[arr[t]]=true;
    }

    return dist[arr.size()-1];
    }
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在CLion中配置刷LeetCode题目的环境,你可以按照以下步骤操作: 1. 下载安装CLion:首先确保你已经将CLion安装在你的电脑上。你可以从JetBrains的官方网站下载适用于你操作系统的版本。 2. 创建新项目:打开CLion,选择"Create New Project"来创建一个新的C++项目。 3. 配置编译器:在项目配置界面,选择C++编译器(如GCC或Clang)。确保你已经正确安装了所选编译器,并且CLion能够找到它。 4. 配置CMakeLists.txt:在项目目录下,找到名为CMakeLists.txt的文件,并将其打开。在这个文件中,你需要添加一些配置来链接LeetCode的测试框架。 5. 添加测试框架:在CMakeLists.txt文件中,添加以下代码来链接Google Test(LeetCode使用该框架进行测试): ```cmake # 导入Google Test include(FetchContent) FetchContent_Declare( googletest URL https://github.com/google/googletest/archive/609281088cfefc76f9d0ce82e1ff6c30cc3591e5.zip ) set(gtest_force_shared_crt ON CACHE BOOL "" FORCE) FetchContent_MakeAvailable(googletest) # 添加测试目录 enable_testing() add_subdirectory(test) ``` 6. 创建测试目录:在项目的根目录下,创建一个名为"test"的文件夹,并在该文件夹中创建一个名为"main.cpp"的文件。 7. 编写测试代码:在"main.cpp"文件中,编写你的测试代码。你可以使用Google Test提供的宏来定义测试用例和断言。 8. 运行测试:在CLion的顶部菜单栏,选择"Run" > "Edit Configurations"。在弹出的对话框中,点击"+"按钮添加一个新的运行配置。选择"C++ Google Test"作为运行器,并设置好相关参数。 9. 运行测试:保存配置后,点击运行按钮(绿色的三角形图标)来运行你的测试用例。CLion将执行你的代码,并显示测试结果。 这样,你就可以在CLion中配置LeetCode题目的环境并进行刷题了。记得根据具体需求修改和调整配置,以适应不同题目的要求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值