lintcode 刷题 by python 总结(1)
博主之前在学习 python 的数据结构与算法的基础知识,用的是《problem-solving-with-algorithms-and-data-structure-using-python》 。但是仅仅看书对于知识的理解不够深入。于是选择了 lintcode 刷题,本篇博客即为最近做的算法题的一则小结。
lintcode 的界面非常干净,还有中文版本的。博主的刷题的顺序为从入门开始,逐步深入,并不集中刷某块的题目。入门的8道题目都刷了,从简单开始优先做热点题(热点不分优先级)。
一 矩阵
- 简单 28 搜索二维矩阵
二分法查找
二 区间
- 简单 30 插入区间
- 简单 156 合并区间
建立一个数组,放个初始元素,然后比较新建数组最后一个元素与原数组剩余第一个元素的关系,符合要求则完成某种操作,循环原数组。
三 链表
- 入门 452 删除链表中的元素:两个指针
- 入门 466 链表节点计数:一个指针
- 简单 35 翻转链表:两个指针,一个tmp
- 简单 112 删除排序链表中的重复元素:两个指针
- 简单 165 合并两个排序链表:新建个链表,把原列表的元素一个个放进去,三个指针
- 简单 167 链表求和:把一个链表的值加到另一个链表上
四 哈希表
简单 56 两数之和
五 数组
- 简单 41 最大子数组:如果直接按照不同长度遍历累加,则会超时;所以直接从第一个开始累加,前面和有负数的则清零
- 简单 56 两数之和:反正我直接暴力搜索了
- 简单 60 搜索插入位置:直接做
- 简单 64 合并排序数组:直接做
- 简单 100 删除排序数组中的重复数字:该题要求不增加额外数组空间,设置一个计数即可
- 简单 101 删除排序数组中的重复数字2:设置两个计数即可
- 简单 114 不同的路径:递归或者遍历,建立一个矩阵,每个元素值代表该位置的路径数目,值=左边值+上边值
- 简单 156 合并区间:新建一个空数组,每次将需要放入的区间与该数组的最后一个区间比较
- 简单 172 删除元素:要求原地删除,因此注意元素的索引,每删一个,长度减一
常用方法:
- 数组内元素排序:
sorted(iterable[, cmp[, key[, reverse]]])
iterable 是可迭代对象,比如数组;cmp 是比较函数(个人感觉不如 key 好用); key 是比较的元素; reverse 是 True 为降序, False 升序(默认)
简单156举例(对每个区间按照 start 值排序):
intervals = sorted(intervals, key=lambda x: x.start)
六 二叉树
- 入门 632 二叉树的最大节点:注意返回的是节点而不是节点的值
- 简单 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]
七 排序
- 入门 463 整数排序:一个嵌套循环
- 简单 56 两数之和:一个嵌套循环
8 数学
- 入门 366 斐波纳契函数:递归
- 入门 763 Hex Conversion:递归
- 简单 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
lintcode 刷题 by python 总结(1)的更多相关文章
- lintcode 刷题 by python 部分链表题总结(2)
本篇博客对最近做的链表的算法题做个简单的小结,主要描述题目和提供解题思路,具体代码见我的 github:https://github.com/MUSK1881/lintcode-by-python 3 ...
- LintCode刷题指南:字符串处理(C++,Python)
题目:两个字符串是变位词 题目难度:简单 题目描述: 写出一个函数 anagram(s, t) 判断两个字符串是否可以通过改变字母的顺序变成一样的字符串. 解题思路: C++:引入哈希的思维,这道题就 ...
- lintcode刷题笔记(一)
最近开始刷lintcode,记录下自己的答案,数字即为lintcode题目号,语言为python3,坚持日拱一卒吧... (一). 回文字符窜问题(Palindrome problem) 627. L ...
- LintCode刷题笔记-- LongestCommonSquence
标签:动态规划 题目描述: Given two strings, find the longest common subsequence (LCS). Your code should return ...
- 动态规划刷题集python代码
1 爬楼梯(Fibonacci) #有一楼梯共M级,若每次只能跨上一级或二级,要走上第M级,共有多少种走法? def fun(m): c = [0]*m c[0] = 1 c[1] = 2 for i ...
- lintcode 刷题记录··
单例模式,用C#实现过单例模式,python区别就是类里边的静态方法写法不一样,python叫类方法,函数之前加@classmethod class Solution: # @return: The ...
- LintCode刷题笔记-- PaintHouse 1&2
标签: 动态规划 题目描述: There are a row of n houses, each house can be painted with one of the k colors. The ...
- LintCode刷题笔记-- Maximum Product Subarray
标签: 动态规划 描述: Find the contiguous subarray within an array (containing at least one number) which has ...
- LintCode刷题笔记-- Maximal Square
标签:动态规划 题目描述: Given a 2D binary matrix filled with 0's and 1's, find the largest square containing a ...
随机推荐
- Thunder团队--Alpha发布用户报告
用户数量:12人 以下为用户评论:(注:为了保护用户的姓名权,以下用户名以昵称形式给出.) 用户名(昵称) 用户使用频次 用户评论(以图片展示) 小王 3次 米线 2次 孔小姐 5次 乌乌鸟 2次 永 ...
- 《剑指offer》第四十题(最小的k个数)
// 面试题40:最小的k个数 // 题目:输入n个整数,找出其中最小的k个数.例如输入4.5.1.6.2.7.3.8 // 这8个数字,则最小的4个数字是1.2.3.4. #include < ...
- 浅浅的分析LED呼吸灯的实现和PWM的关系
前言 在本周,我们在python课上做了一个实验,用ARDUINO使小LED灯模仿出呼吸灯的效果,实验进行的很成功,但是机器当仅输出高/低电平的时候是怎么样才能做到渐亮渐暗(输出电压)的变化呢?在这里 ...
- 『OpenCV3』简单图片处理
cv2和numpy深度契合,其图片读入后就是numpy.array,只不过dtype比较不常用而已,支持全部数组方法 数组既图片 import numpy as np import cv2 img = ...
- Hackintosh Power Management
Also, be aware that hibernation (suspend to disk or S4 sleep) is not supported on hackintosh. You sh ...
- python-day34--并发编程之多线程
理论部分 一.什么是线程: 1.线程:一条流水线的工作过程 2.一个进程里至少有一个线程,这个线程叫主线程 进程里真正干活的就是线程 3.进程只是用来把资源集中到一起(进程只是一个资源单位,或者说资 ...
- kaptcha验证码使用
参数配置: Constant 描述 默认值 kaptcha.border 图片边框,合法值:yes , no yes kaptcha.border.color 边框颜色,合法值: r,g,b (and ...
- 未能加载文件或程序集“LinqToExcel”或它的某一个依赖项。试图加载格式不正确的程序。
未能加载文件或程序集“*”或它的某一个依赖项.试图加载格式不正确的程序. 原因:操作系统是64位的,但发布的程序引用了一些32位的ddl,所以出现了兼容性的问题解决方案一:如果是64位机器,IIS—— ...
- dubbo的ExtensionLoader
了解4个概念:接口,实现类,wrapper,adaptive. 扩展是接口实现类被wrap之后的对象,adaptive扩展是动态生成的类(例如Dubbo$Adaptive类). dubbo框架为接口指 ...
- 【css】弹性盒模型
弹性盒模型flexBox 弹性盒模型是c3的一种新的布局模式 它是指一种当页面需要适应不同屏幕大小以及设备类型时,确保元素有恰当行为的布局方式. 引入弹性盒模型布局的目的是提供一种更有效的方法来对一个 ...