【c++】编程考试基础(下)

二分查找算法

方式一:递归实现

/*
归的二分查找
arrat:数组 , low:上界;  high:下界;  target:查找的数据; 返回target所在数组的下标 
*/
int binarySearch(int array[], int low, int high, int target) {
	int middle = (low + high)/2;
	if(low > high) {
		return -1;
	}
	if(target == array[middle]) {
		return middle;
	}
	if(target < array[middle]) {
		return binarySearch(array, low, middle-1, target);
	}
	if(target > array[middle]) {
		return binarySearch(array, middle+1, high, target);
	} 
}

方式二:循环(非递归)

/*
非递归的二分查找 
arrat:数组 , n:数组的大小;  target:查找的数据; 返回target所在数组的下标 
*/
int binarySearch2(int array[], int n, int target) {
	int low = 0, high = n, middle = 0;
	while(low < high) {
		middle = (low + high)/2;
		if(target == array[middle]) {
			return middle;
		} else if(target < array[middle]) {
			high = middle;
		} else if(target > array[middle]) {
			low = middle + 1;
		}
	}
	return -1;
}

推荐使用非递归的方式,因为递归每次调用递归时有用堆栈保存函数数据和结果。能用循环的尽量不用递归。

dq算法

动态规划讲解
动态规划的三个重要元素:
1)阶段: 将问题划分成若干个更简单的子问题进行求解,在划分的过程中,需要将问题分成若干份,即阶段;
2)状态: 一般来说,动态规划经常用于求解最值问题,每一个阶段的最值就是这个阶段的问题对应的状态;
3)状态转移方程: 就是递推式,前面说了,动态规划的基本思想是将问题转化为若干个子问题进行求解,如果通过这些子问题得出问题的最值,这个转化的数学公式就是状态转移方程。

dfs算法

DFS我们称之为深搜,通常解决一些最大最长或者所有可能的问题,一般用递归来实现。因为深搜基本上会遍历每一个结果,但与暴力法不同在于,深搜可以通过递归中不满足的条件,实现剪枝。

深搜总结起来就是:
(1)先想好递归方程
(2)处理好枚举数据,对已遍历的数据要标记
(3)一定一定要还原现场,这是回溯的决定性条件

C++算法——DFS

贪心算法

基本原理: 每一步都选择局部最优解,而尽量不考虑对后续的影响,最终达到全局最优解。
局限性: 贪心算法不能保证获得全局最优解,但在某些问题上具有高效性。
特征: 贪心选择性质、最优子结构性质(根据我的观察,很多贪心的题目会出现“不同的操作产生的贡献相同”的特征,在此特征下我们每次选择代价最小的。

贪心算法实现步骤:
1、确定问题的最优子结构(贪心往往跟排序、优先队列等一起出现)。
2、构建贪心选择的策略,可能通过“分类讨论”、“最小代价”、“最大价值”等方式来思考贪心策略。简单验证贪心的正确性,采用句式一般是:这样做一定不会使得结果变差、不存在比当前方案更好的方案等等。
3、通过贪心选择逐步求解问题,直到得到最终解。

双指针算法(待补充)

算法技巧——双指针算法

图论算法(待补充)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值