福哥答案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. You need to run build with JDK or have tools.jar on the classpath.If this occures during eclipse build make sure you run eclipse under JDK as well 错误

    我打开项目报错是这样的  pom.xml jdk配置什么的都是好的    但是还是报错 解决错误 : 1.打开你eclipse的根目录,找到eclipse.ini  这个文件夹打开 2.打开是这个样子 ...

  2. python之pyqt5-第一个pyqt5程序-图像压缩工具-小记

    (如想转载,请联系博主或贴上本博地址) 此为学习pyqt5的第一个程序,图像压缩工具. 因为比较简单,下面直接贴上代码. 效果图如下: # -*- coding: utf-8 -*- import s ...

  3. 在目标服务器Centos7上安装 GitLab Runner

    1.安装提示: 注意:如果你打算通过gitlab-ci,将项目部署到"目标服务器"上,那么这个GitLab Runner就要提前安装到这个"目标服务器"上 (这 ...

  4. 中文数据导入到hive,出现乱码

    中文数据导入到hive,出现乱码 解决方法: 右键要导入的数据文件,选择用Notepad++打开,然后点击"编辑"-->转为UTF-8,最后保存即可. 然后在上传到指定路径下 ...

  5. python调用adb shell

    最近在用python做一个小工具,自动执行一些adb shell命令,使用subprocess.Popen来实现. 不过遇到个问题就是执行adb shell后就无法执行后面adb shell里的命令了 ...

  6. vue树形结构图

    1.下载插件:cnpm i vue2-org-tree 2.下载less-loader不然报错(this.getOptions is not a function):npm install less- ...

  7. XCode汇编调试

    开启Xcode汇编调试 选中Always Show Disassembly项. XCode -> Debug -> Debug Workflow -> Always Show Dis ...

  8. day11-SpringBoot中注入Servlet&Filter&Listener

    SpringBoot中注入Servlet&Filter&Listener 1.基本介绍 文档:SpringBoot中注入Servlet&Filter&Listener ...

  9. DOM属性节点加其他节点的操作

     节点属性 nodeType 返回值为数值                 节点类型(nodeType)    节点名字(nodeName)    节点值(nodeValue)        元素节点 ...

  10. python进程之进程池、线程池与异步回调机制

    进程线程不可以无限制的创建,因为有硬件的限制.为了避免资源被程序消耗过度,可以使用进程池或线程池的技术. 池     降低程序的执行效率,但是保证了计算机硬件的安全 进程池     提前创建好固定数量 ...