蒟蒻的LeetCode刷题记录91~100

这篇博客记录了作者在LeetCode上刷题91至100的解题心得,重点讨论了递归与迭代解法在二叉树遍历和搜索树问题中的应用,包括二叉树的中序遍历、不同的二叉搜索树以及验证二叉搜索树等题目,其中提到迭代解法的一种通用机械式实现和利用栈的策略。
摘要由CSDN通过智能技术生成

91. 解码方法
在这里插入图片描述
在这里插入图片描述

class Solution {
   
public:
    int numDecodings(string s) {
   
        int n = s.size();
        s = ' ' + s;//为了方便,让下标从1开始,所以加上一个空格
        vector<int> f(n + 1);
        f[0] = 1;//0个数字是的解码方案算作1
        for (int i = 1; i <= n; i ++ ) {
   
            if (s[i] >= '1' && s[i] <= '9') f[i] += f[i - 1];
            if (i > 1) {
   
                int t = (s[i - 1] - '0') * 10 + (s[i] -'0');
                if (t >= 10 && t <= 26) f[i] += f[i - 2];
            }
        }
        return f[n];
    }
};

92. 反转链表 II
在这里插入图片描述

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
   
public:
    ListNode* reverseBetween(ListNode* head, int m, int n) {
   
        auto dummy = new ListNode(-1);
        dummy->next = head;
        auto a = dummy;

        for (int i = 0; i < m - 1; i ++ ) a = a->next;//前进m - 1步找到a点;
        auto b = a->next, c = b->next;//来反转m~n之间的链表
        for (int i = 0; i < n - m; i ++ ) {
   
            auto t = c->next;
            c->next = b;
            b = c, c = t;
        }
        
        a->next->next = c;//再将首尾相接
        a->next = b;

        return dummy->next;
    }
};

93. 复原IP地址
在这里插入图片描述

class Solution {
   
public:
    vector<string> ans;
    vector<string> restoreIpAddresses(string s) {
   
        dfs(s, 0, 0, "");
        return ans;
    }
    //u表示枚举到的字符串下标,k表示当前截断的IP个数,s表示原字符串
    void dfs(string&s, int u, int k, string path) {
   
        if (u == s.size()) {
   
            if (k == 4) {
   
                path.pop_back();//记得将上次搜索的最后一个点去掉
                ans.push_back(path);
            }
            return;
        }
        if (k > 4) return;//剪枝,多余4个就不搜了,没有这句会TLE

        for (int i = u, t = 0; i < s.size(); i ++ ) {
   
            if (i > u && s[u] == '0') break;  //至少有两位并且有前导0
            t = t * 10 + s
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值