zoukankan      html  css  js  c++  java
  • lintcode 刷题 by python 总结(1)

        博主之前在学习 python 的数据结构与算法的基础知识,用的是《problem-solving-with-algorithms-and-data-structure-using-python》 。但是仅仅看书对于知识的理解不够深入。于是选择了 lintcode 刷题,本篇博客即为最近做的算法题的一则小结。

        lintcode 的界面非常干净,还有中文版本的。博主的刷题的顺序为从入门开始,逐步深入,并不集中刷某块的题目。入门的8道题目都刷了,从简单开始优先做热点题(热点不分优先级)。

    一 矩阵

    1. 简单 28 搜索二维矩阵

            二分法查找

    二 区间

    1. 简单 30 插入区间
    2. 简单 156 合并区间

            建立一个数组,放个初始元素,然后比较新建数组最后一个元素与原数组剩余第一个元素的关系,符合要求则完成某种操作,循环原数组。

    三 链表

    1. 入门 452 删除链表中的元素:两个指针
    2. 入门 466 链表节点计数:一个指针
    3. 简单 35 翻转链表:两个指针,一个tmp
    4. 简单 112 删除排序链表中的重复元素:两个指针
    5. 简单 165 合并两个排序链表:新建个链表,把原列表的元素一个个放进去,三个指针
    6. 简单 167 链表求和:把一个链表的值加到另一个链表上

    四 哈希表

    简单 56 两数之和

    五 数组

    1. 简单 41 最大子数组:如果直接按照不同长度遍历累加,则会超时;所以直接从第一个开始累加,前面和有负数的则清零
    2. 简单 56 两数之和:反正我直接暴力搜索了
    3. 简单 60 搜索插入位置:直接做
    4. 简单 64 合并排序数组:直接做
    5. 简单 100 删除排序数组中的重复数字:该题要求不增加额外数组空间,设置一个计数即可
    6. 简单 101 删除排序数组中的重复数字2:设置两个计数即可
    7. 简单 114 不同的路径:递归或者遍历,建立一个矩阵,每个元素值代表该位置的路径数目,值=左边值+上边值
    8. 简单 156 合并区间:新建一个空数组,每次将需要放入的区间与该数组的最后一个区间比较
    9. 简单 172 删除元素:要求原地删除,因此注意元素的索引,每删一个,长度减一

    常用方法:

    • 数组内元素排序:
    sorted(iterable[, cmp[, key[, reverse]]])

    iterable 是可迭代对象,比如数组;cmp 是比较函数(个人感觉不如 key 好用); key 是比较的元素; reverse 是 True 为降序, False 升序(默认)

    简单156举例(对每个区间按照 start 值排序):

    intervals = sorted(intervals, key=lambda x: x.start)

    六 二叉树

    1. 入门 632 二叉树的最大节点:注意返回的是节点而不是节点的值
    2. 简单 66 二叉树的前序遍历:根-左-右 
    [root.val] + self.preorderTraversal(root.left) + self.preorderTraversal(root.right)

        3. 简单 67 二叉树的中序遍历:左-根-右

    self.inorderTraversal(root.left) + [root.val] + self.inorderTraversal(root.right)

        4. 简单 68 二叉树的后序遍历:左-右-根

    self.postorderTraversal(root.left) + self.postorderTraversal(root.right) + [root.val]

        5. 简单 69 二叉树的层次遍历:逐层从左向右访问

    建列队存放节点,当前列队存放节点子代作为下个列队的节点,逐层遍历

        6. 简单 93 平衡二叉树:先获取最大深度,再根据每个节点对应的左右子代的最大深度是否平衡,以此递归

    return self.isBalanced(root.left) and self.isBalanced(root.right)

        7. 简单 97 二叉树的最大深度:对每个节点而言,该节点对应的最大深度就是其左右子树的最大深度加1,以此递归

    return max(self.maxDepth(root.left), self.maxDepth(root.right)) + 1 

        9. 简单 155 二叉树的最小深度:需要考虑子代为空的情况,如若左子代为空,则递归右子代的最小深度

    常用方法:

    • 对数组 A 的每个元素进行相同操作生成新的数组 B:

    B = [func, for i in A]  

    七 排序

    1. 入门 463 整数排序:一个嵌套循环
    2. 简单 56 两数之和:一个嵌套循环

    8 数学

    1. 入门 366 斐波纳契函数:递归
    2. 入门 763 Hex Conversion:递归
    3. 简单 141 x的平方根:一个循环

    9 动态规划

        1. 简单 109 数字三角形:从底部向上遍历,每层的数字代表上一层到达该位置的最小和

    triangle[i][j] += min([triangle[i+1][j], triangle[i+1][j+1]])

        2. 简单 110 最小路径和:每个当前位置的和来自左边或者上边的较小的累加和,遍历即可

    grid[i][j]=min(grid[i-1][j],grid[i][j-1])+grid[i][j]

        3. 简单 111 爬楼梯:(类似菲波那切数列),当前的位置方法来自前面“一步的位置”+“两步的位置”,遍历或者递归

    res.append(res[i-2] + res[i-1])

        4. 简单 114 不同路径:类似110题的思路

    mn[i][j] = mn[i-1][j] + mn[i][j-1]

    总结:

    从上面4道题目可以发现动态规划的算法题在求解的时候合适倒推法,然后考虑初始和边界限制结合遍历或者递归可以求解

    10 贪心

        1. 简单 46 主元素:排序后选取即可

        2. 简单 82 落单的数:比较巧妙的方法是使用亦或运算


    每道题的代码可参见我的 github 项目:https://github.com/MUSK1881/lintcode-by-python






  • 相关阅读:
    Oracle数据库备份与恢复的三种方法
    mybatis内置类型
    mybatis中#{}和${}的区别
    Statement和PreparedStatement的区别; 什么是SQL注入,怎么防止SQL注入?
    java web简单权限管理设计
    Flask总结篇
    Django总结篇
    API总结
    实战小练习
    数据操作
  • 原文地址:https://www.cnblogs.com/mtcnn/p/9411608.html
Copyright © 2011-2022 走看看