【问题标题】:Finding pivots in circular two dimensional array在圆形二维数组中查找枢轴
【发布时间】:2022-01-05 05:52:00
【问题描述】:

方法是:

public static boolean search(int matrix[][], int key)

如果在矩阵中找到键,该方法将返回 true, 矩阵大小将始终为 n x n ,矩阵是循环排序的,这里是 4x4 的示例 example

运行时效率必须低于 O(n^2) ,目标为 O(n log n)

这是我试图暗示的结构,代码不起作用只是我的思考过程

public static boolean search1 (int [][] matrix, int num) 
{

    int ROWS = matrix.length;
    int COLS = matrix[0].length; 
    int end = COLS * ROWS; 
    int first_quarter_pivot = matrix[0][0];
    int second_quarter_pivot = matrix[0][i];
    int third_quarter_pivot = matrix[i][0];
    int fourth_quarter_pivot = matrix[i][i];
      
       if(num < first_quarter_pivot)
       // if num smaller than first pivot binary search first quarter,if not found return false
       binarySearch( );
       
       if(num < second_quarter_pivot)
       binarySearch( );
       // if num smaller than second pivot binary search second quarter ,if not found return false
       if(num < third_quarter_pivot )
       binarySearch( );
       // if num smaller than third pivot binary search third quarter ,if not found return false
       // else search fourth quarter
       else
        binarySearch( );
       // return false if nothing found
     
    }

我可以t find the pivots to split the matrix to 4 quarters,I want to find the edges of each quarter,and I want to find in each quarter the bottom left corner which il 比较每个季度的 num 和

希望我提前说清楚了。

【问题讨论】:

    标签: java arrays performance


    【解决方案1】:

    好问题

    我们通常用来限制网格的一个技巧是传入起始行索引、结束行索引、起始列索引、结束列索引。

    你的标题会变成

    public boolean search(int[][] matrix, int key, int startRow, int endRow, int startColumn, int endColumn){
    
    

    第一次调用,startRow startColumn 将为 0,endRow 和 endColumn 将为 n-1 每次您确定关键所在的季度时,相应地缩小这些值以进行下一次递归调用

    步骤

    先找到n,即matrix.length。

    然后使用 n 查找网格中间数字的行和列。

    如果 n 是奇数(等 5x5),那么中间网格中会有一个数字, 它的索引是n=5, 5/2 = 2,通过matrix[2][2]得到它的值。但我在奇数矩阵上加倍循环排序工作。

    如果n是偶数(等4x4),这次你中间没有数字,那么你需要找到每个季度中最大的4个数字。

    然后使用 键与这个中间数字进行比较以找到哪个季度。用你的例子,如果 key 是 55,你怎么知道它在哪个季度?

    先与第一季度的最大值(6)比较,如果key小于6,则为第一季度,然后与第二季度的最大值(15)比较,如果小于15则为是在第二季度。重复第三季度和第四季度。

    第一季度最大数的索引算法是matrix[value-1][startColumn] = 6, value是n/2 = 4/2 = 2

    第二季度,矩阵[value-1][value] = 15恰好是第二季度最大的数字,幸运。

    对于第三季度,最大数字的索引是 matrix[endRow][startColumn] = 60

    第四季度,最大数字的索引是 matrix[endRow][value] = 30

    在你限制了季度之后,你应该再次递归调用这个函数

    【讨论】:

    • 非常感谢您帮助我更好地理解它,im currently with your help is able to limit the quarter of the search,but im 不知道如何在本季度搜索密钥,假设我应该在第一季度执行从 matrix[0][0] 到 matrix[value-1][value-1]) 的搜索?我的理解是将季度锁定在具有正确索引的盒子中并在那里进行预演?
    • 是的你的理解是正确的,如果在第一季度,那么下一次递归调用的限制就变成了startRow = startRow, endRow = value-1, startColumn = startColumn, endColumn = value-1。您可以通过尝试不同的示例来计算出另一季度。 PS只注意基本情况,网格最后应该只有4个项目,需要在那里返回true或false。
    • 更新了查找季度逻辑
    • 如果数字在数组中,则等待返回true的目的我可以 // if((key >= matrix[0][0]) && (key
    • 不确定这是什么意思,但我们只在基本情况下返回 true 或 false(网格中只有 4 个项目),这 4 个项目是 4 个季度的枢轴。因此,如果键等于这些枢轴中的任何一个,您就可以返回。
    猜你喜欢
    • 2012-09-08
    • 2022-01-22
    • 2017-07-22
    • 1970-01-01
    • 2019-12-07
    • 1970-01-01
    • 2021-06-26
    • 2012-02-17
    • 1970-01-01
    相关资源
    最近更新 更多