面试题38:数字在排序数组中出现的次数

来源:互联网 发布:自然灾害数据库 编辑:程序博客网 时间:2024/04/30 02:56

方法:

1. 查找这个数字的第一个位置,利用递归

2. 查找这个数字最后的位置,利用递归

3. 结束尴尬

#include<iostream>using namespace std;int get_first_k_index(int a[], int len, int k, int begin, int end){    if(begin > end){        return -1;    }    int mid_index = (begin + end)/2;    int mid_data = a[mid_index];    if(mid_data == k){        //is first        if(mid_index == 0 || (mid_index - 1 >= 0 && a[mid_index-1] < k)){            return mid_index;        }else{            end = mid_index - 1;        }    }else if(mid_data > k){        end = mid_index - 1;    }else{        begin = mid_index + 1;    }    return get_first_k_index(a, len, k, begin, end);}int get_end_k_index(int a[], int len, int k, int begin, int end){    if(begin > end){        return -1;    }    int mid_index = (begin + end)/2;    int mid_data = a[mid_index];    if(mid_data == k){        //is first        if(mid_index == len - 1 || (mid_index + 1 <= len - 1 && a[mid_index+1] > k)){            return mid_index;        }else{            begin = mid_index + 1;        }    }else if(mid_data > k){        end = mid_index - 1;    }else{        begin = mid_index + 1;    }    return get_end_k_index(a, len, k, begin, end);}int get_nums_of_k(int a[], int len, int k){    if(a == NULL || len < 0){        return -1;    }    int first = get_first_k_index(a, len, k, 0, len - 1);    cout << "first:"<< first << endl;    int end = get_end_k_index(a, len, k, 0, len - 1);    cout << "end:"<< end << endl;    if(first >= 0 && end >= first){        return end - first + 1;    }    return 0;}int main(){    int a[10] = {1,2,3,4,5,6,7,8,8,8};    int nums = get_nums_of_k(a, 10, 8);    cout << nums << endl;}


0 0
原创粉丝点击