编写一个高效的算法,在 m x n 矩阵中搜索一个值。
该矩阵具有以下特征:
- 每行中的整数从左到右按升序排列。 - 每行的第一个整数大于或等于前一行的最后一个整数。
例如,考虑以下矩阵:
[1, 3, 5, 7], [10, 11, 16, 20], [23, 30, 34, 50]
给定 target = 3,返回 1(即为真)。
对于这个问题,如果元素存在返回 0 / 1(0 表示不存在,1 表示存在)。
我的解决方案在 NetBeans 上运行正常,但在网站上失败。任何帮助将不胜感激。https://www.interviewbit.com/problems/matrix-search/
该矩阵具有以下特征:
- 每行中的整数从左到右按升序排列。 - 每行的第一个整数大于或等于前一行的最后一个整数。
例如,考虑以下矩阵:
[1, 3, 5, 7], [10, 11, 16, 20], [23, 30, 34, 50]
给定 target = 3,返回 1(即为真)。
对于这个问题,如果元素存在返回 0 / 1(0 表示不存在,1 表示存在)。
我的解决方案在 NetBeans 上运行正常,但在网站上失败。任何帮助将不胜感激。https://www.interviewbit.com/problems/matrix-search/
public class Solution {
public int searchMatrix(ArrayList<ArrayList<Integer>> a, int b) {
int r = a.size();
int c = a.get(0).size();
int start = 0;
int end = r - 1;
// default value is last row for edge case
int biRow = r -1; // row to search column
//binary search 1st value of rows
while (start <= end) {
int mid = (start + end) / 2;
if (b == a.get(mid).get(0)) {
return 1;
}
if (a.get(mid).get(0) < b && b < a.get(end).get(0)) {
if (mid + 1 >= end) {
biRow = mid;
break;
}
} if (b < a.get(mid).get(0)) {
end = mid - 1;
} else {
start = mid + 1;
}
}
//binary search column of biRow
start = 0;
end = c-1;
while (start <= end) {
int mid = (start + end) / 2;
if (b == a.get(biRow).get(mid)) {
return 1;
}
if (b < a.get(biRow).get(mid)) {
end = mid - 1;
} else {
start = mid + 1;
}
}
return 0;
}
}