百度笔试题2:给定如下的n*n的数字矩阵,每行从左到右是严格递增, 每列的数据也是严格递增

来源:互联网 发布:风险矩阵法 编辑:程序博客网 时间:2024/05/17 01:21

百度笔试题2

1.给定如下的n*n的数字矩阵,每行从左到右是严格递增, 每列的数据也是严格递增

1 2 3

3 5 6

4 8 9

现在要求设计一个算法, 给定一个数k 判断出k是否在这个矩阵中。 描述算法并且给出时间复杂度(不考虑载入矩阵的消耗)

最好的算法是去矩阵的最右下角或最左上角的元素,该元素在所在列和行为鞍点,即行最大列最小或者列最大行最小。例如,取最左下角的元素并记为a, 如果a>k,表明a所在的行都大于a,肯定不在此行上,只能往列去寻找,如果a<k表明a所在的列都小于k,因此肯定不在此列上,如此计算, 初始点为a[n-1][0],结束条件为i<0或者j>n,下面是代码,最差情况时间复杂度为2n-1,空间复杂度为1,比递归调用快多了。
template<class T>
bool matrixFind(T (*array)[5], int n, const T & val){
int i = n-1, j = 0;
while(i>=0 && j<=n-1){
if(a[i][j] > val){
i--;
}else if(a[i][j] < val){
j++;
}else{
return true;
}
}
return false;
}


求一个数中1的个数
最普遍的做法每次判断最低位是否为1

while (n)
{
if (n & 1) ++count;
n >>= 1;
}

另一种就是把n最右边的1变为0,能变多少次就有多少个1

while (n)
{
n &= n-1;
++count;
}
原创粉丝点击