剑指offer-数字在排序数组中出现的次数

来源:互联网 发布:淘宝省市区三级联动js 编辑:程序博客网 时间:2024/06/16 17:13

问题

题目:[剑指offer-数字在排序数组中出现的次数]

思路

朴素的思路不说了,扫一遍就行了。

代码

class Solution {public:    int GetNumberOfK(vector<int> data ,int k) {        int sz = data.size();        if(!sz) return 0;        int i = 0;        int cnt = 0;        // find the start        while( i < sz && data[i] != k ) ++i;        if( i == sz ) return 0;        while( i < sz && data[i] == k ){ ++cnt; ++i; };        return cnt;    }};

思路1

参考了这篇链接[剑指Offer面试题:32.数字在排序数组中出现的次数]

的确是学到了更好的思路,主要也是自己对于排序数组还是不够敏感。
对于数组类题目,其实常见的处理思路就那么多。如果无序,看看考虑能不能排序之后再做处理。像这种题目本生就给你有序的序列,最直接的考虑就是binary_search.

可以考虑找到K的起始位置和终止位置,直接返回下标之差+1即可。因为本生就是有序的,所以这点非常方便。

代码1

class Solution {public:    int GetNumberOfK(vector<int> data ,int k) {        int sz = data.size();        if(!sz) return 0;        int first = find_first_k( data, 0, sz-1, k );        if(-1 == first) return 0;        int last = find_last_k( data, 0, sz-1, k );        if(-1 == last) return 0;        return last - first + 1;    }private:    int find_first_k( vector<int>& arr, int low, int high, int k ){        while( low <= high ){            int mid = (low+high)/2;            if( k < arr[mid] ) high = mid - 1;            else if( arr[mid] < k ) low = mid + 1;            else{                if( low <= mid-1 ){ // 判断前一个元素是否存在                    if( arr[mid-1] != k ) return mid;                    else high = mid - 1;                }                else{                    return mid;                }            }        }        return -1;    }    int find_last_k( vector<int>& arr, int low, int high, int k ){        while( low <= high ){            int mid = (low+high)/2;            if( k < arr[mid] ) high = mid - 1;            else if( arr[mid] < k ) low = mid + 1;            else{                if( mid+1 <= high ){ // 判断后一个元素是否存在                    if( arr[mid+1] != k ) return mid;                    else low = mid + 1;                }                else{                    return mid;                }            }        }        return -1;    }};
阅读全文
0 0
原创粉丝点击