蓝蓝算法day13/45

1.题目

在⼀个⼆维数组array中(每个⼀维数组的⻓度相同),每⼀⾏都按照从左到右递增的顺序排
序,每⼀列都按照从上到下递增的顺序排序。请完成⼀个函数,输⼊这样的⼀个⼆维数组和
⼀个整数,判断数组中是否含有该整数。
[
[1,2,8,9],
[2,4,9,12],
[4,7,10,13],
[6,8,11,15]
]
给定target=7,返回true。
给定target=3,返回false。
数据范围:矩阵的⻓宽满⾜0<=n,m<=500,矩阵中的值满⾜0≤10<sup>9</sup>
进阶:空间复杂度O(1),时间复杂度O(n+m)

2.知识点

1. ⼆维数组按照从左到右递增和从上到下递增的规则排序,利⽤这⼀规律可以采⽤特定的搜
索策略,缩⼩搜索范围。
2. #include <stdbool.h> 是⼀个头⽂件,它定义了⼀个新的数据类型 bool 和两个
常量 true 和 false ,⽤于表⽰布尔值。
3. int** array 是⼀个指针变量,它指向⼀个指针数组,每个指针指向⼀个 int 类型
的值。可以将其理解为⼀个⼆维数组的⾸地址。
时间复杂度:O(n+m),其中n和m分别为⼆维数组的⾏数和列数。由于每⼀步操作都会将
搜索范围减少⼀⾏或⼀列,最多需要进⾏n+m次操作即可完成搜索。
空间复杂度:O(1),算法只使⽤了常数个额外变量来保存辅助信息,没有使⽤额外的辅助空
间。

3.思路
1. 初始搜索起始位置为右上⻆元素,即⾏为0,列为数组的列数减1.(即初始值分别为第一行最后一列的位置)
2. 循环执⾏以下的步骤,直到搜索范围越界:
a. 如果当前元素等于⽬标值,返回true,表⽰找到了⽬标值。
b. 如果当前元素⼤于⽬标值,说明⽬标值可能在该元素的左侧,因此列数减1,缩⼩搜索范围。
c. 如果当前元素⼩于⽬标值,说明⽬标值可能在当前元素的下⽅,因此⾏数加1,缩⼩搜索范围。
3. 如果搜做范围越界仍然未找到⽬标值,则返回fasle,表⽰未找到⽬标值。

bool searchInArray(int** array,int rows, int cols, int target) {
// 搜索的起始位置
	int row = 0;
	int col = cols - 1;
// 不能超过搜索的边界 (rows为?数,这?作为位序)
	while (row < rows && col >= 0) {
		if (array[row][col] == target) {
			return true;
		}else if (array[row][col] > target) 
		{
			col--;
			// ?标值可能在当前元素的左侧
		}else{
			row++;
			// ?标值可能在当前元素的下?
		}
	}
	return false;
// 超出搜索范围,未找到?标值。
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值