福哥答案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. gogetssl申请的域名证书私钥文件丢了,可以重新申请个吗?

    因为gogetssl是不保存我们使用浏览器生成的KEY文件的,CSR文件倒是可以有办法再找到 也就是说Certificate Signing Request(CSR)可以想想办法,但是Your Pri ...

  2. 记一个jdbc创建数据库、用户操作时,创建新用户提示CREATE USER权限问题

    手写存储表数据库信息,访问链接动态数据源操作: mysql: 1.root登录服务器 进入数据库 mysql -u root -p2.创建数据库 create database shop; shop ...

  3. DNS BIND之dnssec安全

    公司一大早域名解析出问题了,网抓项目都无法抓取到进销存数据. 查询后发现是运维周末重启了dns服务. 网上找到的解决方法: 在BIND的配置文件(/etc/named.conf)中打开DNSSEC选项 ...

  4. 2022年8月学科能力综合测试(TACA)试题解答 Mathemaitca练习

    目录 试题地址 1 4 5 10 13 你让我猜我肯定这么猜 试题地址 https://k.sina.com.cn/article_2897328623_acb1b9ef019011qen.html ...

  5. Vue基础语法整理

    vue基础用法&基础原理整理 1. vue基础知识和原理 1.1 初识Vue 想让Vue工作,就必须创建一个Vue实例,且要传入一个配置对象 demo容器里的代码依然符合html规范,只不过混 ...

  6. 宝塔上部署FastAPI的步骤和一些注意点

    为了运维方便,选择直接用宝塔来管理python fastapi的项目,虽然直接部署可能性能更好更灵活,但是我选择了低层本,每个人的选择可能是不一样的,各有 考虑吧. 本文的大逻辑是先写一个hellow ...

  7. 【实战】SpringBoot+uniapp+uview打造H5+小程序+APP入门学习的聊天小项目

    JavaDog Chat v1.0.0 基于SpringBoot+uniapp简单通讯聊天软件 项目介绍 JavaDog Chat 简单通讯聊天软件是基于SpringBoot+MybatisPlus+ ...

  8. Flutter中如何取消任务

    前言 在开发过程中,取消需求是很常见的,但很容易被忽略.然而,取消需求的好处也很大.例如,在页面中会发送很多请求.如果页面被切走并处于不可见状态,就需要取消未完成的请求任务.如果未及时取消,则可能会导 ...

  9. 方差分析3——正交表与正交实验设计(R语言)

    正交试验设计(orthogonal design简称正交设计(orthoplan),是利用正交表(orthogonal table)科学地安排与分析多因素试验的方法,是最常用的试验设计之一.正交表是一 ...

  10. [Linux/CentOS]通过yum获取rpm安装包

    1 yum获取rpm安装包 有时候你需要一个软件包在离线linux系统上安装,如果自己找软件包麻烦,可以linux yum下载需要的软件包. 准备工作是找一台能够联网的linux,并准备好了yum及y ...