面試題整理 矩陣查詢元素

2021-06-10 05:38:21 字數 2398 閱讀 1818

需要在矩陣中查詢元素。這個矩陣的排列如下:

每一行都是有序的。每一列都是有序的。

比如乙個小矩陣。

10 30

20 80

現在,我們需要在乙個這樣n * m的矩陣中找到乙個元素,並返回其位置。

思路

首先,這個題不太適合二分查詢。因為並不能保證第二行的元素都一定比第一行的任意元素大。

所以應該是很難找到o(lgn)的演算法。

每次都是取右上角的元素v與x(我們要查詢的元素)進行比較較:

如果發現v > x,由於v所在列肯定比x大。所以v所在列可以捨棄。

如果發現v < x,由於v所在行肯定比x小。所以v所在行可能捨棄。

最後餘下的,可能是一行,也可能是一列。總之可以利用二分查詢來實現了。效率o(min(n, m)) + log(abs(m-n)).

解題

這裡直接粘出**。

int find(int **a, const int row, const int col, const int x, int *rpos, int *cpos) 

from_row += x > v;

from_col -= v > x;

} //最後剩下一行

if (from_row == (row - 1) && from_col != 0) else if (v > x) e = mid;

else b = mid + 1;

} return 0;

} //最後剩下一列

if (from_col == 0 && from_row != (row - 1)) else if (v > x) e = mid;

else b = mid + 1;

} return 0;

} //最後只剩下乙個點

if (a[from_row][from_col] == x)

return 0;

}

這裡寫乙個測試程式,如果有錯,會輸出error。

無限迴圈.

#include #include #include int _cmp(const void *a, const void *b) 

int **create_matrix(int row, int col)

qsort(value, numbers, sizeof(int), _cmp);

for (iter = i = 0; i < row; ++i)

} free(value);

return a;

}void destroy_matrix(int **a, const int row)

free(a);

}void print_matrix(int **a, int row, int col)

printf("\n"); }}

int _binary_search(int *a, int from, int to, int x)

return -1;

}int find(int **a, const int row, const int col, const int x, int *rpos, int *cpos)

from_row += x > v;

from_col -= v > x;

} //最後剩下一行

if (from_row == (row - 1) && from_col != 0) else if (v > x) e = mid;

else b = mid + 1;

} return 0;

} //最後剩下一列

if (from_col == 0 && from_row != (row - 1)) else if (v > x) e = mid;

else b = mid + 1;

} return 0;

} //最後只剩下乙個點

if (a[from_row][from_col] == x)

return 0;

}int main(void)

} else

if (!find(a, row, col, a[0][0], &r, &c))

if (!find(a, row, col, a[row-1][0], &r, &c))

if (!find(a, row, col, a[0][col-1], &r, &c))

if (!find(a, row, col, a[row-1][col-1], &r, &c))

destroy_matrix(a, row);

} return 0;

}

面試題整理

2014.3.19日整理 1.建立一張表hack 裡面就乙個欄位num,然後用sql語句從1開始插入到100,怎麼寫?oracle 答 1.create tablehack num number 建表語句 2.begin for i in1.100loop insert intohack num v...

整理面試題

整理面試題 1 說說activity,intent,service是什麼關係 答 乙個activity 通常是乙個單獨的螢幕,每乙個 activity 都被實現為乙個單獨的類,這些類都是從 activity 基類中繼承而來的。activity 類會顯示由檢視控制項組成的使用者介面,並對檢視控制項的事...

面試題整理

static變數 全域性變數與區域性變數 靜態資料區 堆疊 heap和stack的區別 堆是由malloc之類的函式分配的空間位址由低向高增長 stack是自動分配變數位址由高向低 減少程式的記憶體分配 1.棧區 stack 由編譯器自動分配釋放,存放函式的引數值,區域性變數的值等。其操作方式類似於...