查找数组中元素的最大长度

时间:2018-11-21 18:19:52

标签: java

我正在开发一个程序,需要找出可以从给定数组形成的最大链。

示例:

比方说输入是:

Arr[0] = 5
Arr[1] = 4
Arr[2] = 0
Arr[3] = 3
Arr[4] = 1
Arr[5] = 6
Arr[6] = 2

现在,如果我获取数组索引和相应的值,则我可以形成的最大链数为

索引5的值为5->索引5的值为6->索引6的值为2->索引2的值为0。此循环重复进行,因此这是我可以使用此数组形成的最大链数

这是我的代码:

public static int getMax(int[] nums) {
        int result = 0;
        for (int i = 0; i < nums.length; i++) {
            List<Integer> list = new ArrayList<>();
            list.add(i);
            int temp = i;
            while (true) {
                int next = nums[temp];
                if (list.contains(next)) {
                    break;
                } else {
                    list.add(next);
                    temp = next;
                }
            }
            result = Math.max(result, list.size());
        }
        return result;
    }

我已经提出了上述逻辑,但是我发现在我的代码中我试图找到多个相同类型的链。

这意味着如果我打印我的列表,它将具有以下值:

[0, 5, 6, 2]
[1, 4]
[2, 0, 5, 6]
[3]
[4, 1]
[5, 6, 2, 0]
[6, 2, 0, 5]

这里0,5,6,2链被重复了多次,有没有一种方法可以提高我的代码性能,以避免像上面这样不必要的类似循环。

3 个答案:

答案 0 :(得分:2)

您可以通过检查数组中是否已包含每个获得的值来将其放入数组。然后,当您迭代所填充的数组中的数字时,可以使用continue

忽略该迭代

答案 1 :(得分:1)

您可以通过两种方式进行操作:可以列出使用的索引,也可以创建其他布尔数组,然后可以在其中标记是否选择了该索引。第二种方法更好,因为您不会使用很多额外的内存,而且运行速度也更快。但是第二种方法需要初始化,而第一种方法则不需要初始化。

答案 2 :(得分:1)

每条链都是有方向的。然后,您有一个Graph(v,e),其中每个索引分别为v,一对e(v1, v2)对,因此存在A[v1]=v2。然后,您可以将路径标识为一组e。因此,您可以检查是否已经覆盖了存储已覆盖的每个e的路径,并再次将它们与新路径进行比较。

赞:

    int[] nums = new int[]{5,4,0,3,1,6,2};
    int result = 0;
    List<String> coveredE = new ArrayList<>();
    for (int i = 0; i < nums.length; i++) {
        List<Integer> list = new ArrayList<>();
        list.add(i);
        int temp = i;
        // avoid covered edges
        if(coveredE.contains("("+temp+","+nums[temp]+")")) continue;
        while (true) {
            int next = nums[temp];
            // store covered edges
            coveredE.add("("+temp+","+next+")");
            if (list.contains(next)) {
                break;
            } else {
                list.add(next);
                temp = next;
            }
        }
        System.out.println(list);
        result = Math.max(result, list.size());
    }
    System.out.println(result);
相关问题