1、斐波那契数列优化
使用滚动变量,保存当前计算结果和前两项值
(1)R=A+B
(2)更新计算对象,A=B,B=R
#include<iostream>
using namespace std;int fun(int n)
{if (n == 0)return 0;if (n == 1 || n == 2)return 1;int num1=1;int num2=1;int sum=0;int i = 3;while (i<= n){sum = num1 + num2;num1 = num2;num2 = sum;//cout << sum << endl;i++;}return sum;
}int main()
{cout<<fun(10);return 0;
}
2、防止越界方法
1e9+7——int范围内最大的素数——1000000007
F(51)=F(49)%(1e9+7)+F(50)%(1e9+7)
3、青蛙爬楼梯
一只青蛙,一次可以爬一级楼梯,也可以爬两级,求n级台阶有多少种跳法
1级:1次1级
2级:1次1级 1次1级
1次2级
3级:1次1级 2级的情况
1次2级 1级的情况
F(n)=F(n-1)+F(n-2) F(1)=1 F(2)=2
4、分治法
把大的问题分解为若干个解决方案完全相同的子问题
1、问题难度随数据规模增加而减小
2、问题可分
3、子问题的解可合并
4、子问题的解相互独立
二分查找
第一种方法
#include<iostream>
#include<vector>
using namespace std;int BinargChop(vector<int>&nums,int target)
{int left = 0;int right = nums.size()-1;int middle=0;while (left<right){middle = (left + right) / 2;if (nums[middle] < target){left = middle+1;}else if (nums[middle] > target){right = middle-1;}if (nums[middle] == target){return middle;}}}int main()
{vector<int>nums = { 1,12,36,56,88,99 };int target = 88;cout << BinargChop(nums, target);
}
第二种方法
#include<iostream>
#include<vector>
using namespace std;int BinargChop(vector<int>& nums, int target,int left,int right)
{int middle = 0;while (left < right){middle = (left + right) / 2;if (nums[middle] < target){left = middle + 1;BinargChop(nums, target, left, right);}else if (nums[middle] > target){right = middle - 1;BinargChop(nums, target, left, right);}if (nums[middle] == target){return middle;}}
}int main()
{vector<int>nums = { 1,12,36,56,88,99 };int target = 99;int left = 0;int right = nums.size()-1;cout << BinargChop(nums, target,left,right);
}