【leetcode刷题笔记】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.
For example,
Consider the following matrix:
[
[1, 3, 5, 7],
[10, 11, 16, 20],
[23, 30, 34, 50]
]
Given target = 3, return true.
题解:每次用右上角的元素跟target比较,有三种情况:
- 相等,说明找到了target;
- 右上角元素比target元素大,那么说明target在第一行,递归的搜索第一行。
- 右上角元素比target元素小,那么说明target在第二行及以后,递归的搜索如下图所示区域:

代码如下:
public class Solution {
private boolean IfFind = false;
private void RightCornerRecur(int[][] matrix,int target,int m_start,int m_end,int n_start,int n_end){
if(m_start > m_end || n_start > n_end)
return;
if(m_start < 0 || n_start < 0 || m_end >= matrix.length || n_end >= matrix[0].length)
return;
if(matrix[m_start][n_end] == target){
IfFind = true;
return;
}
if(matrix[m_start][n_end] > target)
RightCornerRecur(matrix, target, m_start, m_start, n_start, n_end-1);
else {
RightCornerRecur(matrix, target, m_start+1,m_end, n_start, n_end);
}
}
public boolean searchMatrix(int[][] matrix, int target) {
RightCornerRecur(matrix, target,0,matrix.length-1, 0, matrix[0].length-1);
return IfFind;
}
}
右上角可以用来比较剪掉一些元素,左下角同样可以,下面的代码中加上了左下角元素与target元素的比较,最终的运行时间是384ms,而上述只考虑右上角的运行时间是472ms。
public class Solution {
private boolean IfFind = false;
private void RightCornerRecur(int[][] matrix,int target,int m_start,int m_end,int n_start,int n_end){
if(m_start > m_end || n_start > n_end)
return;
if(m_start < 0 || n_start < 0 || m_end >= matrix.length || n_end >= matrix[0].length)
return;
if(matrix[m_start][n_end] == target){
IfFind = true;
return;
}
if(matrix[m_start][n_end] > target)
RightCornerRecur(matrix, target, m_start, m_start, n_start, n_end-1);
else {
if(matrix[m_end][0] == target){
IfFind = true;
return;
}
if(matrix[m_end][0] < target)
RightCornerRecur(matrix, target, m_end, m_end, n_start+1, n_end);
else
RightCornerRecur(matrix, target, m_start+1,m_end-1, n_start, n_end);
}
}
public boolean searchMatrix(int[][] matrix, int target) {
RightCornerRecur(matrix, target,0,matrix.length-1, 0, matrix[0].length-1);
return IfFind;
}
}
【leetcode刷题笔记】Search a 2D Matrix的更多相关文章
- LeetCode刷题笔记和想法(C++)
主要用于记录在LeetCode刷题的过程中学习到的一些思想和自己的想法,希望通过leetcode提升自己的编程素养 :p 高效leetcode刷题小诀窍(这只是目前对我自己而言的小方法,之后会根据自己 ...
- Leetcode 74 and 240. Search a 2D matrix I and II
Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the follo ...
- 18.9.10 LeetCode刷题笔记
本人算法还是比较菜的,因此大部分在刷基础题,高手勿喷 选择Python进行刷题,因为坑少,所以不太想用CPP: 1.买股票的最佳时期2 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. ...
- LeetCode刷题笔记 - 12. 整数转罗马数字
学好算法很重要,然后要学好算法,大量的练习是必不可少的,LeetCode是我经常去的一个刷题网站,上面的题目非常详细,各个标签的题目都有,可以整体练习,本公众号后续会带大家做一做上面的算法题. 官方链 ...
- 【leetcode刷题笔记】Rotate Image
You are given an n x n 2D matrix representing an image. Rotate the image by 90 degrees (clockwise). ...
- Leetcode刷题笔记(双指针)
1.何为双指针 双指针主要用来遍历数组,两个指针指向不同的元素,从而协同完成任务.我们也可以类比这个概念,推广到多个数组的多个指针. 若两个指针指向同一数组,遍历方向相同且不会相交,可以称之为滑动窗口 ...
- 【leetcode刷题笔记】Word Search
Given a 2D board and a word, find if the word exists in the grid. The word can be constructed from l ...
- 【leetcode刷题笔记】Spiral Matrix
Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral or ...
- 【leetcode刷题笔记】Unique Binary Search Trees
Given n, how many structurally unique BST's (binary search trees) that store values 1...n? For examp ...
随机推荐
- 基于Linux整形时间的常用计算思路
上一次分享了Linux时间时区详解与常用时间函数,相信大家对Linux常见时间函数的使用也有了一定的了解,在工作中遇到类似获取时间等需求的时候也一定能很好的处理.本文基于Linux整形时间给出一些简化 ...
- 【BZOJ1778】[Usaco2010 Hol]Dotp 驱逐猪猡 期望DP+高斯消元
[BZOJ1778][Usaco2010 Hol]Dotp 驱逐猪猡 Description 奶牛们建立了一个随机化的臭气炸弹来驱逐猪猡.猪猡的文明包含1到N (2 <= N <= 300 ...
- 【CodeM初赛B轮】A 贪心
[CodeM初赛B轮]A 题目大意:给你一棵树,起初所有点都是白色的,你每次都能选择一个白点i,将这个点i到根路径上的所有到i的距离<k[i]的点都染成黑色(根和i也算,已经被染成黑色的点还是黑 ...
- RMQ with Shifts(线段树)
RMQ with Shifts Time Limit:1000MS Memory Limit:65535KB 64bit IO Format:%I64d & %I64u Pra ...
- 九度OJ 1200:最大的两个数 (最值)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:2904 解决:761 题目描述: 输入一个四行五列的矩阵,找出每列最大的两个数. 输入: 输入第一行包括一个整数n(1<=n<= ...
- nginx学习之web服务器(四)
1. 定义一个虚拟服务器 http { server { # Server configuration } } 可以在http {}块里面添加多个server {}块,每一个server {}块代表一 ...
- Java基础 - 输出
输出在各个开发语言中起着至关重要的作用,方便编写代码时进行调试,在java中使用 System.out.println 进行输出 public class Main { public static v ...
- IaaS,PaaS,Saas 云服务的介绍
云服务只是一个统称,可以分成三大类. IaaS:基础设施服务,Infrastructure-as-a-service PaaS:平台服务,Platform-as-a-service SaaS:软件服务 ...
- Js 抱错:::SyntaxError: identifier starts immediately after numeric literal
SyntaxError: identifier starts immediately after numeric literal 今天写了个onclick()方法,有这样的一个变量4028b88161 ...
- bug_1——oracle listagg():列转行
select listagg(字段名 ,',') within group (order by 字段名) from表 where 条件 listagg():列转行 WM_CONCAT():和并列 ...