![](https://img-blog.csdnimg.cn/20190927151117521.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
数据结构与算法
常见的数据结构与算法的问题,目前包括排序算法
_____miss
这个作者很懒,什么都没留下…
展开
-
无重复字符串的最长子串
method1:class Solution(object): def lengthOfLongestSubstring(self, s): """ :type s: str :rtype: int """ sub_str = list() sub_length = 0 f...原创 2019-03-01 00:32:24 · 155 阅读 · 0 评论 -
整数反转
class Solution(object): def reverse(self, x): """ :type x: int :rtype: int """ x = str(x) new_x = "" length = len(x) ...原创 2019-03-02 11:24:30 · 134 阅读 · 0 评论 -
PAT 1068. 万绿丛中一点红(20)
就想知道同样的题,同样的思路,为什么c++就可以,而java不可以呢,真的是改得烦躁啊!!!就是想知道为什么啊?如果有哪位大神看出来了,欢迎指正import java.util.HashMap;import java.util.Map;import java.util.Map.Entry;import java.util.Scanner;public class Main {原创 2017-04-01 20:06:13 · 897 阅读 · 2 评论 -
LeetCode 84. 柱状图中最大的矩形——Python实现(栈)
# -*- coding: utf-8 -*-"""@File : largest_rectangle_area.py@Author: zhang_san@Time : 2020/9/13 10:31@des : 题目:给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为1。求在该柱状图中,能够勾勒出来的矩形的最大面积。 思路:使用栈的方式。因为柱状图的下边界是固定的,所以求柱状图中的矩形面积,其实是求以每一个柱高为上边界,可以形成的矩形的面.原创 2020-09-13 16:28:34 · 311 阅读 · 0 评论 -
LeetCode 300.最长上升子序列——Python实现(动态规划、二分查找)
# -*- coding: utf-8 -*-"""@File : longest_increasing_subsequence_dp.py@Author: zhang_san@Time : 2020/9/5 16:04@des : 题目:给定一个无序的整数数组,找到其中最长上升子序列的长度。 输入: [10,9,2,5,3,7,101,18],输出: 4 。解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4。 method 2:对动态.原创 2020-09-06 13:53:15 · 376 阅读 · 0 评论 -
LeetCode 215. 数组中的第K个最大元素——Python实现(堆排序、快速排序)
1、用堆排序的方法# -*- coding: utf-8 -*-"""@File : heap_find_kth_largest.py@Author: zhang_san@Time : 2020/8/28 19:54@des : 在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。 即:在数组进行降序排列之后,取 第 k 个位置上的值。这里不考虑重复的情况,比如排序后为[6, 5, 5, 4,原创 2020-08-30 16:41:09 · 1060 阅读 · 0 评论 -
LeetCode 704.二分查找——Python实现
# -*- coding: utf-8 -*-"""@File : binary_search.py@Author: zhang_san@Time : 2020/8/28 17:59@des : 二分查找。"""class Solution: def search(self, nums, target) -> int: start, end = 0, len(nums) - 1 # 递归查找目标值 while star.原创 2020-08-28 19:49:13 · 474 阅读 · 0 评论 -
LeetCode 142.环形链表II——Python实现(hash、快慢指针)
1、使用哈希查找的方法class Solution: def detectCycle(self, head: ListNode) -> ListNode: if head is None or head.next is None: return None # 用hashmap的方式存储 node_index_dict = {} i = 0 while head:原创 2020-08-28 11:33:18 · 309 阅读 · 0 评论 -
LeetCode 141.环形链表——Python实现
1、用哈希查找的方法# -*- coding: utf-8 -*-"""@File : hash_has_cycle.py@Author: zhang_san@Time : 2020/8/27 22:19@des : 题目:给定一个链表,判断链表中是否有环。为了表示给定链表中的环,我们使用整数 pos 来表示链 表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。 方法一:利用哈希查找的方法,遍历节点,存入ha原创 2020-08-27 22:55:18 · 252 阅读 · 0 评论 -
LeetCode 160.相交链表——Python实现
感觉LeetCode的简单、中等、困难这三个等级是按照代码的复杂程度,以及好记程度来的。。。。# -*- coding: utf-8 -*-"""@File : intersection_node.py@Author: Qiu_Nian@Time : 2020/8/27 20:43@des : 一种比较巧妙的方式是,分别为链表A和链表B设置指针A和指针B,然后开始遍历链表,如果遍历完当前链表,则将指针 指向另外一个链表的头部继续遍历,直至两个指针相遇。原创 2020-08-27 22:15:36 · 229 阅读 · 0 评论 -
LeetCode 25.k个一组翻转链表——Python实现
1、官方给的一种解法,很直观,就是指针太多,很容易绕晕class Solution: def reverseKGroup(self, head: ListNode, k: int) -> ListNode: def reverseList(head_node, tail_node): new_tail_node = head_node visited_head = None while head_原创 2020-08-27 19:37:11 · 267 阅读 · 0 评论 -
LeetCode 206.反转链表——Python实现
1、比较直观的方法,遍历链表,每一个节点做反转class Solution: def reverseList(self, head: ListNode) -> ListNode: visited_head = None # visited_head 是已经翻转过的链表的头节点 while head: current_head = head # 由于head连接着后面还没有翻转过的节点,所以不可以直接使用,则得使用原创 2020-08-27 19:30:33 · 367 阅读 · 0 评论 -
LeetCode 21.合并两个有序链表——Python实现
1、比较直观的方式 用两个分别指向两个链表的指针,一起滑动. (1)用一个指针head始终跟踪当前最新的节点,也就是最终的有序链表list的最后一个元素 (2)另外l1和l2分别向后滑动进行值得比较,每一轮的比较都会将比较中的更小的那个值加入到结果链表中(结果链表通过head串联起来) (3)因为每一轮比较只加入一个值,所以最终只有最后一轮比较的其中一个节点没有添加进来class Solution: def mergeTwoLists(self, l1:...原创 2020-08-26 23:33:47 · 327 阅读 · 0 评论 -
LeetCode 958.二叉树的完全性检验——Python实现(BFS)
题目:给定一个二叉树,确定它是否是一个完全二叉树。百度百科中对完全二叉树的定义如下: 若设二叉树的深度为 h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边, 这就是完全二叉树。(注:第 h 层可能包含 1~2h个节点。)1、解题思路:(1)从完全二叉树的定义来看,除了最后一层以外,其它层的元素个数应该是达到最大的。(2)对于最后一层的元素,所有的元素必须全部靠左(3)按以上所述,如果可以获取每一层的元素,那么就可以获取每一层大大..原创 2020-08-26 17:04:58 · 362 阅读 · 0 评论 -
LeetCode 226.翻转二叉树——Python实现(递归、迭代)
1、题目:翻转二叉树。就是一颗二叉树的所有子树都会发生左右翻转,所以这种情况用递归就可以实现class Solution(object): def invertTree(self, root: TreeNode) -> int: if root is None: return root left_node = self.invertTree(root.left) right_node = self.invertTr原创 2020-08-26 13:58:04 · 325 阅读 · 0 评论 -
LeetCode 110.平衡二叉树——Python实现(递归)
题目:给定一个二叉树,判断它是否是高度平衡的二叉树。一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。思路:平衡二叉树的子树也是一颗平衡二叉树。所以,可以用递归的方法,从叶子节点开始,逐层向上检验子树。在每一次的 节点计算力,需要计算的是以当前节点为root,其左右子树是否平衡,如果平衡就是true,否则就是false。那么如何判断 左右子树是否平衡,就要计算左右子树的高度,也就是层数。同时,为了便于当前 root节点的上一级节点进行判断,需要返 回当前子树.原创 2020-08-26 11:35:03 · 361 阅读 · 0 评论 -
LeetCode 543.二叉树的直径——Python实现
题目:给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。思路:基于二叉树的结构,对于一条路径上的点,要么是做向上传递信息的,要么是向两个子树传递信息。在求最大路径和的时候, 需要传递的是节点的 value,在求最长路径时,求的是这条路径的长度,每增加一个节点就增加 1,所以这里比最大路径和相对简 单,每个节点只需要向上返回自己的最大路径即可。class Solution(object): def diameterOfBinar.原创 2020-08-26 10:37:46 · 314 阅读 · 0 评论 -
LeetCode 124.二叉树中的最大路劲和——Python实现(递归、广度优先)
1、这题真的难得要把人送走了。。。 题目:求解二叉树中的任意一条路径的最大和,不一定是要从根节点开始,思路如下: 对于二叉树的深度遍历,本质是从叶子结点计算,然后将叶子节点相关的计算的相关值向上传递。而对于一条和最大的路径,它上面的所有点只可能担任两种角色,一种在这条路径里连接左右两颗子树,那么这个时候 left+root+right就是和最大的路径,还有一种 就是这个节点只是路径上的向上传递的节点,它的任务是连接自己的最大子树和自己的父级节点。class Soluti...原创 2020-08-25 20:34:17 · 280 阅读 · 0 评论 -
LeetCode 200.岛屿数量——Python实现(递归、广度优先)
1、通过递归的方式实现岛屿数量的计算 (1)寻找某一个 1 为入口,迭代将与它相连的 1 都标记为0,这样直到相连的一整块周围都没有 1 ,只有0的时候,迭代结束 (2)完成(1)中的 一个完整的迭代一次,就代表找到了一块岛屿 (3)在整个网格上循环找为 1 的入口,然后计算岛屿的数量class Solution: def numIslands(self, grid): def mark_zeros(grid, i, j, num_row, num_c...原创 2020-08-25 16:53:18 · 1326 阅读 · 0 评论 -
LeetCode 199.二叉树的右视图——Python实现(广度优先搜索、深度优先搜索)
1、广度优先搜索class Solution(object): def rightSideView(self, root: TreeNode): if root is None: return [] # 通过队列来存储BFS的节点,然后获得每一层的最后一个节点 queue = [root] view_list = [] while queue: view_list原创 2020-08-25 14:58:57 · 234 阅读 · 0 评论 -
LeetCode 236. 二叉树的最近公共祖先——Python实现(递归,哈希表)
1、直接用迭代的方法 使用递归的方法,找出二叉树中两个节点的最近公共祖先,分析如下: 对于两个节点p和q的公共祖先r,他们要么在r的同一边,要么在这个节点的两边,因此,只要满足这两个条件即可,也就是说: 只要 f(r.child, p) and f(r.child,q) 成立,这个r就可能是它俩的祖先。换一个角度说,r有两条支线,现在不管p和 q在哪条支线,只要两条支线都为真(即包含目标节点),并且有一个交集,那这个交集这就是公共祖先。 这样的话,我们只要通过 p 和 q 一路标记...原创 2020-08-24 22:47:50 · 555 阅读 · 0 评论 -
LeetCode 112.路径总和——Python实现(二叉树,广度优先搜索)
1、使用 BFS(广度优先搜索)的方法实现计算根节点到每个子节点的和,知道最后的叶子节点,判断和是否为指定的值class Solution: def hasPathSum(self, root: TreeNode, sum: int) -> bool: if root is None: return False # 使用队列存储当前节点和根节点到当前节点的和 queue = [(root, root.val)]原创 2020-08-23 15:38:08 · 226 阅读 · 0 评论 -
LeetCode 101.二叉树的对称——Python实现
1、使用递归的方式实现二叉树是否对称的判断,对称判断的本质是,在对称位置上的值是否是相等,因此使用双指针滑动寻找对称的位置class Solution(object): def isSymmetric(self, root: TreeNode): def symmetric_func(left, right): # 如果对比的两个节点都是空,说明对称 if left is None and right is None:原创 2020-08-23 15:00:31 · 311 阅读 · 0 评论 -
LeetCode 104.二叉树的最大深度——Python实现
1、递归实现,首先是自己写的一种递归实现,感觉比较直观的利用的当前节点和当前节点的深度class Solution(object): def maxDepth(self, root: TreeNode): def depth_func(node, node_d): if node is None: return node_d return max(depth_func(node.left, no原创 2020-08-23 10:59:48 · 275 阅读 · 0 评论 -
LeetCode 102.二叉树的层序遍历——Python实现(二叉树、队列)
过队列的方式实现层序遍历,层序遍历与 BFS的不同点在于,层序遍历返回的每一层是一个list,而BFS是所有层拼起来的一个数组class Solution(object): def levelorderTraversal(self, root: TreeNode): if root is None: return [] result, level = [], [] queue = [None, root] .原创 2020-08-22 22:20:47 · 256 阅读 · 0 评论 -
LeetCode 145.二叉树的后序遍历——Python实现(二叉树、栈)
1、常用的递归方法:省略2、LeetCode提供的一种后序遍历方法,感觉比较巧妙,大概的思想是: 前序遍历是root-left-right,如果把它改成root-right-left,然后做一下 翻转,就是left-right-root了,刚好是需要的后续遍历。class Solution(object): def postorderTraversal(self, root: TreeNode): if root is None: re...原创 2020-08-22 22:17:48 · 225 阅读 · 0 评论 -
LeetCode 94.二叉树的中序遍历——Python实现(二叉树,栈)
1、用递归的方式实现class Solution(object): def inorderTraversal(self, root: TreeNode): if root is None: return [] return self.inorderTraversal(root.left) + [root.val] + self.inorderTraversal(root.right)2、用栈的方式实现(这个方法太难懂了).原创 2020-08-22 16:24:26 · 351 阅读 · 0 评论 -
LeetCode 144.二叉树的前序遍历——Python实现(二叉树、栈)
1、比较直接的递归实现# Definition for a binary tree node.# class TreeNode(object):# def __init__(self, x):# self.val = x# self.left = None# self.right = Noneclass Solution(object): def preorderTraversal(self, root: TreeNode)原创 2020-08-22 13:42:02 · 210 阅读 · 0 评论 -
排序算法——选择排序Python实现
"""选择排序:每次遍历未排序的列表,标记最值的index,最终交换最值和表头的值"""l = [2, 9, 10, 11, 3, 7, 4, 0, 6, -7, 11]for i in range(len(l) - 1): max_index = i for j in range(i + 1, len(l)): if l[j] > l[max_index]: max_index = j temp = l[i] l[.原创 2020-07-22 18:06:17 · 109 阅读 · 0 评论 -
排序算法——希尔(shell)排序Python实现
"""shell排序:每一轮先将数据分组,在分组里面对数据进行插入排序,依次进行增量式分组(每一次分组,组数会减少,但是每个组内的元素会增多),直到最后每一个数与其邻居进行比较为止。在每个组进行插入排序时,不同的组是交叉进行的,可以参考代码for i in range(gap, len(l))。"""l = [2, 9, 10, 11, 3, 7, 4, 0, 6, 11, -7]gap = int(len(l)/2)while gap > 0: for i in range(.原创 2020-07-22 18:04:52 · 229 阅读 · 0 评论 -
排序算法——插入排序Python实现
"""直接插入排序:每次从未排序的序列中选择一个数,依次从尾开始和已排序的序列作对比,然后插入到适当的位置"""l = [2, 9, 10, 11, 3, 7, 4, 0, 6, 11, -7]for i in range(1, len(l)): temp = l[i] j = i - 1 while j >= 0 and l[j] < temp: l[j + 1] = l[j] j -= 1 l[j + 1] = t.原创 2020-07-22 18:02:26 · 135 阅读 · 0 评论 -
排序算法——冒泡排序Python实现
"""冒泡排序:每次遍历未排序的列表,比较相邻两个位置的值,并按需要排序的大小交换位置"""l = [2, 9, 10, 11, 3, 7, 4, 0, 6, 10, 10, 12, 11]for i in range(len(l) - 1, 0, -1): for j in range(i): if l[j + 1] > l[j]: temp = l[j] l[j] = l[j + 1] l[j.原创 2020-07-22 17:59:51 · 169 阅读 · 0 评论 -
排序算法——归并排序Python实现
# -*- coding: utf-8 -*-"""@File : merge_sort.py@Author: Zhang_San@Time : 2020/7/22 00:49@des : 归并排序:先将序列进行划分,一直划分到每个最小的单元是一个数为止,然后合并最小的单元,在合并两个单元时, 依次比较当前两个单元中的值进行排序,最终形成一个有序的新单元 每一个排序后的有序序列可以看作由以下两步组成: (1)两个有序的.原创 2020-07-22 17:16:18 · 258 阅读 · 0 评论 -
排序算法——快速排序Python实现
# -*- coding: utf-8 -*-"""@File : quick_sort.py@Author: Zhang_San@Time : 2020/7/17 18:25@des : 快速排序:每次选择一个pivot,然后以这个pivot为中心,两边分别存放比其大或者小的值,依次 迭代进行划分,最终完成排序 (这里一定要注意指针滑动的方向,确保头和尾的数字有被比较到)"""def partition(arr, st.原创 2020-07-22 00:20:34 · 169 阅读 · 0 评论 -
数据结构与算法——排序算法总结及Python实现
1、排序算法的总结 下面是看了排序算法后,根据算法的特点,自己做的一个小结:原创 2020-07-16 21:29:50 · 465 阅读 · 0 评论 -
排序算法——堆排序Python实现
# -*- coding: utf-8 -*-"""@File : heap_sort.py@Author: Zhang_San@Time : 2020/7/20 17:51@des : 堆排序:基于大根堆或者小根堆的一种排序,每次通过大/小根堆得特点,找出堆顶的元素,并跟当前子堆的最后一个元素交换,排除最后一个元素后, 新的子树重新形成堆,依次交换堆顶和最后当前堆的最后一个叶子元素,直到排序完成。 实现过程: (1)根据.原创 2020-07-22 00:06:02 · 211 阅读 · 0 评论