#include <iostream> #include "test.h" using namespace std; int getTheLastestK(int num[], int length, int k); int getFirstK(int num[], int length, int k); int getNumberOfK(int num[], int length, int k); int main() { int num[] = { 1, 2, 3, 3, 3, 3, 4, 5 }; cout << getNumberOfK(num, sizeof(num) / sizeof(int), 3) << endl; return 0; } int getNumberOfK(int num[], int length, int k) { if (num == nullptr || length <= 0) { cout << "invalid input." << endl; return -1; } int firstK = getFirstK(num, length, k); int lastestK = getTheLastestK(num, length, k); if (firstK == -1 || lastestK == -1) { return -1; } else { return lastestK - firstK + 1; } } int getFirstK(int num[], int length, int k) { if (num == nullptr || length <= 0) { cout << "invalid input." << endl; return -1; } int start = 0; int end = length - 1; int middle = (start + end) / 2; bool isExist = false; while (!(num[middle] == k && num[middle - 1] != k) && start <= end) { if (num[middle] > k) { end = middle - 1; middle = (start + end) / 2; } else if (num[middle] < k) { start = middle + 1; middle = (start + end) / 2; } else if (num[middle] == k) { isExist = true; end = middle - 1; middle = (start + end) / 2; } } if (isExist == false) { cout << "Don't have the number k." << endl; return -1; } return middle; } int getTheLastestK(int num[], int length, int k) { if (num == nullptr || length <= 0) { cout << "invalid input." << endl; return -1; } int start = 0; int end = length - 1; int middle = (start + end) / 2; bool isExist = false; while (!(num[middle] == k && num[middle + 1] != k) && start <= end) { if (num[middle] > k) { end = middle - 1; middle = (start + end) / 2; } else if (num[middle] < k) { start = middle + 1; middle = (start + end) / 2; } else if (num[middle] == k) { isExist = true; start = middle + 1; middle = (start + end) / 2; } } if (isExist == false) { cout << "Don't have the number k." << endl; return -1; } return middle; }
剑指Offer --> Question 38
最新推荐文章于 2022-05-03 15:39:55 发布