0
点赞
收藏
分享

微信扫一扫

面试题 10.09. 排序矩阵查找,面试题 10.10. 数字流的秩

面试题 10.09. 排序矩阵查找

给定 M×N 矩阵,每一行、每一列都按升序排列,请编写代码找出某元素。

示例:

现有矩阵 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]
]

给定 target = 5,返回 true

给定 target = 20,返回 false

class Solution {
    public boolean searchMatrix(int[][] matrix, int target) {
      for(int i=0;i<matrix.length;i++){
        for(int j=0;j<matrix[i].length;j++){
            if(matrix[i][j]==target)return true;
        }
      }
      return false;
    }
}

面试题 10.10. 数字流的秩

假设你正在读取一串整数。每隔一段时间,你希望能找出数字 x 的秩(小于或等于 x 的值的个数)。请实现数据结构和算法来支持这些操作,也就是说:

实现 track(int x) 方法,每读入一个数字都会调用该方法;

实现 getRankOfNumber(int x) 方法,返回小于或等于 x 的值的个数。

注意:本题相对原题稍作改动

示例:

输入:
["StreamRank", "getRankOfNumber", "track", "getRankOfNumber"]
[[], [1], [0], [0]]
输出:
[null,0,null,1]

提示:

  • x <= 50000
  • track 和 getRankOfNumber 方法的调用次数均不超过 2000 次

class StreamRank {

    int n = 500001;
    int[] tree;

    public StreamRank() {
        tree = new int[n];
    }

    private int lowBit(int x) {
        return x & -x;
    }

    private void add(int x) {
        for (int i = x; i <= n; i += lowBit(i)) {
            tree[i] += 1;
        }
    }

    private int query(int x) {
        int ans = 0;
        for (int i = x; i > 0; i -= lowBit(i)) {
            ans += tree[i];
        }
        return ans;
    }

    public void track(int x) {
        add(x + 1);
    }

    public int getRankOfNumber(int x) {
        return query(x + 1);
    }
}

/**
 * Your StreamRank object will be instantiated and called as such:
 * StreamRank obj = new StreamRank();
 * obj.track(x);
 * int param_2 = obj.getRankOfNumber(x);
 */

举报

相关推荐

0 条评论