系列文章目录

文章目录

  • 系列文章目录
  • 前言
  • 一、两数之和(Two Sum)
  • 二、两数相加(Add Two Numbers)
  • 三、无重复字符的最长子串

前言

本博客的主要目的是在于记录leetcode的刷题历程,编程语言为python,本人也处于学习阶段,可能程序会存在一些错误或者不规范处,欢迎指正。


一、两数之和(Two Sum)

问题描述:给定一个整数数组nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
示例1:

 输入:nums = [2,7,11,15], target = 9输出:[0,1]

示例2:

 输入:nums = [3,2,4], target = 6输出:[1,2]

如果允许时间复杂度为o(n^2),问题解决方案就是一个二重循环,分别比较各个元素与剩下的元素之和是否等于target,代码示例如下:

class Solution(object):def twoSum(self, nums, target):""":type nums: List[int]:type target: int:rtype: List[int]"""index = []for i in range(0, len(nums)):for j in range(i+1, len(nums)):if nums[i] + nums[j] == target:index = [i, j]return index

上述这种方法比较容易想到,但是时间复杂度较高,我们可以采用散列表(哈希表)的方式,用空间换取时间。python中的哈希数据结构,比较常见的就是字典,我们也可以通过字典完成这道题,代码如下:

class Solution(object):def twoSum(self, nums, target):""":type nums: List[int]:type target: int:rtype: List[int]"""a_dict = dict()for i in range(0, len(nums)):another = target - nums[i]if another in a_dict:result = [a_dict[another], i]return resultelse:a_dict[nums[i]] = i

大致思路:从前往后遍历列表,计算目标值减去自身值后的结果是否在字典中,如果在就返回这两个数的数组下标,如果不在就将其保存在字典中,字典的键值对分别对应着数组元素的值和数组下标值。

该算法的时间复杂度为o(n),主要是因为查找字典的时间花费为线性时间o(1)。python中的in操作符在不同数据结构中的时间复杂度为:

list:o(n),   set:o(1),   dict:o(1)

二、两数相加(Add Two Numbers)

问题描述:给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。请你将两个数相加,并以相同形式返回一个表示和的链表。
示例1:

输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807.

示例2:

输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
输出:[8,9,9,9,0,0,0,1]

编程要点:

1.输入序列为逆序,可以直接从左往右进行计算
2.输入的两个序列的长度可能不一致,注意循环结束的判断条件
3.注意进位规则,容易遗漏最高位进位
4.python没有链表这种数据结构,需要自己实现一个伪链表类

代码如下:

class ListNode(object):def __init__(self, val=0, next=None):self.val = valself.next = nextclass Solution(object):def addTwoNumbers(self, l1, l2):""":type l1: ListNode:type l2: ListNode:rtype: ListNode"""result = ListNode()head = resultcount = 0while l1 is not None or l2 is not None:node = ListNode()if l1 is not None and l2 is not None:node.val = l1.val + l2.val + countcount, node.val = self.is_ten(node.val)result.next = noderesult = nodel1 = l1.nextl2 = l2.nextcontinueif l1 is not None and l2 is None:node.val = l1.val + 0 + countcount, node.val = self.is_ten(node.val)result.next = noderesult = nodel1 = l1.nextcontinueif l1 is None and l2 is not None:node.val = l2.val + 0 + countcount, node.val = self.is_ten(node.val)result.next = noderesult = nodel2 = l2.nextcontinueif count == 1:node = ListNode(1)result.next = nodereturn head.nextdef is_ten(self, num):count = 0result = 0if num >= 10:count = 1result = num - 10else:count = 0result = numreturn count, result

三、无重复字符的最长子串

问题描述:给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
示例1:

输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。

示例2:

输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。

大致思路:定义max_length用来保存最长值,max_list用来保存无重复字符的子串序列。从左到右遍历字符串,若字符没出现在max_list中,就将字符添加进去,若出现在max_list中,比较当前max_list的长度和max_length的大小,对max_length进行更新,对max_list进行切片,将包括重复字符在内的之前的字符舍弃。代码如下:

class Solution(object):def lengthOfLongestSubstring(self, s):""":type s: str:rtype: int"""max_length = 0max_list = []for i in range(0, len(s)):if s[i] not in max_list:max_list.append(s[i])else:if max_length < len(max_list):max_length = len(max_list)index = max_list.index(s[i])max_list.append(s[i])max_list = max_list[index+1:]if max_length < len(max_list):max_length = len(max_list)return max_length

注意事项:

1.单个字符情况没考虑在内,循环提前结束
2.切片操作时,获得重复字符在max_list中的下标index,将重复字符先添加到max_list中,切片时为[index+1:]

leetcode刷题笔记(1-10)持续更新中相关推荐

  1. LeetCode刷题-两数之和(持续更新)

    文章目录 LeetCode 1. Two Sum (两数之和) 题目描述 样例 解题思路一(暴力法) 解题思路二(使用map) 前言:最近业余时间,一直在看LeetCode上面的题,上面有许多好的解题 ...

  2. leetcode刷题笔记——二分查找

    leetcode刷题笔记--二分查找 目前完成的贪心相关的leetcode算法题序号: 中等:80,81 困难:4 来源:力扣(LeetCode) 链接:https://leetcode-cn.com ...

  3. LeetCode刷题笔记(算法思想 四)

    LeetCode刷题笔记(算法思想 四) 七.动态规划 斐波那契数列 70. 爬楼梯 198. 打家劫舍 213. 打家劫舍 II 信件错排 母牛生产 矩阵路径 64. 最小路径和 62. 不同路径 ...

  4. 《剑指 Offer I》刷题笔记 1 ~10 题

    <剑指 Offer I>刷题笔记 1 ~10 题 栈与队列(简单) 1. 用两个栈实现队列 _解法 1:暴力做法 解法 2:优化解法 1 2. 包含 min 函数的栈 _解法 1:pop( ...

  5. LeetCode刷题笔记2——数组2

    LeetCode刷题笔记2--数组2 重塑数组 题目 在 MATLAB 中,有一个非常有用的函数 reshape ,它可以将一个 m x n 矩阵重塑为另一个大小不同(r x c)的新矩阵,但保留其原 ...

  6. 小何同学的leetcode刷题笔记 基础篇(01)整数反转

    小何同学的leetcode刷题笔记 基础篇(01)整数反转[07] *** [01]数学取余法*** 对数字进行数位操作时,常见的方法便是用取余的方法提取出各位数字,再进行操作 操作(1):对10取余 ...

  7. 牛客网Veirlog刷题答案目录(持续更新)

    牛客网Veirlog刷题答案目录(持续更新) 基础篇 进阶篇 基础篇 1.VL1--四选一多路选择器 2.VL2--异步复位的串联T触发器 3.VL3--奇偶校验 4.VL4--移位运算与乘法 5.V ...

  8. LeetCode刷题笔记-动态规划-day4

    文章目录 LeetCode刷题笔记-动态规划-day4 55. 跳跃游戏 1.题目 2.解题思路 3.代码 45. 跳跃游戏 II 1.题目 2.解题思路 3.代码 LeetCode刷题笔记-动态规划 ...

  9. 卷进大厂系列之LeetCode刷题笔记:二分查找(简单)

    LeetCode刷题笔记:二分查找(简单) 学算法,刷力扣,加油卷,进大厂! 题目描述 涉及算法 题目解答 学算法,刷力扣,加油卷,进大厂! 题目描述 力扣题目链接 给定一个 n 个元素有序的(升序) ...

  10. LeetCode刷题笔记汇总

    LeetCode刷题笔记汇总 第一次刷LeetCode写的一些笔记. 1.两数之和 3.无重复字符的最长子串 15.三数之和 18.四数之和 19.删除链表的倒数第 N 个结点 20.有效的括号 21 ...

最新文章

  1. Python数据集可视化:抽取数据集的两个特征进行二维可视化、主成分分析PCA对数据集降维进行三维可视化(更好地理解维度之间的相互作用)
  2. SDUT _2117 数据结构实验之链表二:逆序建立链表
  3. 从网络管理员到首席架构师,这 16 年我是如何实现每年加薪 10000 美元的?
  4. 【Java数据库】ORM思想:对象关系映射 使用Java容器存储多条记录
  5. linux扫盲之CPU模式
  6. FluorineFx对于现有站点的配置
  7. 远程管理技术对服务器管理的影响
  8. 期货软件公司排名_排行榜_五大品牌_口碑好的期货软件公司
  9. Latex 给参考文献添加doi号和超链接
  10. java实现识别二维码图片功能
  11. python-skimage.io,filters,transform
  12. 唯品会导航栏简单制作
  13. 2021年安全生产模拟考试(建筑特种作业操作证-建筑焊工模拟考试题库)安考星
  14. 服务器CPU作用是什么?
  15. HTML5输入框里加图片代码,做了一个input上传加号框,图片上传后显示在框中,怎么让加号消失?...
  16. Python——验证码输入
  17. DVWA靶机-反射性XSS漏洞(Reflected)
  18. mac 下安装 Crypto
  19. 使用System Center DPM 2012 SP1保护企业关键数据(一)部署SCDPM
  20. c盘文件被木马删怎么恢复?教你四步轻松找回文件!

热门文章

  1. 使用OBS屏幕录制时色彩错误问题解决方案
  2. 国内测试看Netflix
  3. SpringBoot02
  4. matlab 怎么解ode方程,Matlab解微分方程(ODE+PDE).pdf
  5. 小龙秋招【面试笔记】正式发布,速来围观!(已有40+同学斩获大厂offer)
  6. python网课 知乎_如何看待风变编程的 Python 网课
  7. ERROR: Could not install packages due to an OSError: [WinError 5] 拒绝访问 解决方案
  8. 这样演示正弦和余弦的相互变换,不怕难懂!
  9. 如何寻找“真爱”型合伙人
  10. 微信支付全流程对接文档