二分查找算法
方式一:递归实现
/*
归的二分查找
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)一定一定要还原现场,这是回溯的决定性条件
贪心算法
基本原理: 每一步都选择局部最优解,而尽量不考虑对后续的影响,最终达到全局最优解。
局限性: 贪心算法不能保证获得全局最优解,但在某些问题上具有高效性。
特征: 贪心选择性质、最优子结构性质(根据我的观察,很多贪心的题目会出现“不同的操作产生的贡献相同”的特征,在此特征下我们每次选择代价最小的。
贪心算法实现步骤:
1、确定问题的最优子结构(贪心往往跟排序、优先队列等一起出现)。
2、构建贪心选择的策略,可能通过“分类讨论”、“最小代价”、“最大价值”等方式来思考贪心策略。简单验证贪心的正确性,采用句式一般是:这样做一定不会使得结果变差、不存在比当前方案更好的方案等等。
3、通过贪心选择逐步求解问题,直到得到最终解。