获得2D整数数组中最长的序列

时间:2015-09-18 07:16:39

标签: java arrays arraylist

我已经陷入了这个问题一段时间了。目标是返回最长重复序列的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;
}

2 个答案:

答案 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 ; 
    }