福哥答案2020-11-15:

此题来源于leetcode240和剑指 Offer(第 2 版)面试题4。
1.线性查找。
从二维数组的坐下角开始查找。如果当前元素等于目标值,则返回 true。如果当前元素大于目标值,则上移。如果当前元素小于目标值,则右移。
2.线性查找+二分查找。
当前元素上移和右移,采用二分法。要用到如下两道题:
2.1.在一个有序数组中,找<=某个数最右侧的位置。
2.2.在一个有序数组中,找>=某个数最左侧的位置。

golang代码如下:

package main

import "fmt"

//https://leetcode-cn.com/problems/er-wei-shu-zu-zhong-de-cha-zhao-lcof/
//https://leetcode-cn.com/problems/search-a-2d-matrix-ii/
func main() {
matrix := [][]int{
{1, 4, 7, 11, 15},
{2, 5, 8, 12, 19},
{3, 6, 9, 16, 22},
{10, 13, 14, 17, 24},
{18, 21, 23, 26, 30},
}
target := 15
fmt.Println("线性查找:", findNumberIn2DArray1(matrix, target))
fmt.Println("线性查找+二分查找:", findNumberIn2DArray2(matrix, target))
} //线性查找
func findNumberIn2DArray1(matrix [][]int, target int) bool {
N := len(matrix)
if N == 0 {
return false
}
M := len(matrix[0])
n := N - 1
m := 0
for n >= 0 && m < M {
if matrix[n][m] > target { //如果当前元素大于目标值,则上移
//↑
n--
} else if matrix[n][m] < target { //如果当前元素小于目标值,则右移
//→
m++
} else {
return true
}
}
return false
} //线性查找+二分查找
func findNumberIn2DArray2(matrix [][]int, target int) bool {
N := len(matrix)
if N == 0 {
return false
}
M := len(matrix[0])
n := N - 1
m := 0
for n >= 0 && m < M {
if matrix[n][m] > target { //在一个有序数组中,找<=某个数最右侧的位置
//↑
//n--
UP := 0
DOWN := n
index := -1
for UP <= DOWN {
mid := UP + (DOWN-UP)>>1
if matrix[mid][m] == target {
return true
} else if matrix[mid][m] < target {
index = mid
UP = mid + 1
} else {
DOWN = mid - 1
}
}
if index == -1 {
return false
} else {
n = index
} } else if matrix[n][m] < target { //在一个有序数组中,找>=某个数最左侧的位置
//→
//m++
LEFT := m
RIGHT := M - 1
index := -1
for LEFT <= RIGHT {
mid := LEFT + (RIGHT-LEFT)>>1
if matrix[n][mid] == target {
return true
} else if matrix[n][mid] > target {
index = mid
RIGHT = mid - 1
} else {
LEFT = mid + 1
}
}
if index == -1 {
return false
} else {
m = index
}
} else {
return true
}
}
return false
}

  执行结果如下:

2020-11-15:手写代码:行有序、列也有序的二维数组中,找num,找到返回true,否则false?的更多相关文章

  1. 剑指offer系列——二维数组中,每行从左到右递增,每列从上到下递增,设计算法找其中的一个数

    题目:二维数组中,每行从左到右递增,每列从上到下递增,设计一个算法,找其中的一个数 分析: 二维数组这里把它看作一个矩形结构,如图所示: 1 2 8 2 4 9 12 4 7 10 13 6 8 11 ...

  2. 【c语言】二维数组中的查找,杨氏矩阵在一个二维数组中,每行都依照从左到右的递增的顺序排序,输入这种一个数组和一个数,推断数组中是否包括这个数

    // 二维数组中的查找,杨氏矩阵在一个二维数组中.每行都依照从左到右的递增的顺序排序. // 每列都依照从上到下递增的顺序排序.请完毕一个函数,输入这种一个数组和一个数.推断数组中是否包括这个数 #i ...

  3. ytu 1050:写一个函数,使给定的一个二维数组(3×3)转置,即行列互换(水题)

    1050: 写一个函数,使给定的一个二维数组(3×3)转置,即行列互换 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 154  Solved: 112[ ...

  4. jQuery写省级联动列表,创造二维数组,以及如何存/调用二维数组中的数据

    jQuery写省级联动列表,创造二维数组来存放数据,然后通过each来遍历调用,通过creatTxtNode创建文本节点,通过createElement创建标签option,在通过append将文本写 ...

  5. C语言:将3*5矩阵中第k列的元素左移到第0列,第k列以后的每列元素依次左移,原来左边的各列依次绕到右边。-在m行m列的二维数组中存放如下规律的数据,

    //将3*5矩阵中第k列的元素左移到第0列,第k列以后的每列元素依次左移,原来左边的各列依次绕到右边. #include <stdio.h> #define M 3 #define N 5 ...

  6. C语言:将带头节点的单向链表结点域中的数据从小到大排序。-求出单向链表结点(不包括头节点)数据域中的最大值。-将M*N的二维数组中的数据,按行依次放入一维数组,

    //函数fun功能是将带头节点的单向链表结点域中的数据从小到大排序. //相当于数组的冒泡排序. #include <stdio.h> #include <stdlib.h> ...

  7. C#读txt文件并写入二维数组中(txt数据行,列未知)

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.I ...

  8. python输出二维数组中,每行N个最大值的索引

    `import heapq import numpy as np import random a = np.random.randint(50,size= (4,5)) a = np.array(a) ...

  9. 通过循环按行顺序为一个5×5的二维数组a赋1到25的自然数,然后输出该数组。试编程。

  10. 前端面试手写代码——call、apply、bind

    1 call.apply.bind 用法及对比 1.1 Function.prototype 三者都是Function原型上的方法,所有函数都能调用它们 Function.prototype.call ...

随机推荐

  1. c# Visual Studio|There is no editor available for ***,make sure the application for the file type(.vb) is installed问题解决方法

    这个问题出现在在使用VS编码当中,电脑意外关机,导致的文件的缺失或者损坏. 使用反编译软件(如:ILSpy)对编译后的 .EXE文件进行反编译,在翻遍的结果中将相关代码拷贝至目标路径下,替换所需文件. ...

  2. 【MSSQL】AlwaysOn集群增加发布订阅

    在现有AlwaysOn集群增加发布订阅节点 配置 前提 节点1.节点2在AlwaysOn集群,节点3作为集群外节点使用订阅复制集群数据同步 发布对象必须要有主键 步骤 登录节点3配置分发distrib ...

  3. Kotlin 基础

    Kotlinbase.kt @file:JvmName("kotlinbaseTest") import kotlin.math.roundToInt as atoInt fun ...

  4. ElasticSearch 实现分词全文检索 - match、match_all、multimatch查询

    目录 ElasticSearch 实现分词全文检索 - 概述 ElasticSearch 实现分词全文检索 - ES.Kibana.IK安装 ElasticSearch 实现分词全文检索 - Rest ...

  5. MySQL基础随笔记

    [1]SQL语言入门      我们都知道,数据库管理人员(DBA)通过数据库管理系统(DBMS)可以对数据库(DB)中的数据进行操作,但具体是如何操作的呢?这就涉及到我们本节要讲的SQL语言.SQL ...

  6. RPA的概念和优势

    大多数人每天都会使用到一些机器人流程自动化的工具,例如读取邮件和系统,计算.生成文件和报告.而在未来,那些你不想做的枯燥的工作,也许真的可以不做了,重复化.标准化的工作都可以让机器人帮你完成.想必此刻 ...

  7. Android开发环境的搭建(一)

    开发环境的搭建 Android 应用程序一般使用 Android 软件开发工具包,采用 Java 语言来开发. Android软件开发需要用到的开发工具,如图所示: JDK:相信大家在学习Java语言 ...

  8. 最大流应用(Maximum Flow Application)

    1. 二分图匹配(Bipartite Matching) 1.1 匹配(Matching) Def. Given an undirected graph \(G = (V, E)\), subset ...

  9. salesforce零基础学习(一百二十二)通过 excel / csv创建 object

    本篇参考: https://help.salesforce.com/s/articleView?id=sf.dev_objectcreate_task_lex_from_spreadsheet.htm ...

  10. MySQL 主从复制的问题及解决方案

    更多内容,前往 IT-BLOG 复制功能是构建 MySQL 的大规模.高性能的基础,也就是所谓的 "水平扩展" 架构.我们可以通过为服务器配置一个或多个备库.同时,复制也是高可用性 ...