数据结构和算法
文章平均质量分 54
AllardZhao
学习的练习生,晓康。Python和Go语言追随者,喜欢学一些新技术,关注新技术发展动态。不断前进拥抱变化,永远确定的就是不确定。
展开
-
Python算法二分查找之重复元素列表
描述:请实现有重复数字的升序数组的二分查找给定一个 元素有序的(升序)长度为n的整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的第一个出现的target,如果目标值存在返回下标,否则返回 -1。数据范围:0 <= n <= 100000进阶:时间复杂度O(logn),空间复杂度O(n)示例:# 示例1输入:[1,2,4,4,5], 4返回值:2说明:从左到右,查找到第...原创 2021-12-22 00:42:35 · 1539 阅读 · 0 评论 -
LeetCode-1 两数之和---Python代码实现及详解
题目: 给定一个整数数组 nums和一个目标值 target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标。 你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。示例: 给定 nums = [2, 7, 11, 15], target = 9 因为 nums[0] + nums[...原创 2019-08-25 18:24:58 · 365 阅读 · 0 评论 -
LeetCode-141 环形链表 --- Python代码实现及详解
题目:给定一个链表,判断链表中是否有环。为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。示例 1:输入:head = [3,2,0,-4], pos = 1输出:true解释:链表中有一个环,其尾部连接到第二个节点。示例 2:输入:head = [1,2], pos ...原创 2019-10-07 23:51:35 · 285 阅读 · 0 评论 -
LeetCode-21 合并两个有序链表---Python代码实现及详解
题目:将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。示例: 输入:1->2->4, 1->3->4 输出:1->1->2->3->4->4思路:如:a 链表为1->2->4指针 i 指向a第一个节点1, b 链表为1->...原创 2019-07-22 23:50:47 · 483 阅读 · 0 评论 -
LeetCode-232 用栈实现队列---Python代码实现及详解
题目:使用栈实现队列的下列操作:push(x) -- 将一个元素放入队列的尾部。pop() -- 从队列首部移除元素。peek() -- 返回队列首部的元素。empty() -- 返回队列是否为空。示例:MyQueue queue = new MyQueue();queue.push(1);queue.push(2);queue.peek(); // 返回 ...原创 2019-07-23 23:47:49 · 699 阅读 · 0 评论 -
LeetCode-195 第十行 --- Bash shell 代码实现及详解
题目: 给定一个文本文件file.txt,请只打印这个文件中的第十行。 示例: 假设file.txt 有如下内容: Line 1 Line 2 Line 3 Line 4 Line 5 Line 6 Line 7 Line 8 Lin...原创 2019-10-04 10:18:18 · 247 阅读 · 0 评论 -
LeetCode-181 超过经理收入的员工---SQL语句实现及详解
题目: Employee 表包含所有员工,他们的经理也属于员工。每个员工都有一个 Id,此外还有一列对应员工的经理的 Id。+----+-------+--------+-----------+| Id | Name | Salary | ManagerId |+----+-------+--------+-----------+| 1 | Joe | 70...原创 2019-09-02 20:08:12 · 472 阅读 · 0 评论 -
LeetCode-53 最大子序和 --- Python代码实现及详解
题目:给定一个整数数组 nums,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。示例: 输入: [-2,1,-3,4,-1,2,1,-5,4], 输出: 6 解释:连续子数组[4,-1,2,1] 的和最大,为6。进阶: 如果你已经实现复杂度为 O(n) 的解法,尝试使用更...原创 2019-10-07 23:32:21 · 247 阅读 · 0 评论 -
LeetCode-1154 一年中的第几天 --- Python代码实现及详解
题目:给你一个按 YYYY-MM-DD 格式表示日期的字符串date,请你计算并返回该日期是当年的第几天。通常情况下,我们认为 1 月 1 日是每年的第 1 天,1 月 2 日是每年的第 2 天,依此类推。每个月的天数与现行公元纪年法(格里高利历)一致。示例 1:输入:date = "2019-01-09"输出:9示例 2:输入:date = "2019-02-10...原创 2019-10-07 21:43:40 · 319 阅读 · 0 评论 -
LeetCode-3 无重复字符的最长子串 --- Python代码实现及详解
题目: 给定一个字符串,请你找出其中不含有重复字符的最长子串的长度。示例1:输入: "abcabcbb"输出: 3解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。示例 2:输入: "bbbbb"输出: 1解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。示例 3:输入: "pwwkew"输出: 3解释: 因为无重...原创 2019-10-11 11:13:46 · 481 阅读 · 0 评论 -
LeetCode-237 删除链表中的节点---Python代码实现及详解
题目:请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点,你将只被给定要求被删除的节点。现有一个链表 --head =[4,5,1,9],它可表示为:4 -> 5 ->1 ->9输入: head = [4,5,1,9], node = 5输出: [4,1,9]解释: 给定你链表中值为5的第二个节点,那么在调用了你的函数之后,该链表应变为 4 -...原创 2019-07-22 23:46:45 · 225 阅读 · 0 评论 -
LeetCode-344 反转字符串---Python代码实现及详解
题目:编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。你可以假设数组中的所有字符都是 ASCII 码表中的可打印字符。示例 1:输入:["h","e","l","l","o"]输出:["o","l","l","e","h"](1)...原创 2019-07-24 19:14:15 · 377 阅读 · 0 评论 -
LeetCode-112 路径总和 --- Python代码实现及详解
题目:给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和。说明:叶子节点是指没有子节点的节点。示例: 给定如下二叉树,以及目标和 sum = 22, 5 / \ 4 8 / / \ 11 13 4 / \ \7 2 1 返回 true, 因为存...原创 2019-10-07 22:29:29 · 229 阅读 · 0 评论 -
LeetCode-23 合并K个排序链表---Python代码实现及详解
题目: 合并k个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。示例:输入:[ 1->4->5, 1->3->4, 2->6]输出: 1->1->2->3->4->4->5->6思路:1.读取所有链表值2.构造一个最小堆 hea...原创 2019-07-24 11:13:10 · 396 阅读 · 0 评论 -
LeetCode-34 在排序数组中查找元素的第一个和最后一个位置 --- Python代码实现及详解
题目:给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。你的算法时间复杂度必须是O(log n) 级别。如果数组中不存在目标值,返回[-1, -1]。示例 1:输入: nums = [5,7,7,8,8,10], target = 8输出: [3,4]示例2:输入: nums = [5,7,7...原创 2019-10-07 21:07:05 · 235 阅读 · 0 评论 -
LeetCode-226 翻转二叉树(二叉树镜像)---Python代码实现及详解
题目:示例: 输入: 4 / \ 2 7 / \ / \1 3 6 9输出: 4 / \ 7 2 / \ / \9 6 3 1思路: 可以看到所有非终端结点的左右子树都相...原创 2019-07-23 22:38:06 · 265 阅读 · 0 评论 -
LeetCode-9 回文数---Python代码实现及详解
题目: 判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。示例 1:输入: 121输出: true示例2:输入: -121输出: false解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。示例3:输入: 10输出: false解释: 从右向左读, 为 01...原创 2019-07-24 19:18:44 · 917 阅读 · 0 评论 -
LeetCode-176 第二高的薪水---SQL语句实现及详解
题目: 编写一个 SQL 查询,获取 Employee表中第二高的薪水(Salary)。+----+--------+| Id | Salary |+----+--------+| 1 | 100 || 2 | 200 || 3 | 300 |+----+--------+ 例如上述Employee表,SQL...原创 2019-08-23 10:51:45 · 216 阅读 · 0 评论 -
LeetCode-102 二叉树的层次遍历---Python代码实现及详解
题目: 给定一个二叉树,返回其按层次遍历的节点值。 (即逐层地,从左到右访问所有节点)。例如: 给定二叉树:[3,9,20,null,null,15,7], 3 / \9 20 / \ 5 7返回其层次遍历结果:[[3],[9,20],[15,7]]...原创 2019-07-23 22:41:55 · 824 阅读 · 0 评论 -
LeetCode-193 有效电话号码 --- Bash shell 代码实现及详解
题目:给定一个包含电话号码列表(一行一个电话号码)的文本文件 file.txt,写一个 bash 脚本输出所有有效的电话号码。你可以假设一个有效的电话号码必须满足以下两种格式: (xxx) xxx-xxxx 或xxx-xxx-xxxx。(x 表示一个数字)你也可以假设每行前后没有多余的空格字符。示例: 假设file.txt内容如下:987-123-4567...原创 2019-10-04 11:50:11 · 384 阅读 · 0 评论 -
LeetCode-175 组合两个表---SQL语句实现及详解
题目: 编写一个 SQL 查询,满足条件:无论 person 是否有地址信息,都需要基于上述两表提供person 的以下信息: FirstName, LastName, City, State表1: Person+-------------+---------+| 列名 | 类型 |+-------------+---------+...原创 2019-08-22 19:23:05 · 214 阅读 · 0 评论 -
Python算法之正负交替
1、题目: 给一个包含正负整数的数组,要求对这个数组中的数进行重新排列,使得其正负交替出现。首先出现正数,然后是负数,依次交替出现。有多余的数的一方,就放在末尾。如:输入 [1,2,5,-1,-5,3,-6 ]输出 [1,-1,2,-5,5,-6,3 ]要求:使用O(1)的空间思路解析:题目要求只能使用O(1)的空间复杂度,也就是只能借助一个临时变量。是看题干有两种方式进行正负交替,第一种保持正负数各自原来序列顺序不变,...原创 2021-12-11 16:45:50 · 3872 阅读 · 0 评论 -
Python实现查找凶手
题目:A说:不是我。 B说:是C。 C说:是D。 D说:C在胡说。 已知3个人说了真话,1个人说的是假话。 现在请根据这些信息,写一个程序来确定到底谁是凶手。逻辑思路:答案是C说假话,A、B、D说的是对的,通过假设法进行推断。如果是A说假话,那么B和C说的应该是对的,但是B和C说的不一致,所以A说的是真话。如果是B说假话,那么C和D说的应该是对的,但是C和D说的互相矛盾,所以B说的是真话。如果是D说假话,...原创 2021-12-11 16:40:08 · 2553 阅读 · 2 评论 -
找出列表中第二大数---Python代码实现及详解
题目: 假定 list1 = [1, 3, 2, 6, 9, 8] ,找出数组中次大值(或第二大值),不能使用内置方法,只能遍历一遍。思路: 设置两个标志位一个是one存储最大数,另一个two存储次大数。遍历一次数组即可,先判断是否大于one,若大于将one的值给two,将list1[i]的值给one;否则比较是否大于two,若大于直接将list1[i]的值给tw...原创 2019-10-23 21:30:28 · 3468 阅读 · 3 评论 -
Python算法之二分查找(折半查找)
查找有线性查找、二分查找、通过搜索树查找1.二分查找是对有序表查找方式。二分查找(名折半查找)的查找过程:先确定待查找记录所在的范围(区间),然后逐步缩小范围直到 找到或 找不到 该记录为止。二分经常让手写,注意边界。时间复杂度为 :O(log2n),log以2为底 n 的对数,可以简写成 O(log n)。空间复杂度:递归形式复杂度O(n),递归一次要开辟一个空间。非...原创 2019-07-16 20:00:46 · 2849 阅读 · 1 评论 -
Python算法之堆排序
1.堆、栈、堆栈、队列介绍堆 (heap):是一种经过排序的树形数据结构,满足完全二叉树即所有非终端结点的值均不大于(或不小于)其左、右孩子结点的值。由此,若序列{k1, k2, ..., kn}是堆,则堆顶元素(或完全二叉树的根)必为序列中 n 个元素的最小值(或最大值),根结点最大的堆叫做最大堆或大根堆,根结点最小的堆叫做最小堆或小根堆。堆运行时动态分配内存,需要程序员申请,并指明大小。堆...原创 2019-07-17 16:21:51 · 579 阅读 · 0 评论 -
Python算法之冒泡排序
1.Python内置排序函数从小到大排序:sorted(list)从大到小排序:sorted(lst, reverse = True)①不改变原有列表元素顺序,只返回排序后的结果# sorted对列表进行排序之后会返回一个有序列表,并不会改变原有列表顺序alist = [0, 10, 88, 19, 9, 1]# 从小到大排序print(sorted(alist)) ...原创 2019-07-17 15:04:58 · 356 阅读 · 0 评论 -
Python数据结构之链表及实现链表反转
1.链表有单链表、双链表、循环双端链表 单链表每个结点包括两个域,其中Val1存储数据元素的信息的域称为数据域(值)。next存储直接后继存储位置的域称为指针域(指向下一个结点)。最后一个结点的next指向为None(空) 对于单链表结构可以使用 calss 的两个属性表示 val , next。 双链表每个结点包括三个域,pre指针指向上...原创 2019-07-20 21:47:19 · 360 阅读 · 0 评论 -
Python数据结构之队列实现
队列(queue /kjuː/)是先进先出结构,只能在队头做删除操作,在队尾做插入操作。1.如何使用Python实现队列? 实现队列 append (进入队尾) 和 pop (从队头出来) 操作,如何做到先进先出 使用Python 的 list 或者 collections.deque 实现队列。# 实现队列。使用collections模块deq...原创 2019-07-20 22:33:34 · 459 阅读 · 0 评论 -
Python数据结构之二叉树并实现先根遍历
二叉树(Binary Tree)是一种树型结构,它的特点是每个结点至多只有两颗子树(即二叉树中不存在度大于2的结点),并且,二叉树的子树有左右之分,其次序不能任意颠倒。先序、中序、后序遍历:先(根)序:先处理根,然后是左子树,最后是右子树中(根)序:先处理左子树,然后是根,最后是右子树后(根)序:先处理左子树,然后是右子树,最后是根树的遍历方式,先序遍历,递归代码...原创 2019-07-22 16:29:05 · 438 阅读 · 1 评论 -
Python算法之 输出0~100之间素数
质数(prime number)又称素数。一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫做质数;否则称为合数。# 输出0~100之间的所有素数def is_prime(n): '''检测大于1,除自身外是否可以其他自然数整除''' if n <= 1: return False for i in range(2, n): i...原创 2019-07-19 10:51:36 · 8355 阅读 · 0 评论 -
Python算法之归并排序(2-路归并排序)
归并排序的子步骤合并两个有序数组,merge /mɜːdʒ/ 合并(一)“归并”含义是将两个或两个以上的有序表组合成一个新的有序表。无论是顺序存储结构还是链表存储结构,都可在O(m+n)的时间量级上实现。合并两个有序数组过程:例如 a = [1, 2] , b = [0, 3, 4] 两个有序数组和一个空数组 res = [ ],设置两个指针,i 指向 a 数组第一个元素,j 指向 b...原创 2019-07-15 23:46:06 · 1309 阅读 · 0 评论 -
Python数据结构之堆并实现从海量数据中寻找最大的K个
1.堆其实是完全二叉树,有最大堆和最小堆最大堆:对每个非叶子结点V,V的值都比它的两个孩子大最大堆支持每次 pop 操作获取最大的元素,最小堆获取最小元素常见问题:用堆来完成 topk 问题,从海量数字中寻找最大的 K 个import heapqclass TopK: ''' 获取大量元素 topk 大个元素,固定内存 思路: 1.先放入元素前 K 个建立最小堆 2...原创 2019-07-22 16:25:46 · 455 阅读 · 0 评论 -
Python算法之快速排序
1.快速排序算法快排经常问:分治法(divide and conquer)就是先分再处理最后合并,快排三步走第一步:Partition:选择基准分割数组为两个子数组,小于基准和大于基准的第二步:对两个子数组分别快排第三步:合并结果分治法三步走,先分割,再递归处理,最后合并结果。快速排序基本思想:通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记...原创 2019-07-15 17:13:48 · 1110 阅读 · 0 评论 -
Python内置数据结构和算法 及 collections模块常用结构用法
1.Python常用内置算法和数据结构 语言内置数据结构5个,分别是 list / tuple / dict / set / frozenset ( /'frəʊznset/ )2.collections模块提供的数据结构扩展3.collections模块常用数据结构用法 collections是Python内建的一个集合模块,提供了许多有用的集合类。...原创 2019-07-14 22:01:19 · 330 阅读 · 0 评论 -
Python数据结构之字典与集合
1.Python dict/set 底层都是哈希表哈希表的实现原理, 底层其实就是一个数组, 通过哈希函数把相应的元素映射到一个数组槽里面。根据哈希函数快速定位一个元素,平均查找O(1),非常快不断加入元素会引起哈希表重新开辟空间,拷贝之前元素到新数组哈希冲突一般有两种解决方式,一种是链接法,还有一种探查法。2.哈希冲突和哈希扩容参考该作者https://blog.csd...原创 2019-07-22 16:33:30 · 176 阅读 · 0 评论 -
排序算法--时间空间复杂度和稳定性
1.常见排序算法和要求 常考排序算法:冒泡排序、快速排序、归并排序、堆排序等 要求:能独立实现代码(手写),能够分析时间空间复杂度2.常用排序算法的时间空间复杂度 注释:n*log2n 是 n 乘以 log 以 2 为底 n 的对数,也可以简写成nlogn。默认情况下2可以去掉。 平均时间复杂度:冒泡、选择、插入都不是分支法平均时...原创 2019-07-14 22:52:55 · 972 阅读 · 0 评论 -
Python数据结构之栈实现
栈(stack)是后进先出结构,只允许在一端栈顶进行插入和删除操作,另一端栈底不能操作,后放进去的先拿出来(即先进后出),栈就像一个桶,后进先出可以理解向一个桶里面放盘子,放完之后拿盘子只能是先从上面开始拿盘子。1.如何使用Python 实现栈?实现栈的 push 和 pop 操作,如何做到后进先出。同样可以使用 Python list 或者 collections.dequ...原创 2019-07-20 23:03:53 · 242 阅读 · 0 评论