我已经陷入了这个问题一段时间了。目标是返回最长重复序列的Arraylist。如果我有
int[][] a = {{ 1, 1, 3, 4 }
{ 2, 2, 2, 1}
{ 3, 3, 3, 3}
{ 0, 0, 1, 1}};
方法longestSequence()
应返回[3,3,3,3]
的Arraylist,因为3
具有最长的序列。我只能水平找到序列。请你告诉我我做错了什么?
int[][] a = {{ 1, 1, 3, 4 }
{ 2, 2, 2, 1}
{ 3, 3, 3, 3}
{ 0, 0, 1, 1}};
public List<Integer> longestSequence(int[][]a){
int count = 1, max = 1;
List<Integer> list = new ArrayList<Integer>();
for (int i = 0; i < a.length; i++)
for(int j = 1; j < a[i].length; j++) {
if (a[i][j] >= a[i][j-1]) {
count++;
list.add(a[i][j]);
} else {
if (count > max) {
max = count;
}
list.clear();
count = 1;
}
}
return list;
}
答案 0 :(得分:2)
问题似乎是您未正确清除列表,并且您没有将最佳列表保留为要返回的值。
您可以保留maxList
,与长度为max
的游戏相对应的元素列表:
max = count; maxList = new ArrayList<>(list);
不要简单地使用maxList = list
,因为list.clear()
电话会将其清除。
或者,保持元素的值在最长的运行中(例如3),然后在长度为max
的末尾构建一个列表,其中所有元素都是例如3。
int bestValue = -1;
int bestLength = 0;
for (int i = 0; i < a.length; ++i) {
int[] row = a[i];
int j = 0;
while (j < row.length) {
int start = j++;
while (j < row.length && row[j] == row[start]) j++;
if (j-start > bestLength) {
bestLength = j - start;
bestValue = row[start];
}
}
}
return Collections.nCopies(bestLength, bestValue);
答案 1 :(得分:0)
您的实施存在一些问题。因此,除了创建二维数组之外,即使当前序列不是最大序列,也会保持覆盖结果列表。因此,为了解决这个问题,请保留一个本地arrayList来保存当前序列,并且只有当它超过最大值时才将其分配给结果。
int[][] a = {{ 1, 1, 3, 4 },
{ 2, 2, 2, 1},
{ 3, 3, 3, 3},
{ 0, 0, 1, 1}};
public List<Integer> longestSequence(int[][]a){
int count = 1, max = 1;
List<Integer> result = new ArrayList<Integer>();
for (int i = 0; i < a.length; i++) {
List<Integer> current = new ArrayList<Integer>();
for(int j = 1; j < a[i].length; j++) {
if (a[i][j] >= a[i][j-1]) {
count++;
current.add(a[i][j]);
} else{
if (count > max) {
max = count;
result = current;
}
current = new ArrayList<Integer>();
count = 1;
}
}
}
return result ;
}