当前位置:网站首页>LeetCode - 搜索二维矩阵
LeetCode - 搜索二维矩阵
2022-07-02 11:34:00 【小小太空人w】
日常刷题中
目录
GitHub链接
diwei00 (github.com)
https://github.com/diwei00 刷题代码都在Exercise库中提交
LeetCode链接🤨
74. 搜索二维矩阵 - 力扣(LeetCode)
https://leetcode.cn/problems/search-a-2d-matrix/submissions/
题目
编写一个高效的算法来判断
m x n矩阵中,是否存在一个目标值。该矩阵具有如下特性:
- 每行中的整数从左到右按升序排列。
- 每行的第一个整数大于前一行的最后一个整数。
示例1:
输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 3 输出:true示例2:
输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 13 输出:false
题目分析
由于每行中的整数从左到右按升序排列且每行的第一个整数大于前一行的最后一个整数,其实就意味着整个矩阵的数据都是升序排列的,只是分为了矩阵而已。按照这种特性我们先需要遍历矩阵中最后一列的数据,如果这一列数据比目标值target大,即在要查找数据肯定在这一行,那么只需要遍历这一行数据即可。
其实发现最后一列的数据也是升序排列的,而每一行也是升序排列的,那么意味着我们在遍历最后一列和某一行数据时可以采用二分查找的方法,但最后要查找的数是在某一行出现的,所以在遍历行时采用二分查找的方法。
函数参数分析:
一般开辟的二维数组传参都是直接将首行地址数组地址传过来,用数组指针来接收。可以看见这里的接收二维数组是一个二级指针,其实这个二维数组是在堆区用malloc开辟的。先开辟一个存地址的数组,然后在开辟很多数组,把这些数组的首地址存起来,即构成了一个二维数组。在释放时,也要先释放parr这块的数组,然后再释放pparr。(后面有代码实现)matrixSize就是矩阵的行数,matrixColSize是矩阵列数的地址,target就是要查找的目标数。
代码实现(顺序查找法)
bool searchMatrix(int** matrix, int matrixSize, int* matrixColSize, int target)
{
int row = matrixSize;
int col = *matrixColSize;
int i = 0;
for (i = 0; i < row; i++)
{
if (matrix[i][col - 1] > target || matrix[i][col - 1] == target)
{
break;
}
}
//for循环跳出,修正下标
if (i == row)
{
i -= 1;
}
int j = 0;
for (j = 0; j < col; j++)
{
if (matrix[i][j] == target)
{
return true;
}
}
return false;
}代码实现(二分查找法)
bool searchMatrix(int** matrix, int matrixSize, int* matrixColSize, int target)
{
int row = matrixSize;
int col = *matrixColSize;
int i = 0;
//找需要找目标值的行
for (i = 0; i < row; i++)
{
if (matrix[i][col - 1] > target || matrix[i][col - 1] == target)
{
break;
}
}
//for循环跳出,修正下标
if (i == row)
{
i -= 1;
}
int left = 0;
int right = col - 1;
while (left <= right)
{
int mid = (left + right) >> 1;
if (matrix[i][mid] > target)
{
right = mid - 1;
}
else if (matrix[i][mid] == target)
{
return true;
}
else
{
left = mid + 1;
}
}
//while循环跳出则找不到目标值
return false;
}代码实现(二维数组在堆区开辟)
int main()
{
//保存地址的数组
int** pa = (int**)malloc(sizeof(int) * 3);
int i = 0;
int col = 3;
//将数组地址都存pa中
for (i = 0; i < 3; i++)
{
pa[i] = (int*)malloc(sizeof(int) * col);
}
for (i = 0; i < 3; i++)
{
free(pa[i]);
}
free(pa);
return 0;
}小结
每道题目的算法都有好多种,我们要打开自己的思路,不断的去忧化自己的算法,自己也会有不一样的收获。
边栏推荐
- Fatal: unsafe repository is owned by someone else
- STM32库函数进行GPIO初始化
- taobao.trade.get( 获取单笔交易的部分信息),淘宝店铺订单接口,淘宝oAuth2.0接口,淘宝R2接口代码对接分享
- jmeter脚本参数化
- Fabric.js 上划线、中划线(删除线)、下划线
- Fabric. JS upper dash, middle dash (strikethrough), underline
- MQ教程 | Exchange(交换机)
- Fabric.js 自由绘制椭圆
- C#代码审计实战+前置知识
- taobao.trades.sold.get-查询卖家已卖出的交易数据(根据创建时间),淘宝店铺卖出订单查询API接口,淘宝R2接口,淘宝oAuth2.0交易接口代码分享
猜你喜欢
随机推荐
Bit by bit of OpenCV calling USB camera
NLA自然语言分析,让数据分析更智能
taobao. trade. memo. Add (add remarks to a transaction) interface, Taobao store flag insertion interface, Taobao order flag insertion API interface, oauth2.0 interface
为什么只会编程的程序员无法成为优秀的开发者?
jmeter脚本参数化
Li Chuang EDA learning notes 15: draw border or import border (DXF file)
Yolov3 & yolov5 output result description
LeetCode_滑动窗口_中等_395.至少有 K 个重复字符的最长子串
【apipost】使用教程
What is erdma? Popular science cartoon illustration
Stm32-dac Experiment & high frequency DAC output test
[development environment] StarUML tool (download software | StarUML installation | StarUML creation project)
1. Editing weapon VIM
3、函数指针和指针函数
fatal: unsafe repository is owned by someone else 的解决方法
电脑怎么设置扬声器播放麦克风的声音
检查密码
Fatal: unsafe repository is owned by someone else
A white hole formed by antineutrons produced by particle accelerators
测试框架TestNG的使用(二):testNG xml的使用













