CS-Wiki CS-Wiki
Home
知识体系总览
  • 数据结构与算法
  • 计算机网络
  • 操作系统
  • MySQL
  • Redis
  • 设计模式
  • Java 基础
  • Java 集合
  • Java 并发
  • Java 虚拟机
  • Spring
  • Kafka
  • 校招扫盲
  • 项目推荐
  • 唠唠嗑儿
  • 读书笔记
归档
GitHub (opens new window)
Home
知识体系总览
  • 数据结构与算法
  • 计算机网络
  • 操作系统
  • MySQL
  • Redis
  • 设计模式
  • Java 基础
  • Java 集合
  • Java 并发
  • Java 虚拟机
  • Spring
  • Kafka
  • 校招扫盲
  • 项目推荐
  • 唠唠嗑儿
  • 读书笔记
归档
GitHub (opens new window)
  • 刷题模板汇总
  • 一些刷题小技巧
  • 整数 and 位运算

  • 数组

  • 链表

  • 哈希表

  • 字符串

  • 栈

  • 队列

  • 二叉树

  • 前缀树

  • 二分查找

    • 二分查找理论基础
    • 标准的二分查找

      • 二分查找
      • 查找插入位置
      • 寻找峰值
      • x 的平方根
      • 找出给定方程的正整数解
      • 排序数组中只出现一次的数字
      • 二维数组中的查找
        • 📃 题目描述
        • 🔔 解题思路
          • 二分查找
          • 线性查找(推荐)
      • 按权重生成随机数
      • 狒狒吃香蕉
    • 二分查找左边界

    • 二分查找右边界

    • 二分查找左右边界

    • 二分查找极值点

  • 双指针法

  • 区间求和问题

  • 排序

  • 回溯算法

  • 贪心算法

  • 动态规划

  • 图

  • 数学

  • 自动机

  • 海量数据和空间限制

  • 05-数据结构与算法
  • 二分查找
  • 标准的二分查找
小牛肉
2022-09-11
目录

二维数组中的查找

# 📃 题目描述

题目链接:剑指 Offer 04. 二维数组中的查找 (opens new window)

image-20220923112123994

# 🔔 解题思路

# 二分查找

每行每行的二分查找

class Solution {
    public boolean findNumberIn2DArray(int[][] matrix, int target) {
        if (matrix == null || matrix.length == 0 || matrix[0].length == 0) {
            return false;
        }

        int row = matrix.length;
        int col = matrix[0].length;

        int right = col - 1;
        for (int i = 0; i < row; i ++) {
            int left = 0;
            while (left <= right) {
                int mid = left + ((right - left) >> 1);
                if (matrix[i][mid] == target) {
                    return true;
                }
                else if (matrix[i][mid] < target) {
                    left = mid + 1;
                }
                else {
                    right = mid - 1;
                }
            }
        }

        return false;
    }
}

时间复杂度 O(NLogN)

# 线性查找(推荐)

解题思路:利用二维数组行列递增特性

主要思路:

由于行列递增,可以得出:

  • 在一列中的某个数字,其上的数字都比它小
  • 在一行中的某个数字,其右的数字都比它大

搜索流程:

  • 首先从数组左下角搜索.
  • 如果当前数字大于target,那么查找往上移一位,如果当前数字小于target,那么查找往右移一位。
  • 查找到 target,返回true; 如果越界,返回false;

示例如下:

时间复杂度 O(M + N)

class Solution {
    public boolean findNumberIn2DArray(int[][] matrix, int target) {
        if (matrix == null || matrix.length == 0 || matrix[0].length == 0) {
            return false;
        }

        int row = matrix.length;
        int col = matrix[0].length;

        int i = row - 1;
        int j = 0;

        while (i >= 0 && j < col) {
            if (matrix[i][j] == target) {
                return true;
            }
            // 右移 增大
            else if (matrix[i][j] < target) {
                j ++;
            }
            // 上移 减小
            else {
                i --;
            }
        }

        return false;
    }
}

🎁 公众号

各位小伙伴大家好呀,叫我小牛肉就行,目前在读东南大学硕士,上方扫码关注公众号「飞天小牛肉」,与你分享我的成长历程与技术感悟~

帮助小牛肉改善此页面 (opens new window)
Last Updated: 2023/02/16, 11:27:10
排序数组中只出现一次的数字
按权重生成随机数

← 排序数组中只出现一次的数字 按权重生成随机数→

最近更新
01
02
线上环境 CPU 使用率飙升如何快速排查?
03-05
03
面试官再跟你说中国没有根服务器,雪人计划让他了解下
02-23
更多文章>
Theme by Vdoing | Copyright © 2019-2023 飞天小牛肉 | 皖ICP备2022008966号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式