美文网首页
LeetCode 91-95

LeetCode 91-95

作者: 1nvad3r | 来源:发表于2020-10-09 10:47 被阅读0次

91. Decode Ways

分析:

使用动态规划,dp[i] 代表到字符串索引i为止的字符串的解码方法数。
边界条件:比如只要s[0] != 0, dp[0] = 1。还需要在代码中体现出dp[-1] = 1。
转移方程

  1. 若s[i] = '0'
          若s[i-1] = '1' 或 '2',则dp[i] = dp[i-2]
          若s[i-1] != '1' 或 '2', 则 return 0
  2. 若'1' <= s[i] <= '6'
          若s[i-1] = '1' 或 '2',则dp[i] = dp[i-1] + dp[i-2]
          若s[i-1] != '1' 或 '2',则dp[i] = dp[i-1]
  3. 若'7' <= s[i] <= '9'
          若s[i-1] = '1' , 则dp[i] = dp[i-1] + dp[i-2]
          若s[i-1] != '1' ,则dp[i] = dp[i-1]
Java:
class Solution {
    public int numDecodings(String s) {
        if ("".equals(s) || s.charAt(0) == '0') {
            return 0;
        }
        int[] dp = new int[s.length()];
        dp[0] = 1;
        for (int i = 1; i < s.length(); i++) {
            if (s.charAt(i) == '0') {
                if (s.charAt(i - 1) == '0' || s.charAt(i - 1) >= '3') {
                    return 0;
                } else {
                    dp[i] = i - 2 >= 0 ? dp[i - 2] : 1;
                }
            } else if (s.charAt(i) >= '1' && s.charAt(i) <= '6') {
                if (s.charAt(i - 1) == '0') {
                    dp[i] = dp[i - 1];
                } else if (s.charAt(i - 1) >= '1' && s.charAt(i - 1) <= '2') {
                    dp[i] = (i - 2 >= 0 ? dp[i - 2] : 1) + dp[i - 1];
                } else {
                    dp[i] = dp[i - 1];
                }
            } else if (s.charAt(i) >= '7') {
                if (s.charAt(i - 1) == '1') {
                    dp[i] = (i - 2 >= 0 ? dp[i - 2] : 1) + dp[i - 1];
                } else {
                    dp[i] = dp[i - 1];
                }
            }
        }
        return dp[s.length() - 1];
    }
}

92. Reverse Linked List II

分析:

使用头插法,先找到mLeft和p,mLeft代表第m个结点左边的那一个结点,p代表第m个结点。
然后遍历n-m次,每次使用pNext记录p的下一个结点,将这个pNext头插到mLeft结点后面去,p指向pNext的下一个结点,pNext指向mLeft的下一个结点,然后把mLeft的下一个结点指向pNext。
遍历完之后就实现了反转。

Java:
class Solution {
    public ListNode reverseBetween(ListNode head, int m, int n) {
        ListNode dummy = new ListNode(0);
        dummy.next = head;
        ListNode mLeft = dummy, p = dummy.next;
        int count = 0;
        while (count < m - 1) {
            mLeft = mLeft.next;
            p = p.next;
            count++;
        }
        for (int i = 0; i < n - m; i++) {
            ListNode pNext = p.next;
            p.next = p.next.next;
            pNext.next = mLeft.next;
            mLeft.next = pNext;
        }
        return dummy.next;
    }
}

93. Restore IP Addresses

class Solution {
    List<String> res = new ArrayList<>();
    List<String> temp = new ArrayList<>();

    public void dfs(int begin, String s) {
        if (temp.size() > 4) {
            return;
        }
        if (begin == s.length() && temp.size() == 4) {
            StringBuilder sb = new StringBuilder();
            for (String str : temp) {
                sb.append(str + ".");
            }
            sb.deleteCharAt(sb.length() - 1);
            res.add(sb.toString());
        }

        for (int i = begin; i < begin + 3 && i < s.length(); i++) {
            String sub = s.substring(begin, i + 1);
            if (sub.length() > 1 && sub.charAt(0) == '0') {
                continue;
            }
            if (sub.length() == 3 && Integer.parseInt(sub) > 255) {
                continue;
            }
            temp.add(sub);
            dfs(i + 1, s);
            temp.remove(temp.size() - 1);
        }
    }

    public List<String> restoreIpAddresses(String s) {
        dfs(0, s);
        return res;
    }
}

94. 二叉树的中序遍历

class Solution {
    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> res = new ArrayList<>();
        Deque<TreeNode> stack = new ArrayDeque<>();
        while (root != null || !stack.isEmpty()) {
            while (root != null) {
                stack.push(root);
                root = root.left;
            }
            root = stack.pop();
            res.add(root.val);
            root = root.right;
        }
        return res;
    }
}

95. 不同的二叉搜索树 II

class Solution {
    public List<TreeNode> helper(int start, int end) {
        List<TreeNode> res = new ArrayList<>();
        if (start > end) {
            res.add(null);
            return res;
        }
        for (int i = start; i <= end; i++) {
            List<TreeNode> left = helper(start, i - 1);
            List<TreeNode> right = helper(i + 1, end);
            for (TreeNode l : left) {
                for (TreeNode r : right) {
                    TreeNode root = new TreeNode(i);
                    root.left = l;
                    root.right = r;
                    res.add(root);
                }
            }
        }
        return res;
    }


    public List<TreeNode> generateTrees(int n) {
        if (n < 1) {
            return new ArrayList<>();
        }
        return helper(1, n);
    }
}

相关文章

  • LeetCode 91-95

    91. Decode Ways[https://leetcode-cn.com/problems/decode-w...

  • 91-95

    91 人类在建造新的巴别塔时,同时在头顶铸造了一把达摩克利斯之剑。 92 工厂里忙碌的人们比动物更像动物。 93 ...

  • 91-95

    91讲:流程再造|跌落神坛的好理论092讲:功能聚合|看看你的办公室合理么?093讲:资源聚合|挖人都不用搬家09...

  • 诗篇91-95

    诗篇 第91篇 住在至高者隐密处的,必住在全能者的荫下。我要论到耶和华说:“他是我的避难所,是我的山寨,是我的上帝...

  • 你想瘦的决心决定了减肥的成败

    个人经验,我觉得无论男女瘦身成功都是一次脱胎换骨。 我161,以前110+,现在91-95斤波动,没有任何狗血的情...

  • 读《100个基本》有感-最基本的也是最有意义的(19)

    这篇文章是“100个基本”有感系列第十九篇,将记录91-95条“基本”的感悟。 091 是生活而不是工作让我们之所...

  • 1000 lucky moments | 91-95

    May 22nd. 1.嘉颐哥带我去吃一家老字号快餐,我吃了个双拼,肉饼拼扣肉。很神奇的是,我发现,明明是同一道快...

  • 英语口语 91-95

    1. get upset about sth 因某事而难过 be upset to do sth 因做某事而沮丧 ...

  • 少儿编程游戏CodeMonkey通关攻略:第91-95关

    今天我们一起玩until循环的第91-95关。 第91关 我们来看看这一关的画面。 在左侧的画面框里,小老鼠面向火...

  • week 2019-06-23

    LeetCode 16[M] LeetCode 17[M] LeetCode 926

网友评论

      本文标题:LeetCode 91-95

      本文链接:https://www.haomeiwen.com/subject/twgcpktx.html