跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • Google 面试题:搜索二维矩阵 II
未分類
24 10 月 2020

Google 面试题:搜索二维矩阵 II

Google 面试题:搜索二维矩阵 II

資深大佬 : zzzrf 5

写出一个高效的算法来搜索 m×n 矩阵中的值,返回这个值出现的次数。 这个矩阵具有以下特性:

  • 每行中的整数从左到右是排序的。
  • 每一列的整数从上到下是排序的。
  • 在每一行或每一列中没有重复的整数。

点此在线做题

例 1:

输入: [[3,4]] target=3 输出:1 

例 2:

输入:     [       [1, 3, 5, 7],       [2, 4, 7, 8],       [3, 5, 9, 10]     ]     target = 3 输出:2 

算法:搜索 /模拟

根据题意,每行中的整数从左到右是排序的,每一列的整数从上到下是排序的,在每一行或每一列中没有重复的整数。那么我们只要从矩阵的左下角开始向右上角找,若是小于 target 就往右找,若是大于 target 就往上找

  • 从左下角即(n-1,0)处出发
  • 如果 matrix[x][y] < target 下一步往右搜
  • 如果 matrix[x][y] > target 下一步往上搜
  • 如果 matrix[x][y] = target 下一步往[x-1][y+1]即右上角搜,因为是有序的,每一行每一列中每个数都是唯一的

复杂度分析

  • 时间复杂度 O(n+m)
    • 左下角往右上角呈阶梯状走,长度为 n+m
  • 空间复杂度 O(size(matrix))
    • 地图的大小
public class Solution {     /**      * @param matrix: A list of lists of integers      * @param target: An integer you want to search in matrix      * @return: An integer indicate the total occurrence of target in the given matrix      */     public int searchMatrix(int[][] matrix, int target) {         int ans = 0;         int n = matrix.length,m = matrix[0].length;         if (n == 0 || m==0) {             return 0;         }         //从左下角往右上角走,(x,y)=(n-1,0)         int x = n - 1,y = 0;         while (x >= 0 && y < m) {             //如果 matrix[x][y]等于 target,则找到一个相等的值,由于严格排序,直接跳到右上角继续搜             if (matrix[x][y] == target) {                 ans++;                 x--;                 y++;             }             //如果 matrix[x][y]比 target 大,则往上走             else if (matrix[x][y] > target) {                 x--;             }             //如果 matrix[x][y]比 target 小,则往右走             else {                 y++;             }         }         return ans;     } } 

大佬有話說 (2)

  • 資深大佬 : 8Cangtou

    func searchMatrix (matrix [][]int, target int) int {
    // write your code here
    var count int
    for i := 0; i < len(matrix); i++{
    if target < matrix[i][0] || target > matrix[i][len(matrix[i])-1]{
    continue
    }
    if binary_search(matrix[i], target){
    count++
    }
    }
    return count
    }

    func binary_search(nums []int, target int) bool{
    begin := 0
    end := len(nums) – 1
    for begin + 1 < end{
    mid := begin + (end – begin) / 2
    if nums[mid] > target{
    end = mid
    }else if nums[mid] < target{
    begin = mid
    }else {
    return true
    }
    }

    if nums[begin] == target{
    return true
    }else if nums[end] == target{
    return true
    }else {
    return false
    }
    }

  • 主 資深大佬 : zzzrf

    @8Cangtou 这莫非就是传说中的手撕代码

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具