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;
}
百度笔试题2:给定如下的n*n的数字矩阵,每行从左到右是严格递增, 每列的数据也是严格递增
最新推荐文章于 2019-08-02 09:26:39 发布