面试题 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);
*/