详细见:leetcode.com/problems/search-a-2d-matrix
Java Solution: github
package leetcode;
public class P074_SearchA2DMatrix {
public static void main(String[] args) {
System.out.println(new Solution().searchMatrix(new int[][] {
{1, 3, 5, 7},
{10, 11, 16, 20},
{23, 30, 34, 50},
}, 50));
}
/*
* 一次AC
* 1 ms
* 还是需要注意二分时候的判断条件
*/
static class Solution {
public boolean searchMatrix(int[][] matrix, int target) {
int cow = matrix.length, col = matrix[0].length;
int sti = 0, eni = cow * col - 1;
while (sti <= eni) {
int mid = ( sti + eni ) >> 1;
int coi = mid / col, coj = mid - coi * col;
if (matrix[coi][coj] == target)
return true;
else if (matrix[coi][coj] > target)
eni = mid - 1;
else
sti = mid + 1;
}
return false;
}
}
}
C Solution: github
/*
url: leetcode.com/problems/search-a-2d-matrix
AC 3ms 25.86%
*/
#include <stdio.h>
#include <stdlib.h>
#define bool int
bool search(int** m, int ri, int ci, int rj, int cj, int rn, int cn, int t) {
int rm = (ri+rj) / 2, cm = (ci+cj) / 2;
if (rm < 0 || rm >= rn) return 0;
if (cm < 0 || cm >= cn) return 0;
if (m[rm][cm] == t) return 1;
if (ri > rj || ci > cj) return 0;
if (m[rm][cm] > t) {
return search(m, ri, ci, rm-1, cj, rn, cn, t) ||
search(m, rm, ci, rj, cm-1, rn, cn, t);
}
return search(m, ri, cm+1, rj, cj, rn, cn, t) ||
search(m, rm+1, ci, rj, cm+1, rn, cn, t);
}
bool searchMatrix(int** m, int rn, int cn, int t) {
return search(m, 0, 0, rn-1, cn-1, rn, cn, t);
}
int main() {
int** m = (int**) malloc(sizeof(int*) * 3);
int m0[] = {1, 3, 5, 7};
int m1[] = {10,11,16,20};
int m2[] = {23,30,34,50};
m[0] = m0;
m[1] = m1;
m[2] = m2;
printf("answer is %d\r\n", searchMatrix(m, 3, 4, 3));
}
Python Solution: github
#coding=utf-8
'''
url: leetcode.com/problems/search-a-2d-matrix/
@author: zxwtry
@email: zxwtry@qq.com
@date: 2017年4月17日
@details: Solution: 55ms 36.01%
'''
class Solution(object):
def search(self, m, ri, ci, rj, cj, rn, cn, t):
rm, cm = (ri + rj) // 2, (ci + cj) // 2
if rm < 0 or rm >= rn: return False
if cm < 0 or cm >= cn: return False
if m[rm][cm] == t: return True
if ri > rj or ci > cj: return False
if m[rm][cm] > t:
return self.search(m, ri, ci, rm-1, cj, rn, cn, t) \
or self.search(m, rm, ci, rj, cm-1, rn, cn, t)
return self.search(m, ri, cm+1, rj, cj, rn, cn, t) \
or self.search(m, rm+1, ci, rj, cm, rn, cn, t)
def searchMatrix(self, m, t):
"""
:type m: List[List[int]]
:type t: int
:rtype: bool
"""
if m == None or len(m) == 0: return False
if m[0] == None or len(m[0]) == 0: return False
rn, cn = len(m), len(m[0])
return self.search(m, 0, 0, rn-1, cn-1, rn, cn, t)