LeetCode Python实现算法简介

边刷边记边总结,欢迎讨论与指导,持续更新

0001 两数之和

  1. 初始化一个字典 numtarget(哈希表、散列表),用来存储“若我需要 derta 凑成目标值,则应该寻找数组第 i 项”,即 numtarget[derta] = i

  2. 从前至后遍历数组,计算目标值 target 与当前整数 num 的差值 derta

  3. 查找 numtarget ,若已有 derta 记录则返回 i ,否则把 derta 与当前元素位置插入 numtarget

0002 两数相加

  1. 初始化一个链表 result ,只含有一个节点,赋值为零,用来存放计算和

  2. 对 l1 和 l2 从表头开始逐节点相加,有四种情况:

    • 不产生进位,且 l1 或 l2 有后继节点,将无后继节点链表表尾补零节点,继续计算

    • 不产生进位,且 l1 和 l2 均无后继节点,计算后结束

    • 产生进位,且 l1 或 l2 有后继节点,将无后继节点链表表尾补零节点,继续计算,下一轮计算结果 +1

    • 产生进位,且 l1 和 l2 均无后继节点,在result链表表尾补节点,取值为 1

0003 无重复字符的最长子串

  1. 初始化两个指针 a, b 指向第一个字符, 子串 substr, 表示指针 a, b 之间的子串,初始为空, 和最长子串长度 maxlen = 0

  2. 将指针 b 逐个后移

    • 若 b 不在子串中,说明无重复字符,则将 b 加入 substr

    • 若 b 在子串中,则找到 substr 中 "b" 的位置 i, 将 a 移动到 i+1 的位置,更新子串substr

  3. 指针 b 每后移一次,判断一次当前子串长度 len(substr) 与 maxlen 的大小关系

0004 寻找两个有序数组的中位数

暂略

0005 最长回文子串

可以暴力枚举,可以使用中心扩展算法,但使用 manacher 算法可使时间复杂降低至 O(n)

  1. 定义回文半径数组 radius,最右回文边界 r,最右回文边界的对称中心 c

  2. 遍历数组,有两种情况:

    • 移动位置 i 在最大回文边界 r 的右边,那么以 i 为中心,向两边扩展,更新回文半径数组 radius[i],对称中心 c = i

    • 移动位置 i 在最大回文边界 r 的左边或者在边界上,定义 i' 为与 i 关于 c 对称的点,il' 是以 i' 为中心的最长回文数组左边界, cl 是以 c 为中心的最长回文数组左边界。此时有三种情况:

      • i'l < cl,则位置 i 处的最长对称半径为 r - i + 1

      • i'l > cl,则位置 i 处的最长对称半径为 radius[i'l]

      • i'l = cl,则向最大回文边界 r 向右扩展,更新最大回文边界和对称中心

  3. 找到 radius 的最大值,推算子串

0006 Z字型变换

  1. 若指定行数小于等于 1,直接返回原字符串

  2. 将给定字符串 s 逐个写入, toword 指示方向,当行数为 0 或者 numRows - 1 时反向

  3. 按行拼接字符串

0011 盛最多水的容器

利用双指针

  1. 初始化两个指针,分别指向数组头尾,计算当前两个数字的盛水面积

  2. 调整数值较小的指针,当指针数字大于之前指针数字时,计算当前两个数字的盛水面积,比较记录更大值

  3. 按照 2 中规则遍历所有数字,得到最大值

0015 三数之和

两种解体思路

  • 轮流做中,即遍历数组,然后简化为两数之和问题

  • 双指针,将数组排序后,利用双指针遍历,剪枝

0016 最接近的三数之和

与0015题类似,将判断标准改变为三数之和与目标值的差值最小

0026 删除排序数组中的重复项

双指针法

  1. 初始化两个指针 i,j,起始位置都在数组头部

  2. 用 j 遍历数组,若 nums[j] = nums[i],跳过,若不相等,则令 nums[i] = nums[j]

0027 移除元素

双指针法

  1. 初始化两个指针 i = -1,j = 0

  2. 用 j 遍历数组,若等于指定值则跳过,否则将值赋给指针 i

0031 下一个排列

  1. 从后往前,找到第一个满足 nums[i] > nums[i-1] 的数字

  2. 在 nums[i:] 中,找到大于 nums[i-1] 的最小数字,交换两数,此时 nums[i:] 为降序排列

  3. 原地置逆 nums[i:],此时即找到下一个排列

  4. 若 1 中不存在满足条件的数字,将整个数组原地置逆

0033 搜索旋转排序数组

  1. 要求时间复杂度为O(logn),想到二分查找。取中间的元素 nums[m]

  2. 若 nums[m] < nums[r],则中间元素落在后半段。此时,若 nums[m] < target < nums[r],则 target 在 nums[m] 右侧,否则在左侧

  3. 若 nums[m] > nums[r],则中间元素落在前半段。此时,若 nums[l] < target < nums[m],则 target 在 nums[m] 左侧,否则在右侧

0034 在排序数组中查找元素的第一个和最后一个位置

  1. 第一个二分查找,找到数组中是否存在 target ,有返回位置 numposition ,无返回 [-1, -1]

  2. 在 numposition 左右分别二分查找,寻找开始位置和结束位置

0035 搜索插入位置

  1. 二分查找,若找到 target ,则返回位置,否则执行第二步

  2. 二分查找未果的最后一步时, 有 l = r = m,即左、右、中重合。因为数组是有序的,若 nums[m] > target, 则应在 m 处插入,否则在 m + 1 处插入

0039 组合总和

  1. 将数组按非递减排序

  2. 假设某元素 num 已在组合中,那么组合中其它元素和为 target-num,则原问题分解为 n 个小问题,n 表示数组长度

  3. 由于每个元素可重复使用,但组合不能重复,则根据排序后的数组,下一步迭代从元素自身位置开始,即忽略掉小于自身的元素,这部分元素若构成组合,应已经包含在本层迭代小于自身的元素组合中

0040 组合总和II

与0039类似,进一步剪枝,区别有两点:

  1. 每个元素不可重复,下一步迭代从下一个元素开始

  2. 数组中可能有相同元素,因此同层元素相同时,剪枝

0041 缺失的第一个正数

使用常数级别的空间,意味着需要在对数组本身进行操作

  1. 遍历数组,把 nums 中,数值为 i 的值放在 i-1 的位置。比如,若 num[i] 取值在 0~i 之间,那么将位置 i 处的元素 num[i] 与 位置在 num[i] 处的元素 nums[nums[i]]交换位置,直到位置 i 处的元素取值不在 0~i 之间

  2. 第二次遍历数组,若 nums[i] != i + 1,则缺失的第一个正数为 i + 1

LeetCode python实现题解(持续更新)的更多相关文章

  1. LeetCode 题目的 Python 实现(持续更新中)

    Python-LeetCode 是一个使用 Python 语言解决 LeetCode 问题的代码库,库有以下几个方面需要注意: 所有题目都是 AC 的: 按照题目顺序,每 50 个放在一个目录下,方便 ...

  2. Python 字典 (4) 持续更新

    字典一种用名字来引用值的数据结构,这种数据结构称为 映射(mapping) .字典中的键可以是数字.字符串和元组. 字典 创建和使用 创建 phonebook = {'Aaron':133000000 ...

  3. python笔记(持续更新)

    1.编译python遇到下面的编码问题:     SyntaxError: Non-ASCII character '\xe9' in file E:\projects\learn.py on lin ...

  4. python tips(持续更新)

    1. 引用上一层目录 import syssys.path.append('..')import xx 2. python json JSON是一种轻量级的数据交换格式.可以解决数据库中文存储问题,对 ...

  5. Python相关工具清单[持续更新]

    SublimeJEDI : awesome Python autocompletion with SublimeText. Awesome Python : A curated list of awe ...

  6. [bzoj\lydsy\大视野在线测评]题解(持续更新)

    目录: 一.DP 二.图论 1.最短路 2.强连通分量 三.利用单调性维护 四.贪心 五.数据结构 1.并查集 六.数学 1.计数问题 2.数学分析 七.博弈 八.搜索 /////////////// ...

  7. Python 目录【持续更新中】

    Python 基础 字符编码 数据类型 文件处理 流程控制 练习题 函数,递归 匿名函数.内置函数 装饰器变形记 函数装饰器 递归 二分法 迭代器和生成器 协程函数 列表表达式 生成器表达式 异常处理 ...

  8. python并行计算(持续更新)

    工作中需要对tensorflow 的一个predict结果加速,利用python中的线程池 def getPPLs(tester,datas): for line in datas: tester(l ...

  9. python练习题(持续更新中。。。。。)

    1.检验注册用户是否合法:需要输入用户名,校验用户名是否被注册,如已注册,提示已经注册过,没注册就可以注册:用户名不能为空:用户名长度必须在6-13位之间:最多只能输入三次. users = ['aa ...

随机推荐

  1. The website is API(1)

    Requests 自动爬取HTML页面 自动网路请求提交 robots 网络爬虫排除标准 Beautiful Soup 解析HTML页面 实战 Re 正则表达式详解提取页面关键信息 Scrapy*框架 ...

  2. Laravel 操作指令

    php artisan migrate —path=database/migrations/v1 更新表数据 php artisan make:migration create_channels_ta ...

  3. day22- hashlib模块-摘要算法(哈希算法)

    # python的hashlib提供了常见的摘要算法,如md5(md5算法),sha1等等.摘要:digest # 摘要算法又称哈希算法.散列算法. # 它通过一个函数,把任意长度的数据(明文)转换为 ...

  4. Oracle-PL/SQL语句

    1.PL/SQL 2.存储过程,函数 3.java中调用存储过程和函数 4.触发器 1 PL/SQL 1.1什么是PL/SQL? n  PL:Process Language n  PL/SQL是or ...

  5. Leetcode_开篇碎碎念

    已经计划写leetcode3天了,但是到目前为止一道题还没有写,执行力我太差了. 写leetcode的原因有两个,一是锻炼自己代码水平,提高实力:二是考研据了解到的都会有上机考试,基本是c++,jav ...

  6. LeetCode Day 9

    LeetCode0017 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合. 给出数字到字母的映射如下(与电话按键相同).注意 1 不对应任何字母. 示例: 输入:"23&q ...

  7. openssl nodejs https+客户端证书+usbkey

    mac sslconfig 文件路径 /System/Library/OpenSSL/openssl.cnf 一生成CA openssl req -new -x509 -keyout ca.key - ...

  8. 配置Oracle10g即时客户端plsql的配置

    看到网上有好多的Oracle客户端精简版本,但是这些都不是出自Oracle官方之手,难免可能会出现一些问题.经过我奋战一个小时终于搞定了这个 Oracle10g即时客户端 的配置了 1.先到Oracl ...

  9. Junit 单元测试在 intelliJ IDEA 中的安装

    1.为什么使用Junit我们都知道,main 方法是一个程序的入口,通常来说,没有main方法,程序就无法运行.我们经常会写一些class文件(如下图所示),他们并没有自己的main方法.那么我们如何 ...

  10. Java找出两个链表的第一个公共节点

    题目描述输入两个链表,找出它们的第一个公共结点. 我的思路:因为是链表,长度都是未知的,不能盲目的两个一起开始自增判断. 首先需要得到 L1的长度 和 L2的长度,让较长的那个先走 (length1- ...