[Leetcode]74. Search a 2D Matrix
74. Search a 2D Matrix
这道题是medium的,但是那道题第一反应就是二分法。聪明的我建了个数组,把2D的数组瞬间降低纬度变成1D,low到爆炸有木有,然后正常的二分顺利做出来,当然时间只击败了个位数个百分比。。。这是第一反应的代码。简单的题我就不讲思路了哈,直接上代码。就是这个简单的二分法,我竟然都不是一次写对的,忘了mid-1和mid+1,可耻!下不为例。不写这俩,有时候就会陷入死循环,无法让high比low小了,切记不可再犯。
当然,又更好的省去空间的办法, 直接按照2D数组搜索,而不展开,展开太傻了。不造为何,这个时间也很长,哎。这个写的时候更可耻,竟然没写小于等于,在while循环里。哎。不过也有进步,两种方法写二分这个基本点算是掌握了。这个 方法也很好,但是不是java。没有取余数和mod。这个不是二分,看了半天,不是二分,是找一个角落然后变换行列。还是咱们的办法好。那个行列方法,当做参考吧,思路还挺有意思的,不是二分,不要。
这道题是medium的,但是那道题第一反应就是二分法。聪明的我建了个数组,把2D的数组瞬间降低纬度变成1D,low到爆炸有木有,然后正常的二分顺利做出来,当然时间只击败了个位数个百分比。。。这是第一反应的代码。简单的题我就不讲思路了哈,直接上代码。就是这个简单的二分法,我竟然都不是一次写对的,忘了mid-1和mid+1,可耻!下不为例。不写这俩,有时候就会陷入死循环,无法让high比low小了,切记不可再犯。
public class Solution {
public boolean searchMatrix(int[][] matrix, int target) {
if(matrix == null || matrix.length == 0){
return false;
}
ArrayList<Integer> list = new ArrayList<Integer>();
for (int i=0; i<matrix.length; i++){
for(int j=0; j<matrix[0].length; j++){
list.add(matrix[i][j]);
}
}
int n = list.size();
int[] l = new int[n];
int index = 0;
for(int i : list){
l[index++] = i;
}
return binarySearch(l, target, 0, n-1);
}
private boolean binarySearch(int[] list, int target, int low, int high){
if(high < low){
return false;
}
boolean result = false;
int mid = low + (high-low)/2;
if(list[mid] > target){
result = binarySearch(list, target, low, mid - 1);
}
else if(list[mid] < target){
result = binarySearch(list, target, mid + 1, high);
}
else{
result = true;
}
return result;
}
}
当然,又更好的省去空间的办法, 直接按照2D数组搜索,而不展开,展开太傻了。不造为何,这个时间也很长,哎。这个写的时候更可耻,竟然没写小于等于,在while循环里。哎。不过也有进步,两种方法写二分这个基本点算是掌握了。这个 方法也很好,但是不是java。没有取余数和mod。这个不是二分,看了半天,不是二分,是找一个角落然后变换行列。还是咱们的办法好。那个行列方法,当做参考吧,思路还挺有意思的,不是二分,不要。
public class Solution {
public boolean searchMatrix(int[][] matrix, int target) {
if(matrix == null || matrix.length == 0){
return false;
}
int m = matrix.length;
int n = matrix[0].length;
int low = 0;
int high = m*n - 1;
int mid = 0;
while(low<=high){
mid = low + (high-low)/2;
int i = mid/n;
int j = mid%n;
if(target < matrix[i][j]){
high = mid - 1;
}
else if(target > matrix[i][j]){
low = mid + 1;
}
else{
return true;
}
}
return false;
}
}
Comments
Post a Comment