由LeetCode想到算法中的<横向思维和纵向思维>:
2014-04-24 10:58
330 查看
Decode Ways
A message containing letters from
the following mapping:
Given an encoded message containing digits, determine the total number of ways to decode it.
For example,
Given encoded message
2) or
The number of ways decoding
这是Leetcode上的题目,求数字的解码方式有多少种,可以采用的方式很多,递推、递归、动态规划。。
这里要求的是f(n)的值,它依赖于f(n-1) 和 f(n-2) 、同时跟两个判断条件有关。s[i] 能否解码、s[i-1]能否解码、s[i-1]s[i]两位数能否解码,决定了f(n) 如何跟f(n-1) f(n-2)建立联系,那么会出现的状况有很多种,分析出来写成代码会很难看,因为状况多、给人感觉思路不清。 由于是计数,可以采用累加的方法,当s[i]可以解码的时候出现了多少情况,当s[i-1]s[i]两位数可以解码出现了多少情况,依次算加法加起来,这样不用分析组合状态,只用分析单个状态就能得出结果。
横向思维:将问题分成多种情况,针对每种情况提出方案。
纵向思维:将问题考虑成一种情况,对过程中的不同情况做处理。
PS:本题用 划分状态后写出来的代码要么难看,要么难懂!@#¥#@~
A message containing letters from
A-Zis being encoded to numbers using
the following mapping:
'A' -> 1 'B' -> 2 ... 'Z' -> 26
Given an encoded message containing digits, determine the total number of ways to decode it.
For example,
Given encoded message
"12", it could be decoded as
"AB"(1
2) or
"L"(12).
The number of ways decoding
"12"is 2.
这是Leetcode上的题目,求数字的解码方式有多少种,可以采用的方式很多,递推、递归、动态规划。。
class Solution { public: int decodeOne(char one) { return (one == '0') ? 0 : 1; } int decodeTwo(char one, char two) { if( (one == '1') || (one == '2' && two <= '6') ) return 1; else return 0; } int fun(string s, int i) { if(i == 0 ) return decodeOne(s[0]); if(i == 1) return ( decodeOne(s[0]) & decodeOne(s[1]) ) + decodeTwo(s[0], s[1]); if(i >= 2) { int sum = 0; if(decodeOne(s[i])) sum += fun(s, i-1); if(decodeTwo(s[i-1], s[i]) ) sum += fun(s, i-2); return sum; } } int numDecodings(string s) { if(s.size() == 0 || s[0] == '0') return 0; return fun(s, s.size() - 1); } };主要讨论下面这段代码:
int sum = 0; if(decodeOne(s[i])) sum += fun(s, i-1); if(decodeTwo(s[i-1], s[i]) ) sum += fun(s, i-2); return sum;
这里要求的是f(n)的值,它依赖于f(n-1) 和 f(n-2) 、同时跟两个判断条件有关。s[i] 能否解码、s[i-1]能否解码、s[i-1]s[i]两位数能否解码,决定了f(n) 如何跟f(n-1) f(n-2)建立联系,那么会出现的状况有很多种,分析出来写成代码会很难看,因为状况多、给人感觉思路不清。 由于是计数,可以采用累加的方法,当s[i]可以解码的时候出现了多少情况,当s[i-1]s[i]两位数可以解码出现了多少情况,依次算加法加起来,这样不用分析组合状态,只用分析单个状态就能得出结果。
横向思维:将问题分成多种情况,针对每种情况提出方案。
纵向思维:将问题考虑成一种情况,对过程中的不同情况做处理。
PS:本题用 划分状态后写出来的代码要么难看,要么难懂!@#¥#@~
相关文章推荐
- 清华大学2012年828信号与系统真题回忆
- 如何得到地图的边界坐标
- JAVA异常处理注意事项
- mysql的存储过程与自定义函数
- checking it the current os is a 32bit or 64bit version 检查操作系统是32位还是64位
- 【二】仿微信飞机大战cocos2d-x3.0rc1
- 不要通过Application Object或者其他全局静态变量来存放数据
- 解决中文乱码( jsp表单提交中文时出现乱码)
- TextView的API 中文文档
- hack games
- windows文件名太长无法删除
- GUI图形用户界面开发助手Prof-UIS
- The Twitter stack
- spi协议及工作原理分析
- rsync+inotify实现实时同步案例--转
- Reverse Words in a String
- 面试题讲解(一) java继承、静态代码块、非静态代码块的使用
- sql server 2008 r2安装详解
- Linux 查看非纯文本文件
- hdu1879(最小生成树)