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 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 【LeetCode - Java】22. 括号生成(中等) -> 正文阅读

[数据结构与算法]【LeetCode - Java】22. 括号生成(中等)

1. 题目描述

在这里插入图片描述

2. 解题思路

简单的中等题喜加一!当然前提是你已经做过了【LeetCode - Java】17. 电话号码的字母组合(中等)这道题,两道题的本质思想还是一样的,生成符合规则的字符串,而我个人认为这道题比那道题更进一步,多了一个规则判断(是否合规括号)。

借鉴DFS的思想,我们这道题可以利用StringBuilder进行回溯生成目标字符串。要注意的地方只有一个:合规括号在数理上如何表示呢?根据我们的经验不难发现,在有效括号中任意位置截断,前半部分的左括号数量总是大于等于右括号数量的,那么我们就可以利用这一点在生成括号的过程中控制右括号是否可以加入字符串中。那左括号呢?没有限制,只要不超过限定值都可以把他加进去。

3. 代码实现

3.1 DFS回溯

private final LinkedList<String> list = new LinkedList<>();
    private final StringBuilder sb = new StringBuilder("(");
    private int left_count = 1, right_count = 0;

    @Override
    public List<String> generateParenthesis(int n) {
        buildString(1, n);
        return list;
    }

    public void buildString(int index, int n) {
        if (index == 2 * n) {
            list.add(sb.toString());
            return;
        }
        if (right_count < left_count) {
            right_count++;
            sb.append(")");
            buildString(index + 1, n);
            sb.deleteCharAt(index);
            right_count--;
        }
        if (left_count < n) {
            left_count++;
            sb.append("(");
            buildString(index + 1, n);
            sb.deleteCharAt(index);
            left_count--;
        }
    }

在这里插入图片描述

3.2 小改进+对比

上述想法在实现的过程中返回的List我是使用了LinkedList进行构造的,为什么不选用ArrayList呢?最初想法是ArrayList底层是由数组实现,增加或删除元素需要进行数组的新建复制,可能会影响时间与空间表现,因此选用了底层实现为链表LinkedList。结果发现LinkedList的时间没有达到最优的表现,出于好奇试了一下ArrayListfine竟然表现更好了,颠覆了我的认知判断!有知道为啥的大佬可以在评论区留下你们的看法。

private final ArrayList<String> list = new ArrayList<>();

在这里插入图片描述

话说回来,时间复杂度是多少呢?这道题目的迭代与循环都是为了生成字符串,时间复杂度的计算是与生成字符串的数量挂钩的,这里涉及相对复杂的计算证明(我也搞不出来),官解所表示的时间复杂度为O( 4 n / n 4^n/\sqrt{n} 4n/n ?)

对于空间复杂度就好分析多了,主要的额外空间消耗是递归迭代所需要的的深度,显然深度为2n,因此空间复杂度为O(n)
在这里插入图片描述

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-03-06 13:22:01  更:2022-03-06 13:23: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年11日历 -2024/11/28 21:50:13-

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