感受作题越多遇到的写法越多,有种跃跃欲试的感受~算法
70. 爬楼梯
难度:简单
假设你正在爬楼梯。须要 n 阶你才能到达楼顶。
每次你能够爬 1 或 2 个台阶。你有多少种不一样的方法能够爬到楼顶呢?
注意:给定n
是一个正整数。
个人题解:数组
class Solution(object): def climbStairs(self, n): """ :type n: int :rtype: int """ old = 1 new = 1 for i in range(2,n+1): old,new = new,new+old return newv
个人思路:
这题是一个标准的动态规划
的题目,第二步所须要的步数实际上是基于第一步,第三步则基于第二步。
用笔计算就能够看出,有必定的规律,新的一步的最优解等于前面一步的最优解+以前全部步数的最优解。
不过可能尚未抓到动态规划的真谛,总以为哪里须要再校订下思路。函数
771. 宝石与石头
难度:简单
给定字符串J
表明石头中宝石的类型,和字符串S
表明你拥有的石头。S
中每一个字符表明了一种你拥有的石头的类型,你想知道你拥有的石头中有多少是宝石。J
中的字母不重复,J
和S
中的全部字符都是字母。字母区分大小写,所以"a"和"A"是不一样类型的石头。
个人题解:优化
class Solution(object): def numJewelsInStones(self, J, S): """ :type J: str :type S: str :rtype: int """ num = 0 if not J or not S: return 0 map = {} for i in J: map[i] = 1 for j in S: if j in map: num += map[j] return num
个人思路:
这题用了hash表
的思路,将J
里的每一个字母单独存成哈希表的一个键,且对应的值为1。
这样当S
进行搜索的时候,对应将值相加便可获得结果。spa
709. 转换成小写字母
难度:简单
实现函数 ToLowerCase(),该函数接收一个字符串参数 str,并将该字符串中的大写字母转换成小写字母,以后返回新的字符串。
个人题解:code
class Solution(object): def toLowerCase(self, str): """ :type str: str :rtype: str """ s = list(str) map = {'A':'a','B':'b','C':'c','D':'d','E':'e','F':'f','G':'g','H':'h','I':'i','J':'j','K':'k','L':'l','M':'m','N':'n','O':'o','P':'p','Q':'q','R':'r','S':'s','T':'t','U':'u','V':'v','W':'w','X':'x','Y':'y','Z':'z'} for i in range(len(s)): if s[i] in map: s[i] = map[s[i]] s1=''.join(s) return s1
个人思路:
这题....大概写法很是土了....emmm
认真的写了个字典,而后对应的写一下,效率也还能够,可是只能用于数量少的状况下,还能够看下有没有其余的写法。blog
62. 不一样路径
难度:中等
个人题解:ip
class Solution(object): def uniquePaths(self, m, n): """ :type m: int :type n: int :rtype: int """ dp = [[0 for _ in range(m)] for _ in range(n)] #创建二维数组 for i in range(n): for j in range(m): if i ==0 or j ==0: dp[i][j] = 1 else: dp[i][j] = dp[i-1][j] + dp[i][j-1] return dp[n-1][m-1]
个人思路:
很是粗暴的画了网格图,而后发现了规律,dp[i][j] = dp[i-1][j] + dp[i][j-1]
,
和少棉在讨论的时候,很是真挚的为了为何他知道须要是左边的值加上上方的值,
给的说法是最优解的目标就是从左上角到该位置的最优解
,局部最优再到全局最优。
这题也是动态规划
的题目,目标老是要分解为子问题。leetcode
看《算法图解》的时候,涉及动态规划的小结中有这样的字符串
- 每种动态规划解决方案都涉及网格。
- 单元格中的值一般就是你要优化的值
- 每一个单元格都是一个子问题,由于你须要考虑如何将问题分解为子问题。