我正在开发一个程序,需要找出可以从给定数组形成的最大链。
示例:
比方说输入是:
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
链被重复了多次,有没有一种方法可以提高我的代码性能,以避免像上面这样不必要的类似循环。
答案 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);