LinkedList 与 ArrayList

时间:2021-01-24 05:12:27

标签: java arraylist data-structures linked-list dynamic-programming

我遇到了从给定的一对括号返回有效括号字符串的问题。例如。如果 n=2,我必须返回一个有效序列的列表,即 ["()()", "(())"]。如果问题不是很清楚,不用担心,因为我的疑问比较笼统。

我使用动态编程来寻找解决方案。 list(list) 存储任何对 k 的有效序列列表。列表(lists) 存储来自0<=k<=n 的所有此类列表。我采用了两种方法,改动很小。 解决 1 -

public List<String> generateParenthesis(int n) {
        List<List<String>> lists = new ArrayList<>();
        lists.add(Collections.singletonList(""));
        
        for (int i=1; i<=n; i++) {
            List<String> list = new ArrayList<>();
            for (int j=0; j<i; j++) {
                for (String first : lists.get(j)) {
                    for (String second : lists.get(i-1-j)) 
                        list.add("(" + first + ")" +second);
                }
            }
            lists.add(list);
        }
        return lists.get(lists.size()-1);

Soln 2-

public List<String> generateParenthesis(int n) {
        List<List<String>> lists = new ArrayList<>();
        lists.add(Collections.singletonList(""));
        
        for (int i=1; i<=n; i++) {
            List<String> list = new LinkedList<>();
            for (int j=0; j<i; j++) {
                for (String first : lists.get(j)) {
                    for (String second : lists.get(i-1-j)) 
                        list.add("(" + first + ")" +second);
                }
            }
            lists.add(list);
        }
        return lists.get(lists.size()-1);

它们之间唯一的区别是 list(list) 在第一种情况下是 ArrayList,在第二种情况下是 LinkedList。根据他们在 oracle 站点上的 API 描述,对于这两种实现,添加操作需要恒定的时间,并且与 LinkedList 实现相比,ArrayList 的常量因子较低。我希望我的第一个解决方案更快,但实际上它是第二个。

PS - 我在 leetcode 上尝试了这个问题,所以他们有一个 1<=n<=8 的示例测试用例列表。

谁能解释一下原因?

0 个答案:

没有答案
相关问题