10(斐波那契数列)、11(旋转数组的最小数字)

题目10分析:(斐波那契数列)
斐波那契数列的实现
递归思路:
1.递归调用函数
循环思路:
1.从i=2开始循环,f(i)=上次的值+上上次的值

2.保存当前值和上次的值

#include <iostream>

using namespace std;

long long fibonacci_digui(int n)
{
	int result[] = { 0,1 };
	if (n<2)
		return result[n];
	return fibonacci_digui(n - 1) + fibonacci_digui(n - 2);
}

long long fibonacci_for(int n)
{
	int result[] = { 0,1 };
	if(n<2)
		return result[n];
	int last_result = result[1];
	int last_last_result = result[0];
	int cur_result = 0;
	for (int i = 2; i <= n; i++)
	{
		cur_result = last_result + last_last_result;

		last_last_result = last_result;
		last_result = cur_result;
	}
	return cur_result;
}
void main()
{
	int result;
	int n;
	cout << "输入n:";
	cin >> n;
	cout << "递归计算的结果:" << fibonacci_digui(n) << endl << "循环计算的结果:" << fibonacci_for(n) << endl;
}
题目11分析:(旋转数组的最小数字)
输入旋转数组,第一子数组最后一个元素和第二子数组第一个元素相邻,且第二个子数组第一个元素最小,可利用二分查找
或者顺序查找获得中间元素,若中间元素大于p1对应元素,则在第一数组中,将p1指向中间元素;若中间元素小于p2,
则在第二数组中,将p2指向中间元素。
思路:
1.初始化p1指向第一个元素,p2指向最后一个元素, mid指向第一个元素
2.轮询p1指向元素大于p2指向元素,直至p2-p1=1
3.计算中间下标
4.若p1,p2,中间下标对应元素都相同,则使用顺序查找获得第二数组的第一个元素
5.若中间下标对应元素大于p1对应元素,则p1指向中间元素

6.若中间下标对应元素小于p2对应元素,则p2指向中间元素

#include <iostream>

using namespace std;

//顺序查找
int order_find(int *arr, int p1, int p2)
{
	int result = arr[p1];
	for (int i = p1 + 1; i <= p2; i++)//第一个数组第一个元素大于第二个数组第一个元素
	{
		if (result > arr[i])//获得最小值
			result = arr[i];
	}
	return result;
}

int rotate_min(int *arr, int length)
{
	if (arr == NULL&&length <= 0)
		throw new exception("invalid arr!");

	//1.初始化p1指向第一个元素,p2指向最后一个元素, mid指向第一个元素
	int p1 = 0;
	int p2 = length - 1;
	int mid = p1;
	while (arr[p1] >= arr[p2])
	{
		//2.轮询p1指向元素大于p2指向元素,直至p2-p1=1
		if ((p2 - p1) == 1)
		{
			mid = p2;
			break;
		}

		//3.计算中间下标
		mid = (p2 + p1) / 2;

		//4.若p1,p2,中间下标对应元素都相同,则使用顺序查找获得第二数组的第一个元素
		if (arr[p1] == arr[p2] && arr[p1] == arr[mid])
			return order_find(arr, p1, p2);

		//5.若中间下标对应元素大于p1对应元素,则p1指向中间元素
		if (arr[mid >= arr[p1]])
			p1 = mid;

		//6.若中间下标对应元素小于p2对应元素,则p2指向中间元素
		else if (arr[mid] <= arr[p2])
			p2 = mid;

	}
	return arr[mid];
}


void main()
{
	int arr[] = { 3,4,5,1,2 };
	int length = sizeof(arr) / sizeof(arr[0]);
	int result;

	result = rotate_min(arr, length);

	cout << "旋转数组最小值:" << result << endl;
}

猜你喜欢

转载自blog.csdn.net/attitude_yu/article/details/80545417