leetcode1306.跳跃游戏

  • 跳跃游戏
    -这里有一个非负整数数组 arr,你最开始位于该数组的起始下标 start 处。当你位于下标 i 处时,你可以跳到 i + arr[i] 或者 i - arr[i]。

  • 请你判断自己是否能够跳到对应元素值为 0 的 任一 下标处。

  • 注意,不管是什么情况下,你都无法跳到数组之外。

输入:arr = [4,2,3,0,3,1,2], start = 5
输出:true
解释:
到达值为 0 的下标 3 有以下可能方案: 
下标 5 -> 下标 4 -> 下标 1 -> 下标 3 
下标 5 -> 下标 6 -> 下标 4 -> 下标 1 -> 下标 3 

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/jump-game-iii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
  • 动态规划?
/******************************************************************************

Welcome to GDB Online.
  GDB online is an online compiler and debugger tool for C, C++, Python, PHP, Ruby, 
  C#, OCaml, VB, Perl, Swift, Prolog, Javascript, Pascal, COBOL, HTML, CSS, JS
  Code, Compile, Run and Debug online from anywhere in world.

*******************************************************************************/
#include <stdio.h>
#include<vector>
#include<memory>
#include<iostream>
using namespace std;
class Solution{
public:
    bool isreach = false;
    int ti = 1;//target_index
    
    
    
    
    void dfs(int start,vector<int>& visit,vector<int>& arr){
        if(isreach){//找到结果
            return;
        }
        if(visit[start]==1){//访问循环
            return;
        }
        if(start == ti){
            isreach = true;
        }else{
            visit[start] = 1;
            
            if(start+arr[start]<arr.size()){
               dfs(start+arr[start],visit,arr); 
            }
            
            if(start-arr[start]>-1){
              dfs(start-arr[start],visit,arr);  
            }
            
            
            visit[start] = 0;// 清楚当前路径的标记
        }
        
    }

    bool canReach(std::vector<int>& arr,int start){
        //正向:从5开始,进行2^n次方查找,设置是否访问标志
        for(int i=0;i<arr.size();i++){
            if(arr[i]==0){
                ti = i;
                cout<<"target index is "<<ti<<endl;
                break;
            }
        }
        vector<int> visit(arr.size());
        dfs(start,visit,arr);
        return isreach;
    }
};

int main()
{
    // vector<int> arr = {4,2,3,0,3,1,2};
    // int start = 5;
    vector<int> arr = {3,0,2,1,2};
    int start = 2;
    unique_ptr<Solution> mysolo = unique_ptr<Solution>(new Solution());
    bool res = mysolo->canReach(arr,start);
    cout<<res<<endl;
    return 0;
}


在这里插入图片描述

  • 修改一处即可
class Solution{
public:
    bool isreach = false;
    int ti = 1;//target_index
    
    
    
    
    void dfs(int start,vector<int>& visit,vector<int>& arr){
        if(isreach){//找到结果
            return;
        }
        if(visit[start]==1){//访问循环
            return;
        }
        if(arr[start] == 0){
            isreach = true;
        }else{
            visit[start] = 1;
            
            if(start+arr[start]<arr.size()){
               dfs(start+arr[start],visit,arr); 
            }
            
            if(start-arr[start]>-1){
              dfs(start-arr[start],visit,arr);  
            }
            
            
            visit[start] = 0;// 清楚当前路径的标记
        }
        
    }

    bool canReach(std::vector<int>& arr,int start){
        //正向:从5开始,进行2^n次方查找,设置是否访问标志
        vector<int> visit(arr.size());
        dfs(start,visit,arr);
        return isreach;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值