方法是:
public static boolean search(int matrix[][], int key)
如果在矩陣中找到鍵,該方法將回傳 true,矩陣大小將始終為 nxn ,矩陣是回圈排序的,這是 4x4 示例的示例
運行時效率必須低于 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 i比較每個季度的 num
希望我提前說清楚。
uj5u.com熱心網友回復:
好問題
我們通常用來限制網格的一個技巧是傳入起始行索引、結束行索引、起始列索引、結束列索引。
你的標題會變成
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,通過矩陣[2][2]得到它的值。但是我在奇數矩陣上加倍了這個回圈排序作業。
如果n是偶數(等4x4),你這次中間沒有數字,那么你需要找到每個季度最大的4個數字。
然后使用鍵與中間的數字進行比較以找出哪個季度。以您的示例為例,如果鍵是 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
限制季度后,您應該再次遞回呼叫此函式
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/368776.html
下一篇:將陣列元素向右移動
