程序 = 数据结构 + 算法。
程序用以处理数据,发现数据表象背后的客观规律,用代码实现此规律即程序。写程序就像雕一件艺术品一样,最精髓在于对表面现象背后本质的思考,即算法,代码只是实现算法的途径,根据具体问题,选择最为合适的编程语言和数据结构,达到时间和空间的平衡。
本文主要以python和c++作为编程语言。python具有灵活、强大的科学计算以及众多计算库等优点,c++具有速度快。
目录
1、数据结构
2、算法
2.1、算法思想
2.2、排序算法
2.3、查找算法
3、切题方法
4、经典算法题
1、数据结构
2、算法
算法是核心,包括以下三个内容,最为核心的八大算法思想,应该确切的分析题目的基础上,选择最为恰当的算法思路。十大排序和七大查找是程序最常用的算法,根据实际情况选择合适的代码,灵活贯通。
2.1 算法思想
枚举法、也叫暴力法,大部分问题都可以采用此法穷举得出结果,虽然能解决问题但是考虑时效性。
分治思想,分解、解决、合并。将一个大的问题分解成若干子问题,并且子问题相互独立,解决子问题后合并即为结果。
递归的思想,当子问题和原问题有着相似的结构,程序自身调用自身。用递归的思路去分析问题,但是采用借助存储空间保存中间结果值基于顺序方式实现。
动态规划是将问题划分为若干阶段,当前的阶段依赖于上一个阶段,亦子问题之间具有耦合。划分阶段采用分治的思想,解决子问题的冗余借助辅助存储空间缓存当前的决策,依次从若干阶段中选择最优的决策即为最优解。采用的递归的思路分析问题,但是采用递推的方式解决问题。递推有顺推和逆推两种方式。代码实现部分采用四个步骤,首先定义状态、状态初始化、转态转移、选择最优解。
贪心算法和动态规划类似,也需要将一个大的问题划分为若干阶段,选择若干阶段的局部最优解便是全局解,围绕问题的最优解一定由在贪心策略中存在的子问题的最优解得来的想法。
回溯法深度优先搜索堆栈活结点的所有可行子结点被遍历后才被从栈中弹出找出满足约束条件的所有解。
分支限界法广度优先或最小消耗优先搜索队列、优先队列每个结点只有一次成为活结点的机会找出满足约束条件的一个解或特定意义下的最优解
2.2 排序算法
2.3 查找算法
3、切题思路
从设计和分析两个大的角度入手,设计是采用合适的数据结构和算法,分析是从时间和空间两个方面衡量程序的优劣。从以下四个小节切题。
3.1 Clarification
1、对问题进行剖析,通过不同的角度分析问题的本质,正常数据的逻辑结构外加特殊数据的处理,核心要发现杂乱数据背后的客观规律;
2、程序是对数据流的操作,要对程序的入口进行分析,边界条件,正常数据以及极端数据;
3、明确目标,即该问题最终我们想要的是什么结果;
3.2 Possible Solution
不管白猫、黑猫,抓住老鼠就是好猫。解法没有好坏之分,只有最合适。应客观的承认,解法是循序渐进,不断优化的,从最笨的方法到最优解需要过程,以衡量时间和空间复杂度为标准;
1、通解或者暴力求解法,针对此问题,可能不是最好的办法,但是可以解决此问题;
2、计算机科学归根到底是数理统计,回归数学解决此问题,从数学的角度思考该问题,可能解法是数学公式;
3、Optional solution,根据当前需求,相比时间要优先于空间,如果不是硬件资源很重要的比如嵌入式编程,尽可能以空间换时间;选择最合适的算法,任何问题都可以采用分治的思想解决,将大的任务进行分解成小的任务进行解决;针对不同的解法都要给出时间和空间算法复杂度,其复杂度是看是否随着数据规模n的变化而变化;
3.3 Coding
五大代码框架。包括递归、深度优先、广度优先、二分、动态规划等。
3.4 Test Cases
验证首节提出的程序入口,边界条件、正常数据以及极端数据的处理能力,测试其完整性、规范性、鲁棒性以及冗余性。
4、经典算法题
A、数据结构
1、数组 二维数组中的查找 顺时针打印矩阵 数组中出现次数超过一半的数字 把数组排成最小的数 数组中的逆序对 数字在排序数组中出现的次数 数组中只出现一次的数字
2、字符串 替换空格 字符串的排列 第一个只出现一次的字符位置 和为s的连续正数序列 和为s的两个数字 左旋转字符串 翻转单词顺序列
3、链表 从尾到头打印链表 链表中倒数第k个节点 反转链表 翻转链表 翻转链表对 环链表 合并两个排序的链表 复杂链表的复制 二叉搜索树与双向链表 两个链表的第一个公共节点
4、栈 用两个栈实现队列 包含min函数的栈 栈的压入弹出序列 有效的括号
5、队列 栈模拟队列 优先队列 数据流中第k大值 窗口滑动中的最大值
6、树 重建二叉树 树的子结构 二叉树的镜像 从上往下打印二叉树 二叉搜索树的后序遍历序列 二叉树中和为某一值的路径 二叉树的深度 二叉树的最大深度 二叉树的最小深度 平衡二叉树 二叉树的下一个节点 对称的二叉树 验证二叉搜索树 二叉树的最近公共祖先 二叉搜索树的最近公共祖先
7、堆
8、位运算 二进制中1的个数 位1的个数 2的幂 比特位计数
数值的整数次方 调整数组顺序使奇数位于偶数前面 最小的k个数 连续子数组的最大和 整数中1出现的次数 丑数
B、算法思想
1、递推
3、循环 x的n次方
5、动态规划 三角形最小路径和 爬楼梯 乘积最大子序列 股票买卖的最佳时机
6、回溯 爬楼梯
7、分支限界
9、广度优先 从上往下打印二叉树
10、查找和排序 旋转数组的最小数字