题解 | #顺时针旋转矩阵#

数字在升序数组中出现的次数

http://www.nowcoder.com/practice/70610bf967994b22bb1c26f9ae901fa2

方法一:

  • 暴力,从头开始找到第一个值为k的元素,再计算连续的k的个数即可。缺点:没有利用好有序数组的特性。

代码如下:

class Solution {
public:
    int GetNumberOfK(vector<int> data ,int k) {
        int ans;
        for(int i=0;i<data.size();i++){
            if(data[i]==k){
                int j=i+1;
                //从第一个为k的元素起,找到第一个不为k的元素止。
                while(j<data.size()&&data[j]==k)
                    j++;
                return j-i;
            }
        }
        return 0;
    }
};

复杂度分析:

时间复杂度:O(n),最坏情况,k在数组末尾,需要n次for循环。
空间复杂度:O(1),常数个临时变量。

方法二:

  • 利用数组有序的特征,考虑使用二分法
  • 二分法找到值为k的元素,然后再寻找附近连续的k的个数。

图解如下:

图片说明

代码如下:

class Solution {
public:
    int GetNumberOfK(vector<int> data ,int k) {
        int ans;
        int left=0,right=data.size()-1,mid;
        while(left<=right){
            //二分法寻找等于k的值。
            mid=(left+right)/2;
            if(data[mid]<k){
                left=mid+1;
            }
            else if(data[mid]>k){
                right=mid-1;
            }
            else{
                //找到mid附近值都等于k的数目。
                int i=mid-1,j=mid+1;
                //此处的while循环的判断条件也可以是i>=left,j<=right,不过执行起来两者并没有区别。
                while(i>=0&&data[i]==k)
                    i--;
                while(j<=data.size()-1&&data[j]==k)
                    j++;
                return j-i-1;
            }
        }
        return 0;
    }
};

复杂度分析:

时间复杂度:O(n),二分法找到等于k的数是O(logn),还受到k的数量的影响,最坏情况下全部为k则需要O(n)。
空间复杂度:O(1),常数个临时变量。

全部评论

相关推荐

03-29 17:05
门头沟学院 Java
asdasdasda...:我前段时间找工作焦虑,有几天连续熬夜熬穿了,然后心脏突然不舒服,立马躺床上睡觉了,然后第二天还是不舒服,去看医生说是心率不齐,吓得我后面天天早早睡觉,调养身体,过了好几天才好过来。所以真的,工作这些东西哪有那么重要,最多钱多一点钱少一点,降低物欲。活着才是最重要的,现在想想真的后怕
如何排解工作中的焦虑
点赞 评论 收藏
分享
评论
2
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务