LeetCode074 Search a 2D Matrix

详细见: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)
        


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值