2020-11-15:手写代码:行有序、列也有序的二维数组中,找num,找到返回true,否则false?
福哥答案2020-11-15:
此题来源于leetcode240和剑指 Offer(第 2 版)面试题4。
1.线性查找。
从二维数组的坐下角开始查找。如果当前元素等于目标值,则返回 true。如果当前元素大于目标值,则上移。如果当前元素小于目标值,则右移。
2.线性查找+二分查找。
当前元素上移和右移,采用二分法。要用到如下两道题:
2.1.在一个有序数组中,找<=某个数最右侧的位置。
2.2.在一个有序数组中,找>=某个数最左侧的位置。
golang代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 | 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 } |
执行结果如下:
公众号:福大大架构师每日一题
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具