IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 力扣day21 -> 正文阅读

[数据结构与算法]力扣day21

91. 解码方法

动态规划,爬楼梯

     public static int numDecodings(String s) {
        int n = s.length();
        s = " " + s;
        char[] cs = s.toCharArray();
        int[] f = new int[n + 1];
        f[0] = 1;
        for (int i = 1; i <= n; i++) {
            // a : 代表「当前位置」单独形成 item
            // b : 代表「当前位置」与「前一位置」共同形成 item
            int a = cs[i] - '0', b = (cs[i - 1] - '0') * 10 + (cs[i] - '0');
            // 如果 a 属于有效值,那么 f[i] 可以由 f[i - 1] 转移过来
            if (1 <= a && a <= 9) f[i] = f[i - 1];
            // 如果 b 属于有效值,那么 f[i] 可以由 f[i - 2] 或者 f[i - 1] & f[i - 2] 转移过来
            if (10 <= b && b <= 26) f[i] += f[i - 2];
        }
        return f[n];
     }

在这里插入图片描述

92.反转链表2

头插法

    public ListNode reverseBetween(ListNode head, int left, int right) {
        ListNode node=new ListNode();
        node.next=head;
        ListNode i=node;
        ListNode j=node.next;
        //找到插入头和第一个交换的元素
        for (int step = 0; step < left-1; step++) {
            i=i.next;
            j=j.next;
        }
        // 1 2 3 4 5
        for (int k = 0; k < right-left; k++) {
            ListNode nextNode=j.next;   // next=3
            j.next=j.next.next;     //2->4
            nextNode.next=i.next;   //3->2
            i.next=nextNode;        //1->3   1 3 2 4 5 
        }
        return node.next;
    }

在这里插入图片描述

93.复原IP地址

        List<String> result = new ArrayList<>();

        public List<String> restoreIpAddresses(String s) {
            if (s.length() > 12) return result; // 算是剪枝了
            backTrack(s, 0, 0);
            return result;
        }

        // startIndex: 搜索的起始位置, pointNum:添加逗点的数量
        private void backTrack(String s, int startIndex, int pointNum) {
            if (pointNum == 3) {// 逗点数量为3时,分隔结束
                // 判断第四段?字符串是否合法,如果合法就放进result中
                if (isValid(s,startIndex,s.length()-1)) {
                    result.add(s);
                }
                return;
            }
            for (int i = startIndex; i < s.length(); i++) {
                if (isValid(s, startIndex, i)) {
                    s = s.substring(0, i + 1) + "." + s.substring(i + 1);    //在str的后?插??个逗点
                    pointNum++;
                    backTrack(s, i + 2, pointNum);// 插?逗点之后下?个?串的起始位置为i+2
                    pointNum--;// 回溯
                    s = s.substring(0, i + 1) + s.substring(i + 2);// 回溯删掉逗点
                } else {
                    break;
                }
            }
        }

        // 判断字符串s在左闭?闭区间[start, end]所组成的数字是否合法
        private Boolean isValid(String s, int start, int end) {
            if (start > end) {
                return false;
            }
            if (s.charAt(start) == '0' && start != end) { // 0开头的数字不合法
                return false;
            }
            int num = 0;
            for (int i = start; i <= end; i++) {
                if (s.charAt(i) > '9' || s.charAt(i) < '0') { // 遇到?数字字符不合法
                    return false;
                }
                num = num * 10 + (s.charAt(i) - '0');
                if (num > 255) { // 如果?于255了不合法
                    return false;
                }
            }
            return true;
        }

95.不同的二叉搜索树

太抽象了,如果换成别的可能好想,树结构这么看抽象了

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

    private List<TreeNode> generateTrees(int start, int end) {
        List<TreeNode> curRes = new LinkedList<>();
        if (start > end) {
            curRes.add(null);
            return curRes;
        }
        for (int i = start; i <= end; i++) {
            List<TreeNode> leftNodeList = generateTrees(start, i - 1);
            List<TreeNode> rightNodeList = generateTrees(i + 1, end);

            for (TreeNode leftNode : leftNodeList) {
                for (TreeNode rightNode : rightNodeList) {
                    curRes.add(new TreeNode(i, leftNode, rightNode));
                }
            }
        }

        return curRes;
    }

在这里插入图片描述

96.不同的二叉搜索树

    public int numTrees(int n) {
        if (n <= 2) return n;
        int[] dp = new int[n + 1];
        dp[0] = 1;
        dp[1] = 1;
        dp[2] = 2;
        for (int i = 3; i <= n; i++) {
            for (int j = 1; j <= i; j++) {
                //一共i个结点,除去自身还有i-1个
                dp[i] += dp[j - 1] * dp[i - j];
            }
        }
        return dp[n];
    }

在这里插入图片描述

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-07-22 14:26:57  更:2021-07-22 14:28:05 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/20 17:43:11-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码