【问题标题】:How can I find a local minimum in a 2D array?如何在二维数组中找到局部最小值?
【发布时间】:2017-03-09 14:36:02
【问题描述】:
public static void main(String[] args) {
    // TODO code application logic here
    int numRows = 5;
    int numCols = numRows;
    int[][] twoDimArray = new int[numRows][numCols];
    Random randGen = new Random();

    for (int i = 0; i < numRows; i++) {
        for (int j = 0; j < numCols; j++) {
            int randIndex = randGen.nextInt(4);
            int value = randGen.nextInt(100);
            twoDimArray[i][j] = value;
        }
    }
    System.out.println("\nThe two-dimensional array: ");
    for (int i = 0; i < numRows; i++) {
        for (int j = 0; j < numCols; j++) {
            System.out.print(twoDimArray[i][j] + " ");
        }
        System.out.println();

    }  
    }
}

我想使用“蛮力”方法找到局部最小值。我知道对于一维数组,我会使用 for 循环来比较数组中的所有元素,直到找到局部最小值,但我不知道如何在此处执行此操作。

编辑:我可以改用二分搜索吗?找到中间的一行,然后在那里搜索,如果没有找到,我搜索其中的一半。

【问题讨论】:

  • 如何在二维数组的上下文中定义局部最小值?哪些相邻元素将用于确定是否存在局部最小值?
  • 二维数组中的局部最小值必须是它所在行中的最小元素,并且小于它“顶部”和直接“下面”的元素。因此,如果 i 是行中的元素,j 是列中的元素,则局部最小值必须小于 [i-1]、[i+1]、[j-1] 和 [j+1]
  • 在时间复杂度方面并没有真正的优化方法来找到局部最小值。由于数据未排序并且可能包含重复数据,因此可以进行的优化很少。 See this post.

标签: java arrays


【解决方案1】:

蛮力方法与一维数组的方法非常相似,只是多了一个循环和一些检查:

public int[] findLocalMinimum(int[][] arr) {
    for (int i = 0; i < arr.length; i++) {
        for (int j = 0; j < arr[i].length; j++) {

            int current = arr[i][j];

            if (i + 1 < arr.length    && current >= arr[i + 1][j] ||
                i - 1 >= 0            && current >= arr[i - 1][j] ||
                j + 1 < arr[i].length && current >= arr[i][j + 1] ||
                j - 1 >= 0            && current >= arr[i][j - 1]) {
                continue;
            } else {
                return new int[] { i, j };
            }

        }
    }
    return new int[] { -1, -1 };
}

【讨论】:

    猜你喜欢
    • 2012-04-21
    • 2020-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-18
    • 2017-07-17
    相关资源
    最近更新 更多