Leetcode 74 Search a 2D Matrix 有序二维数组二叉查找

来源:互联网 发布:union软件安卓版 编辑:程序博客网 时间:2024/04/30 04:35

题目原址:https://leetcode.com/problems/search-a-2d-matrix/

题目描述

Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the following properties:

  • Integers in each row are sorted from left to right.
  • The first integer of each row is greater than the last integer of the previous row.

翻译:
在一个二维数组中查找是否存在某元素,该二维数组具有以下特性:

  • 每一行中的元素都是递增的
  • 每一行行中最小的元素比上一行最大的元素大

即,二维数组中元素从左到右从上到下递增,而且此处我们认为矩阵中不存在重复的元素。

解题思路

此处,我们考虑使用二叉查找。

算法描述

  1. 根据最后一列中的元素,通过二叉查找先确定目标元素可能在哪一行中
  2. 在可能存在的行中进行二叉查找

代码

// 在矩阵中找目标数字// 矩阵中每一行中元素递增// 第i+1行中最小的元素比第i行中最大的元素大// 二叉查找bool searchMatrix(int** matrix, int matrixRowSize, int matrixColSize, int target) {    int start = 0, end = matrixRowSize - 1, center;    // 先根据每一行的最后一个元素进行二叉查找,确定目标元素可能在哪一行    while (start < end) {        // center为待测范围中间的那一行        center = (start + end) / 2;        // 如果第center行的尾元素就是target,直接返回true        if (*(*(matrix + center) + matrixColSize - 1) == target)            return true;        // 如果第center行的尾元素比target小,target必在center之后的行中        else if (*(*(matrix + center) + matrixColSize - 1) < target)            start = center + 1;        // 如果center行的尾元素比target大,则需根据center行的首元素来继续处理        // 如果center行首元素就是target,直接返回true        else if (*(*(matrix + center)) == target)            return true;        // 如果center行的首元素比target小,说明target只会存在center行中        else if (*(*(matrix + center)) < target)            start = end = center;        // 如果center行的首元素比target小,则target必在center之前的行中        else            end = center - 1;    }    // 此时start=end,且其值为target可能存在的行    // 接下来在第row行中用二叉查找方法查找target    int *row = *(matrix + start); // 目标可能存在的行    start = 0;    end = matrixColSize - 1;    while (start < end) {        // center为中间的位置        center = (start + end) / 2;        // 如果中间的元素就是target,直接返回true        if (*(row + center) == target )            return true;        // 如果中间的元素比target小,则缩小范围,在后半部分中查找        else if (*(row + center) < target)            start = center + 1;        // 如果中间的元素比target大,则缩小范围,在前半部分中查找        else             end = center - 1;    }    // 执行到这里,start=end    // 该位置的元素是target的话则查找成功,否则查找失败    return *(row + start) == target;}

测试数据

matrix = [    [1,   3,  5,  7],    [10, 11, 16, 20],    [23, 30, 34, 50]]
051为待查找数字则,测试结果为(放在数组result中,1=true0=falseresult = [    0, 1, 0, 1, 0, 1, 0, 1, 0, 0, // 0-9    1, 1, 0, 0, 0, 0, 1, 0, 0, 0, // 10-19    1, 0, 0, 1, 0, 0, 0, 0, 0, 0, // 20-29    1, 0, 0, 0, 1, 0, 0, 0, 0, 0, // 30-39    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 40-49    1, 0]                         // 50-51]

// 个人学习记录,若有错误请指正,大神勿喷
// sfg1991@163.com
// 2015-05-06

0 0
原创粉丝点击