34.数字在排序数组中出现的次数

数字在排序数组中出现的次数
  • 参与人数:2557时间限制:1秒空间限制:32768K
  • 本题知识点:  数组
  •  算法知识视频讲解

题目描述

统计一个数字在排序数组中出现的次数。
这道题不难,两个尾递归解决问题,关键是小错误不断,导致测试了几次才通过。
// 32.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <vector>
using namespace::std;
class Solution {
public:
	int GetNumberOfK(vector<int> data, int k) {
		if (data.size() <= 0) return -1;

		int start = getFirstIndex(data, k, 0, data.size() - 1);
		int end = getLastIndex(data, k, 0, data.size() - 1);

		if (start != -1 && end != -1)
			return end - start + 1;
		else return -1;
	}

	int getFirstIndex(vector<int>& data, int k, int start, int end) {
		if (start > end) return -1;

		int mid = (start + end) / 2;
		int midVal = data[mid];

		if (midVal == k) {
			if (mid == 0 || data[mid - 1] != k)
				return mid;
			else
				end = mid - 1;
		}
		else {
			if (midVal > k) end = mid - 1;
			if (midVal < k) start = mid + 1;
		}
		return getFirstIndex(data, k, start, end);
	}

	int getLastIndex(vector<int>& data, int k, int start, int end) {
		if (start > end) return -1;

		int mid = (start + end) / 2;
		int midVal = data[mid];

		if (midVal == k) {
			if (mid == end || data[mid + 1] != k)
				return mid;
			else
				start = mid + 1;
		}
		else {
			if (midVal > k) end = mid - 1;
			if (midVal < k) start = mid + 1;
		}
		return getLastIndex(data, k, start, end);
	}
};
int _tmain(int argc, _TCHAR* argv[])
{
	vector<int> test;
	test.push_back(1);
	test.push_back(3);
	test.push_back(3);
	test.push_back(3);
	test.push_back(3);
	test.push_back(4);
	test.push_back(5);

	Solution s;
	int result = s.GetNumberOfK(test, 2);
	return 0;
}

注意,getFirstIndex和getLastIndex的退出条件均为
if (start > end) return -1;
不能写成
if (start == end) return -1;
因为后面修改start和end时可能导致start和end溢出,不管什么情况,start大于end是不允许的。

你可能感兴趣的:(34.数字在排序数组中出现的次数)