二维矩阵搜索问题——小米面试题

简介: 二维矩阵搜索问题——小米面试题

二维矩阵搜索问题——小米面试题

编写一个高效的算法来搜索整数矩阵target中的值。其中:每行中的整数按从左到右的升序排序,每列中的整数按从上到下的升序排序。

示例:

输入:矩阵 = [[1,4,7,11,15],[2,5,8,12,19],[2,5,8,12,19],[10,13,14,17, 24],[18,21,23,26,30]],

target = 5

输出: true

算法思路,这个题有两个算法思路,一个是把二维的变成一维的,然后再进行二分查找,时间复杂度是O(nlogn)

另一个方法就是寻找规律,因为这个矩阵是从左到右,从上到下都是递增的,所以可以采用,我们从这个矩阵的右上角开始,如果当前位置的值小于目标值,那么我们向下移动一行;如果当前位置的值大于目标值,那么我们向左移动一列。我们不断重复这一过程,直到找到目标值,或者搜索区域为空,时间复杂度的话为O(m + n);

  • c++
/*采用vector的写法*/
#include<bits/stdc++.h>
using namespace std;
bool searchMatrix(vector<vector<int>>& matrix, int target)
{
    if (matrix.empty() || matrix[0].empty()) return false;
    int row = 0;
    int col = matrix[0].size() - 1;
    while(row < (int)matrix.size() && col >= 0){
        if (matrix[row][col] == target) return true;
        else if (matrix[row][col] < target) row ++;
        else col --;
    }
    return false;
}
int main()
{
    vector<vector<int>> matrix = {
        {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}
    };
    int target = 5;
    bool result = searchMatrix(matrix, target);
    cout << (result ? "true" : "false") << endl;
    return 0;
}
/*采用数组的写法*/
#include <iostream>
using namespace std;
bool searchMatrix(int matrix[5][5], int target, int rows, int cols) {
    int row = 0;
    int col = cols - 1;
    while (row < rows && col >= 0) {
        if (matrix[row][col] == target) {
            return true;
        } else if (matrix[row][col] < target) {
            row++;
        } else {
            col--;
        }
    }
    return false;
}
int main() {
    int matrix[5][5] = {
        {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}
    };
    int target = 5;
    bool result = searchMatrix(matrix, target, 5, 5);
    cout << (result ? "true" : "false") << endl;
    return 0;
}
  • Java
/*数组版*/
import java.util.*;
class Main {
    public static boolean searchMatrix(int[][] matrix, int target) {
        if (matrix == null || matrix.length == 0 || matrix[0].length == 0) {
            return false;
        }
        int row = 0;
        int col = matrix[0].length - 1;
        while (row < matrix.length && col >= 0) {
            if (matrix[row][col] == target) {
                return true;
            } else if (matrix[row][col] < target) {
                row++;
            } else {
                col--;
            }
        }
        return false;
    }
    public static void main(String[] args) {
        int[][] matrix = {
            {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}
        };
        int target = 5;
        boolean result = searchMatrix(matrix, target);
        System.out.println(result ? "true" : "false");
    }
}
/*ArrayList版*/
import java.util.*;
class Main {
    public static boolean searchMatrix(ArrayList<ArrayList<Integer>> matrix, int target) {
        if (matrix == null || matrix.size() == 0 || matrix.get(0).size() == 0) {
            return false;
        }
        int row = 0;
        int col = matrix.get(0).size() - 1;
        while (row < matrix.size() && col >= 0) {
            if (matrix.get(row).get(col) == target) {
                return true;
            } else if (matrix.get(row).get(col) < target) {
                row++;
            } else {
                col--;
            }
        }
        return false;
    }
    public static void main(String[] args) {
        ArrayList<ArrayList<Integer>> matrix = new ArrayList<>();
        matrix.add(new ArrayList<>(Arrays.asList(1, 4, 7, 11, 15)));
        matrix.add(new ArrayList<>(Arrays.asList(2, 5, 8, 12, 19)));
        matrix.add(new ArrayList<>(Arrays.asList(3, 6, 9, 16, 22)));
        matrix.add(new ArrayList<>(Arrays.asList(10, 13, 14, 17, 24)));
        matrix.add(new ArrayList<>(Arrays.asList(18, 21, 23, 26, 30)));
        int target = 5;
        boolean result = searchMatrix(matrix, target);
        System.out.println(result ? "true" : "false");
    }
}
相关文章
|
7月前
|
消息中间件 安全 前端开发
小米面试:如何实现优先级线程池?
我们知道,线程池中的所有线程都是由统一的线程工厂来创建的,当我们指定线程工厂时,线程池中的所有线程会使用我们指定的线程工厂来创建线程;但如果没有指定线程工厂,则会使用默认的线程工厂 DefaultThreadFactory 来创建线程,核心源码如下: ```java DefaultThreadFactory() { @SuppressWarnings("removal") SecurityManager s = System.getSecurityManager(); group = (s != null) ? s.getThreadGroup() :
80 1
小米面试:如何实现优先级线程池?
|
2月前
|
缓存 监控 算法
小米面试题:多级缓存一致性问题怎么解决
【10月更文挑战第23天】在现代分布式系统中,多级缓存架构因其能够显著提高系统性能和响应速度而被广泛应用。
60 3
|
6月前
|
网络协议 算法 安全
小米安卓春招面试一面
小米安卓春招面试一面
51 3
|
7月前
|
存储 数据可视化 算法
最新Python-Matplotlib可视化(9)——精通更多实用图形的绘制,2024年最新小米面试题库
最新Python-Matplotlib可视化(9)——精通更多实用图形的绘制,2024年最新小米面试题库
最新Python-Matplotlib可视化(9)——精通更多实用图形的绘制,2024年最新小米面试题库
|
7月前
|
数据采集 算法 Python
2024年Python最全python基础入门:高阶函数,小米面试编程题
2024年Python最全python基础入门:高阶函数,小米面试编程题
|
7月前
|
消息中间件 NoSQL Java
意难平!面试小米,一步之遥...
在小米的面试中,一位硕士生经历三面后未能成功,显示出今年竞争的激烈。本文分享了近期小米面试的部分真题,涵盖电商系统开发问题(如高并发、库存管理、支付和刷单处理)、Redis应用场景(如秒杀和扫描Key)、Redis性能原因、分布式锁实现、TCP与HTTP区别、HTTPS流程、ThreadLocal原理、HashMap线程不安全原因、synchronized与volatile对比、Thr
166 0
|
存储 SQL 设计模式
C++面试题,阿里、百度、腾讯、华为、小米100道C++面试题目及答案
C++面试题,阿里、百度、腾讯、华为、小米100道C++面试题目及答案
|
存储 安全 前端开发
C++面试题,阿里、百度、腾讯、华为、小米100道C++面试题目及答案(下)
C++面试题,阿里、百度、腾讯、华为、小米100道C++面试题目及答案
|
JavaScript 前端开发
大厂面试-小米
大厂面经-小米
93 0
|
编解码 缓存 C语言
【数字设计】小米科技_笔试面试题目分享
【数字设计】小米科技_笔试面试题目分享
【数字设计】小米科技_笔试面试题目分享