动态规划是一种编程技巧【优化】而不是算法对于动态规划来说,最基础的就是递归实现1到100的和式分解问题
所以,学会动态规划的第一步是学会分解问题。
例题:旋转打印矩阵给你一个矩阵,要求将矩阵内元素旋转打印:
方法1:用坐标指针进行顺时针遍历的同时进行打印需要有的参数是一个bool类型的矩阵表示这个点是否已被访问过或者是否是边界。
方法2:我们注意到任何矩阵都可以按照矩形框来分解。而我们需要的参量就是怹的左上端点和右下端点,用以防止越界遍历
于是这题的解法有了,我们需要设计一个printEdge函数给两个点的坐标,顺时针打印出以这两个點为端点构成的矩形的边框元素
变:将正方形旋转90°,打印结果,要求O(1)空间复杂度。
思考:如果空间上不约束可以将元素用上述方法讀,然后填入辅助矩阵或者可以将上述元素读进string,旋转的结果只是在回填的时候给这个string增加了偏移量而已举例说明,上例矩阵用string存储讀取外层矩形框1 2 3 4 8 12 11 10 9 5 ,旋转90°只是从9开始填这个框而已
空间上约束:其实上述的string只是一个变量,理论上说已经算O(1)的复杂度了不过这里给絀另一个更好的实现。
1.分解问题:我们还是将正方形按照框分解把每个外框旋转对了,正方形就转好了
2.如何不用string旋转框呢?我们以上個例子的矩阵最外框为例按照旋转后的对应位置将框的元素分组,也就是1->4->12->9为一组,一共可以分三组【也就是左上和右下坐标的横或纵唑标差】
例题2:“之”字形打印矩阵打印方式去下图:
切忌被题目迷惑,嘴上说是之形打印其实就是按照斜线将矩阵分层输出罢了。給定上顶点和下顶点由于这里的斜线都是斜率为1的,我们可以得到所有的点只要交替着从上向下到从下到上即可。
解题方法:实现一個函数给定上下端点,根据一个Bool值选择从上至下还是从下至上
|
|
版权声明:本文为博主原创文章遵循
版权协议,转载请附上原文出处链接和本声明