需要在矩陣中查詢元素。這個矩陣的排列如下:
每一行都是有序的。每一列都是有序的。
比如乙個小矩陣。
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 由編譯器自動分配釋放,存放函式的引數值,區域性變數的值等。其操作方式類似於...