搜索二维矩阵问题
1. 74.搜索二维矩阵
2. 240搜索二维矩阵2
其中74将整个二维数组复制到一个一维数组中,再在这个一维数组中使用二分法,
class Solution {
public boolean searchMatrix(int[][] matrix, int target) {
int m=matrix.length;
int n=matrix[0].length;
if(m==0&&n==0){
return false;
}
int k=0;
int[] nums=new int[m*n];
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
nums[k]=matrix[i][j];
k++;
}
}
int left = 0;
int right = nums.length - 1; // 注意
while(left <= right) {
int mid = left + (right - left) / 2;
if(nums[mid] == target){
return true;
}else if(nums[mid] < target){
left = mid + 1; // 注意
}else if (nums[mid] > target){
right = mid - 1; // 注意
}
}
return false;
}
}
240从右上角元素开始考虑,一层层将二维数组复制到对角数目个一维数组上,再对每一个一维数组依次二分搜索
class Solution { //从右上角开始考虑
public boolean searchMatrix(int[][] matrix, int target) {
int m=matrix.length;
int n=matrix[0].length;
int len_duijiao=Math.min(n,m);
for(int k=0;k<len_duijiao&&m+n-2*k>0;k++){
int w=0;
int[] nums=new int[m+n-2*k];
for(int i=0;i<n-k;i++){
nums[w]=matrix[k][i];
w++;
}
for(int j=k;j<m;j++){
nums[w]=matrix[j][n-1-k];
w++;
}
int left = 0;
int right = nums.length - 1; // 注意
while(left <= right) {
int mid = left + (right - left) / 2;
if(nums[mid] == target){ //这个无法判断左右边界是否是要搜索的值
return true;
}else if(nums[mid] < target){
left = mid + 1; // 注意
}else if (nums[mid] > target){
right = mid - 1; // 注意
}
}
}
return false;
}
}
//其实可以右上角开始走,利用这个顺序关系可以在O(m+n)的复杂度下解决这个题:
//如果当前位置元素比target小,则row++
//如果当前位置元素比target大,则col–
//如果相等,返回true
//如果越界了还没找到,说明不存在,返回false
时间复杂度:O(n+m),访问到的下标的行最多增加 n 次,列最多减少 m 次,因此循环体最多执行 n + m 次。
空间复杂度:O(1),
而我的方法时间复杂度:min(m,n)O(log2(m+n))和用于构造一维数组的O(mn)的最大值,单纯n个数二分搜索是O(n)
空间复杂度:O(m*n)