【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 ...
随机推荐
- cvm母机宕机重启后数据库修复
下午正在开周会,然后收到短信,说是X.X.X.X的机器ping不通了,一轮测试过后,发现是某台数据库服务器挂了,先不急着重启,问下tencent客服... 乖乖的好家伙,母机的主板坏了....一个小时 ...
- requestFullscreen实现全屏展示
requestFullscreen实现全屏展示. var fullContainer = document.getElementById('fullScreenContainer'); //先把元素展 ...
- html5小趣味知识点系列(一)autofocus
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Netty实战
一.Netty异步和事件驱动1.Java网络编程回顾socket.accept 阻塞socket.setsockopt /非阻塞2.NIO异步非阻塞a).nio 非阻塞的关键时使用选择器(java.n ...
- Bootstrap的js插件之轮播(carousel)
轮播请查看下面演示样例.基本已经涵盖最经常使用的一个轮播 <!DOCTYPE html> <html lang="en"> <head> < ...
- 从零开始写一个Exporter
前言 上一篇文章中已经给大家整体的介绍了开源监控系统Prometheus,其中Exporter作为整个系统的Agent端,通过HTTP接口暴露需要监控的数据.那么如何将用户指标通过Exporter的形 ...
- WCF基础之消息协定
通常定义消息的架构,使用数据协定就够了,但是有时必须将类型精确映射到soap消息,方法两种:1.插入自定义soap标头:2.另一种是定义消息的头和正文的安全属性.消息协定通过MessageContra ...
- 使用JavaScript定义一个微信小程序插件样例
var wxTimer = new wxTimer({ beginTime: "00:00:20", complete: function () { wx.redirectTo({ ...
- platform-tools
platform-tools包含开发app的平台依赖的开发和调试工具,包括 adb.fastboot等 android sdk里的各目录作用 AVD Manager.exe:虚拟机管理工具,用于建立和 ...
- F5与Ctrl+F5及地址栏输入地址回车
按F5等同于点击页面地址栏的刷新图标. 地址栏输入地址然后回车: 根据缓存内容是否过期决定是否发送请求给服务端 F5: 浏览器无论如何都得发送请求给服务端,包含If-Modified-Since/If ...