写DFS的加速写法

题目
题目1

1. 递归函数里自带字符串,字符串长度不能过长。

两种不同的写法,第一种就TLE(time limited error),第二种才可以,不知道为啥,我推测和dfs的深度有关,如果深度在100以内我觉得都是可以用的,超过的话最好用第一种。因为第二种写法相当于当字符串长度为100之后,每次调用一次,都要重新构造一个字符串,相当于乘了100。
具体讲解:

str = str+"R";
str += "R";

这两种写法的时间复杂度是不一样的,如果str的长度为n,“R”的长度为1,那么第一种写法的时间为O(n),而第二种为O(1)
str =str+ "R"加的运算产生的是一个新的对象,再把结果返回,而str += “R” 涉及到的应该是对象的引用,操作之后直接返回引用,避免了产生新的对象。

class Solution {
    string st_str,end_str;
    bool flag1 = false,flag2 = false;
public:
    string getDirections(TreeNode* root, int startValue, int destValue) {
        dfs(root,startValue,destValue);
        // cout<<st_str<<" "<<end_str;
        int n = st_str.size(),i;
        int n2 = end_str.size();
        // cout<<n<<endl;
        
        for(i = 0;i<n && i<n2;i++){
            if(st_str[i] != end_str[i]){
                break;
            }
        }
        
        string ret(n-i,'U');
        ret += end_str.substr(i);
        return ret;
    }
private:
    string tmp;
    void dfs(TreeNode* root,int val1,int val2){
        if(root == nullptr) return;
        if(flag1 && flag2)  return;
        if(root->val == val1){
            flag1 = true;
            st_str = tmp;
        }else if(root->val == val2){
            flag2 = true;
            end_str = tmp;
        }
        
        tmp +='L';
        dfs(root->left,val1,val2);
        tmp.pop_back();
        
        tmp+="R";
        dfs(root->right,val1,val2);
        tmp.pop_back();
 
    }
};

第二种写法

class Solution {
    string st_str,end_str;
    bool flag1 = false,flag2 = false;
public:
    string getDirections(TreeNode* root, int startValue, int destValue) {
        dfs(root,startValue,destValue,"");
        // cout<<st_str<<" "<<end_str;
        int n = st_str.size();
        int n2 = end_str.size();
        // cout<<n<<endl;
        int i = 0, j = 0;
        while(st_str[i] == end_str[j])  i++,j++;
        return string(st_str.size()-i,'U')+end_str.substr(j);
        // for(i = 0;i<n && i<n2;i++){
        //     if(st_str[i] != end_str[i]){
        //         break;
        //     }
        // }
        
        string ret(n-i,'U');
        ret += end_str.substr(i);
        return ret;
    }
private:
    void dfs(TreeNode* root,int val1,int val2,string tmp){
        if(flag1 && flag2)  return;
        if(root == nullptr){
            return;
        }else{
            if(root->val == val1){
                flag1 = true;
                st_str = tmp;
            }else if(root->val == val2){
                flag2 = true;
                end_str = tmp;
            }
            dfs(root->left,val1,val2,tmp+"L");
            dfs(root->right,val1,val2,tmp+"R");
        }
        
    }
};

2. 递归的结束条件最好是写在下面的循环中开始出现分叉的时候,如果写在刚刚进入递归的时候,那么每次进来都要判断一下,其实不需要每次进来都判断的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值