二维数组赋值给另一个二维数组_二维数组的查找

【题目描述】

在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

07e85bd7b785cd52191480d9738f1ad5.png

思路

1. 思路一:暴力法

暴力解法,既遍历数组的每一个元素,时间复杂度O(n2)

2.思路二:规律法

利用二维数组由上到下,由左到右递增的规律,从左下角开始遍历,如果target元素比当前值小,则往上找,若比当前元素大,则往右找,如果存在,必然找到目标数字。

即选取右上角或者左下角的元素 a[row] [col] 与 target 进行比较, 当target小于元素 a[row] [col] 时,那么 target 必定在元素 a 所在行的左边,让 col-- ;当 target 大于元素 a[row] [col] 时,那么 target 必定在元素 a 所在列的下边,让 row++ ;

时间复杂度O(m+n)

PHP代码示例

function findElement(array $arr, int $target) { if (empty($arr) || empty($target)) { return false; } $row = 0; $col = count($arr[0]) - 1; while (($row <= count($arr) - 1) && $col >= 0) { if ($target == $arr[$row][$col]) { return true; } else { if ($target > $arr[$row][$col]) { $row++; } else { $col--; } } } return false;}

3.思路三:二分法

每一行每一列都按照从左到右递增的顺序排序,把每一行每一列看作有序递增数组,利用二分查找,通过遍历每一行查找得到答案,时间复杂度log(n)*log(m)

PHP代码示例

/** * 二分查找 * @param array $arr * @param int $target * @param int $low * @param int $high * @return float * @author liu.lei */function binarySearch(Array $arr, int $target, int $low, int $high) { while ($low <= $high) { $mid = floor(($low + $high) / 2); #找到元素 if ($arr[$mid] == $target) { return $mid; } #中元素比目标大,查找左部 if ($arr[$mid] > $target) { $high = $mid - 1; } #重元素比目标小,查找右部 if ($arr[$mid] < $target) { $low = $mid + 1; } } //返回小值 return floor(($low + $high) / 2);}/** * 递归搜索 * @param array $arr * @param int $target * @param int $row_start * @param int $row_end * @param int $col_start * @param int $col_end * @return bool * @author liu.lei */function binarySearchIn2DArray(array $arr, int $target, int $row_start, int $row_end, int $col_start, int $col_end) { //查找失败 if ($row_start > $row_end || $col_start > $col_end) { return false; } //二分查找,找到中间的行数 $mid = round(($row_start + $row_end) / 2); //找到的值位于x行,result列 $result = binarySearch($arr[$mid], $target, $col_start, $col_end); if ($arr[$mid][$result] == $target) { return true; } //对剩余的两部分分别进行递归查找 return (binarySearchIn2DArray($arr, $target, $row_start, $mid - 1, $result + 1, $col_end) || binarySearchIn2DArray($arr, $target, $mid + 1, $row_end, $col_start, $result));}/** * 二维数组查找元素 * * @param array $arr * @param int $target * @return bool * @author liu.lei */function find(array $arr, int $target) { if (empty($arr) || empty($target)) { return false; } //数组的行数 $row = count($arr) - 1; //数组的列数 $col = count($arr[0]) - 1; //如果目标值小于最小值或者目标值大于最大值,那肯定不存在 if ($target < $arr[0][0] || $target > $arr[$row][$col]) { return false; } return binarySearchIn2DArray($arr, $target, 0, $row, 0, $col);}$arr = [ [1, 2, 3, 4], [3, 6, 9, 12], [5, 10, 15, 20]];$a = find($arr, 10);var_dump($a);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值