用于验证二维数组是否具有两个等于行的算法

时间:2016-06-13 13:24:24

标签: java arrays algorithm

  

定义一个方法,在该方法中,给定一个二维数组,评估它是否至少有两个相同的行

我试图想出一个算法来做到这一点,但我没有走得太远。这就是我得到的:

public static boolean righeUguali(int[][] a){
    boolean rUguali=false;

    for(int i=0; i<a.length; i++)
        for(int j=0; i<a[i].length; j++)
            if(Arrays.equals(a[i],a[j]))
                rUguali = true;
    return rUguali;
你可以帮我解决这个问题吗?

4 个答案:

答案 0 :(得分:4)

  • 您需要确保不将行与自身进行比较。您可以通过j
  • 启动i+1来确保这一点
  • 两个循环都需要遍历行
  • 两行中的第一行不能是最后一行,否则就没有第二行可以比较它了。
  • 优化:您可以在找到两个相等行
  • 后立即终止

修改后的代码:

public static boolean righeUguali(int[][] a){
    for(int i=0; i<a.length-1; i++)
        for(int j=i+1; i<a.length; j++)
            if(Arrays.equals(a[i],a[j]))
                return true;
    return false;
}

答案 1 :(得分:2)

以下是我将如何做到这一点:

int[][] array = { { 1, 2, 3, 4, 5, 6 },
            { 7, 6, 8, 3 }, 
            { 1, 2, 3, 4 },
            { 1, 2, 3, 9, 5, 6, 32, 3125423 },
            { 8, 3 }, 
            { 1, 2, 3, 4, 5, 6 } };//same as first row
    external: for (int i = 0; i < array.length; i++) {
        for (int j = i + 1; j < array.length; j++) {
            if (Arrays.equals(array[i], array[j])) {
                System.out.println("Row: " + i + " is the same as row: " + j+" (warning! 0 oriented!)" );
                break external;
            }
        }
    }

如你所见,array []是随机的,但是第一行(第0行)与最后一行(第5行)相同,所以我所做的就是在每个传递循环中循环一次数组通过数组的其余行。然后我比较数组,如果他们是相同的chech。如您所见,代码打印出一条消息,然后终止(停止外部循环)

这是基于一个简单的排序算法。

编辑#1 正如@ 4castle在评论中指出的那样,在方法的上下文中,不需要break语句,可以用return替换。

答案 2 :(得分:2)

应用near-duplicate question中最简单的答案:

public static boolean righeUguali(int[][] a) {
    for(int i = 0; i < a.length; i++)
        for(int j = i + 1; j < a.length; j++)
            if(Arrays.equals(a[i], a[j]))
                return true;
    return false;
}

您的算法正在破解,因为j似乎在迭代嵌套数组。这不是必需的,因为Arrays.equals将迭代嵌套数组。相反,使用它作为第二个迭代器,用于查找是否有任何其他元素与i指定的当前元素匹配。

如果您想获得更好的效果,可以在重复的问题上找到更快的解决方案。

答案 3 :(得分:1)

还没有人提到过更快的方法是对顶级数组进行排序,然后查找两个相同的相邻行。如果数组是m * n,那么这将花费O(mn log n)时间,而不是所有需要O(mn ^ 2)时间的现有解决方案。

当然,如果您无法对行进行重新排序,那么您需要首先复制数组 - 但除非您的数组占用&gt; 50%的可用RAM,创建副本然后对其行进行排序仍将比现有解决方案快得多。