小李飞刀:做题第九弹!

栏目: 编程工具 · 发布时间: 5年前

内容简介:感觉做题越多遇到的写法越多,有种跃跃欲试的感觉~难度:简单

写在前面的话

感觉做题越多遇到的写法越多,有种跃跃欲试的感觉~

认真做题

第一题

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 中的字母不重复, JS 中的所有字符都是字母。字母区分大小写,因此"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 进行搜索的时候,对应将值相加即可得到结果。

第三题

709. 转换成小写字母

难度:简单

实现函数 ToLowerCase(),该函数接收一个字符串参数 str,并将该字符串中的大写字母转换成小写字母,之后返回新的字符串。

我的题解:

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

认真的写了个字典,然后对应的写一下,效率也还可以,但是只能用于数量少的情况下,还可以看下有没有其他的写法。

第四题

62. 不同路径

难度:中等

我的题解:

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] ,

和少棉在讨论的时候,非常真挚的为了为什么他知道需要是左边的值加上上方的值,

给的说法是 最优解的目标就是从左上角到该位置的最优解 ,局部最优再到全局最优。

这题也是 动态规划 的题目,目标总是要分解为子问题。

总结

看《算法图解》的时候,涉及动态规划的小结中有这样的

  • 每种动态规划解决方案都涉及网格。
  • 单元格中的值通常就是你要优化的值
  • 每个单元格都是一个子问题,因为你需要考虑如何将问题分解为子问题。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

C和C++代码精粹

C和C++代码精粹

阿林森 / 董慧颖 / 人民邮电出版社 / 2003-4-1 / 59.00

《C和C++代码精粹》基于作者备受好评的C/C++ User Journal杂志上的每月专栏,通过大量完全符合ISO标准C++的程序集合,说明了C++真正强大的威力,是C和C++职业程序员的实践指南。可以帮助有一定经验的C和C++程序员深入学习这两种密切相关的语言,对书中代码的参悟和应用,可以帮助他们从根本上提高使用程序的效率。一起来看看 《C和C++代码精粹》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

随机密码生成器
随机密码生成器

多种字符组合密码