基础算法和数据结构
排序、搜索、二叉树等
a flying bird
永远飞翔的鸟
展开
-
可信认证之九阴真经二
可信认证之九阴真经二原创 2022-08-06 15:39:23 · 481 阅读 · 0 评论 -
可信认证之九阴真经一
可信认证之九阴真经一原创 2022-08-06 15:36:22 · 998 阅读 · 0 评论 -
回溯法概述
前言虽然之前也用过回溯法,但总是过一段时间,又会忘记。思来想去,得出一个结论”看(做)一两个回溯法的例子,思想仍然是别人;看(做)多个回溯法的例子,思想才能成为自己的“,于是决定对回溯法进行一个系统的整理和学习,挖掘其精髓,整理出系统的思路和模板,以期待自己能够对该类问题游刃有余。回溯法有“通用的解题法”之称。1.定义:也叫试探法,它是一种系统地搜索问题的解的方法。2.基本...原创 2020-03-29 11:04:41 · 438 阅读 · 0 评论 -
按权重随机选择
力扣https://leetcode-cn.com/problems/random-pick-with-weight/转载 2021-12-31 11:16:44 · 117 阅读 · 0 评论 -
239. 滑动窗口最大值
239. 滑动窗口最大值转载 2021-12-26 21:28:54 · 60 阅读 · 0 评论 -
字典树(前缀树)
代码实现:#include<cstdio>#include<iostream>#include<cstring>using namespace std;const int MAX_NODE = 1000000 + 10;const int CHARSET = 26;int trie[MAX_NODE][CHARSET] = {0};int color[MAX_NODE] = {0};int k = 1;void insert(char ...转载 2021-08-29 09:38:11 · 81 阅读 · 0 评论 -
二叉树路径问题(问题分析+分类模板+题目剖析)
1. 如果是从根节点开始,一般不用需要使用双重递归.2.如果不要求一定要经过根节点,可以使用双重递归,也可以不使用双从递归.: 第一层递归,计算根节点,第二层递归经过其叶子节点例题:1687. 最长同值路径https://leetcode-cn.com/problems/longest-univalue-path/双重递归:class Solution {public: int res = 0; int longestUnivaluePath(TreeNo...原创 2021-07-18 16:15:55 · 263 阅读 · 0 评论 -
前缀和之连续子数组
转载:https://leetcode-cn.com/problems/subarray-sum-equals-k/solution/de-liao-yi-wen-jiang-qian-zhui-he-an-pai-yhyf/转载 2021-07-17 19:03:47 · 74 阅读 · 0 评论 -
堆排序详解--大顶堆
堆排序详解--大顶堆堆的概念堆是一颗顺序存储的完全二叉树每个结点的关键字都不大于其孩子结点的关键字,这样的堆称为小根堆每个结点的关键字都不小于其孩子结点的关键字,这样的堆称为大根堆对于n个元素的序列{R0, R1,R2,.......,Rn}当且仅当下列关系之一的时候,称之为堆(1) Ri <= R2i + 1 且 Ri <= R2i + 2 (小根堆)(2) Ri >= R2i + 1 且 Ri >= R2i + 2 (大根堆)...转载 2021-05-01 19:49:39 · 1755 阅读 · 0 评论 -
STL中二分查找函数的用法-关于lower_bound( )和upper_bound( )的常见用法
lower_bound( )和upper_bound( )都是利用二分查找的方法在一个排好序的数组中进行查找的。在从小到大的排序数组中,lower_bound( begin,end,num):从数组的begin位置到end-1位置二分查找第一个大于或等于num的数字,找到返回该数字的地址,不存在则返回end。通过返回的地址减去起始地址begin,得到找到数字在数组中的下标。upper_bound( begin,end,num):从数组的begin位置到end-1位置二分查找第一个大于num的数字原创 2020-08-23 22:43:46 · 728 阅读 · 0 评论 -
迷宫问题的三种求解方法(递归求解、回溯求解和队列求解)
目录一、迷宫问题的三种求解方法递归求解回溯求解队列求解二、华为迷宫问题一、迷宫问题的三种求解方法在迷宫问题中,给定入口和出口,要求找到路径。本文将讨论三种求解方法,递归求解、回溯求解和队列求解。在介绍具体算法之前,先考虑将迷宫数字化。这里将迷宫用一个二维的list存储(即list嵌套在list里),将不可到达的位置用1表示,可到达的位置用0表示,并将已经到过的位置用...原创 2020-03-25 17:37:24 · 19077 阅读 · 0 评论 -
leetcode 46-47. 全排列
给定一个 没有重复 数字的序列,返回其所有可能的全排列。示例:输入: [1,2,3]输出:[ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1]]解法1:class Solution: def permute(self, nums: List[int]) -> List[List[i...原创 2020-03-24 18:58:16 · 162 阅读 · 0 评论 -
leetcode 按摩师
一个有名的按摩师会收到源源不断的预约请求,每个预约都可以选择接或不接。在每次预约服务之间要有休息时间,因此她不能接受相邻的预约。给定一个预约请求序列,替按摩师找到最优的预约集合(总预约时间最长),返回总的分钟数。注意:本题相对原题稍作改动示例 1:输入: [1,2,3,1]输出: 4解释: 选择 1 号预约和 3 号预约,总时长 = 1 + 3 = 4。示例 2:输入:...原创 2020-03-24 08:27:57 · 320 阅读 · 0 评论 -
leetcode 142. 环形链表 II
思考:对如下图的分析,将头部的线往后合并,则-3刚好在2的位置。可以看成从-3(2)的位置出发,快指针是慢指针的两倍,所以第一次他们相遇,是快指针转动了2圈,慢指针只转动了1圈。此时,慢指针在2处。(注意:3算第一步,4算第二部,第五步是2),注意:相遇的时候,不是在环形入口点。相遇的点到入口点的距离和最开始点到入口点的距离相等class Solution(object):...原创 2020-03-22 20:47:41 · 160 阅读 · 1 评论 -
443. 压缩字符串
给定一组字符,使用原地算法将其压缩。压缩后的长度必须始终小于或等于原数组长度。数组的每个元素应该是长度为1的字符(不是 int 整数类型)。在完成原地修改输入数组后,返回数组的新长度。进阶:你能否仅使用O(1) 空间解决问题?示例 1:输入:["a","a","b","b","c","c","c"]输出:返回6,输入数组的前6个字符应该是:["...原创 2020-02-09 12:29:07 · 114 阅读 · 0 评论 -
LeetCode23. Merge k Sorted Lists
题目地址: https://leetcode.com/problems/merge-k-sorted-lists/description/题目描述:Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.Example:Input:[ 1-...原创 2020-01-12 09:43:39 · 116 阅读 · 0 评论 -
Python 队列Queue和PriorityQueue
1.Python的Queue模块:适用于多线程编程的FIFO实现。它可用于在生产者(producer)和消费者(consumer)之间线程安全(thread-safe)地传递消息或其它数据,因此多个线程可以共用同一个Queue实例。FIFO: First in, First out.先进先出LIFO: Last in, First out.后进先出2优先级队列PriorityQueu...原创 2020-01-11 22:34:46 · 11783 阅读 · 1 评论 -
leetcode703. 数据流中的第K大元素(python)
设计一个找到数据流中第K大元素的类(class)。注意是排序后的第K大元素,不是第K个不同的元素。你的KthLargest类需要一个同时接收整数k和整数数组nums的构造器,它包含数据流中的初始元素。每次调用KthLargest.add,返回当前数据流中第K大的元素。示例:int k = 3;int[] arr = [4,5,8,2];KthLargest k...原创 2020-01-10 23:25:49 · 263 阅读 · 0 评论 -
LeetCode 1046. 最后一块石头的重量(python)
题目描述:有一堆石头,每块石头的重量都是正整数。每一回合,从中选出两块最重的石头,然后将它们一起粉碎。假设石头的重量分别为 x 和 y,且 x <= y。那么粉碎的可能结果如下:如果 x == y,那么两块石头都会被完全粉碎;如果 x != y,那么重量为 x 的石头将会完全粉碎,而重量为 y 的石头新重量为 y-x。最后,最多只会剩下一块石头。返回此石头的重量。如果没有石头...原创 2020-01-10 22:40:52 · 292 阅读 · 0 评论 -
Python LeetCode(204.计数质数)
统计所有小于非负整数 n 的质数的数量。示例:输入: 10输出: 4解释: 小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7 。Solution:(直接遍历寻找质数的话时间复杂度太高,超出时间限制。可以建立一个大小为n的布尔类型的list,从0开始,设置0,1为False[即非素数],2置为True,且将小于n的2的倍数均置为FALSE,之后同理,最终True的个数...原创 2020-01-10 09:02:07 · 134 阅读 · 0 评论 -
LeetCode 114.二叉树展开为链表(Python实现)
方法一: # def preOrderTravel(self,root,listnode): # if not root: # return None # listnode.append(root.val) # self.preOrderTravel(root.left,listnode) # se...原创 2020-01-09 21:29:36 · 326 阅读 · 0 评论 -
数据结构-二叉树的前序、中序、后序遍历(python实现递归和迭代)
二叉树顾名思义,二叉树就是只有两个节点的树,两个节点分别为左节点和右节点,特别强调,即使只有一个子节点也要区分它是左节点还是右节点。常见的二叉树有一般二叉树、完全二叉树、满二叉树、线索二叉树、霍夫曼树、二叉排序树、平衡二叉树、红黑树、B树这么多种类。我们这篇文章中简单介绍一般二叉树、完全二叉树和满二叉树。一般二叉树很简单,只要满足子节点数不超过两个的树就是一棵二叉树。长这样:...原创 2020-01-09 14:46:03 · 606 阅读 · 0 评论 -
LCS(最长公共子串)和最长公共子串(DP) python3实现
一、LCS(最长公共子串)python实现 LCS问题就是求两个字符串最大相同的公共子串;我们现假设有两个字符串X,Y。其长度分别为m,n 我们从X,Y两个字符串的最后一个字符串开始看起 如果 Xm = Yn: LCS(X, Y) = LCS(Xm-1, Yn-1)+ "Xm" 如果Xm != Yn: LCS(X,Y) = max(LCS(Xm-1,Yn), LCS(Xm, Y...原创 2020-01-09 09:52:29 · 2005 阅读 · 1 评论 -
牛客网Python笔试技巧、单行多行输入方法以及代码调试技巧
一、笔试技巧提高通过率大原则:1.本地IDE调代码的速度更快2.修改已>0%的代码比新做一道题更快3.一定要看清题意!!!提高通过率的技巧:1.时间复杂度问题:增加条件break或continue出循环,能break尽量break;减少不必要的判断条件(比如在不在字典中);...原创 2020-01-08 18:44:08 · 5131 阅读 · 1 评论 -
python实现栈在 O(1) 时间内求 min
python的栈是用list实现的,只要将list的append和pop封装到stack类中,即实现了压栈和退栈。如果不考虑时间复杂度可以使用min(),min()可以在不开辟新空间的情况下o(n)的返回栈内最小值。但是如果栈内元素很多,需要被频繁调用返回函数,导致耗时大,为了降低时间复杂度,最理想的方法就是用空间换时间。可以考虑利用两个栈来实现,一个栈保存所有数据,另一个保存对应状态下的最小值。...原创 2020-01-05 10:13:18 · 230 阅读 · 0 评论 -
归并排序的python实现:递归与非递归
递归原理比较简单,就是有序数组的合并。def merge(a, b): c = [] i = j = 0 while i < len(a) and j < len(b): if a[i] < b[j]: c.append(a[i]) i += 1 else: ...原创 2020-01-05 10:06:34 · 555 阅读 · 0 评论 -
基于python的动态规划经典问题(爬楼梯,取珠宝,最大子序列和,找零钱)
1、什么是动态规划动态规划(dynamic programming)是运筹学的一个分支,是求解决策过程(decision process)最优化的数学方法。把多阶段过程转化为一系列单阶段问题,利用各阶段之间的关系,逐个求解,创立了解决这类过程优化问题的新方法——动态规划。使用动态规划特征:1. 求一个问题的最优解2. 大问题可以分解为子问题,子问题还有重叠的更小的子问题3. 整...原创 2019-12-26 18:58:52 · 412 阅读 · 0 评论 -
海量数据处理 - 10亿个数中找出最大的10000个数(top K问题)
教你如何迅速秒杀掉:99%的海量数据处理面试题https://blog.csdn.net/v_july_v/article/details/7382693十道海量数据处理面试题与十个方法大总结https://blog.csdn.net/twlkyao/article/details/12037073海量数据中找出出现次数最多的前10个URL(如何找出访问最多的I...转载 2019-12-25 15:30:19 · 1044 阅读 · 0 评论 -
LeetCode-Python-109. 有序链表转换二叉搜索树
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。本文链接:https://blog.csdn.net/qq_32424059/article/details/89045959给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树。本题中,一个高度平衡二叉树是指一个二叉树每个节点的左右两个子树的高度差的绝对值不超过 1...转载 2019-09-26 16:31:02 · 141 阅读 · 0 评论 -
python PriorityQueue
python 优先队列 PriorityQueue,python3 不允许插入优先级相同的值或者是无法判断优先级的值到优先队列。刷题看到一种不错的方法,插入的时候加入一个index,就不会出现优先级相同的情况了。leetcode 23题,Merge k sorted linked lists and return it as one sorted list. Analyze and de...转载 2019-09-25 15:18:20 · 6062 阅读 · 0 评论 -
树、森林与二叉树的相互转换
树、森林与二叉树的相互转换设森林F中有三棵树,第一,第二,第三棵树的结点个数分别为M1,M2和M3。与森林F对应的二叉树根结点的右子树上的结点个数是( )A)M1 B)M1+M2 C)M3 D)M2+M3【答案】D【解析】当森林转化为对应的二...转载 2019-09-19 10:54:38 · 783 阅读 · 0 评论 -
堆排序算法讲解 及python3实现
目录一、堆排序简介1 用数组构建堆时注意事项2 堆排序基本思想及步骤二、大顶堆实现三、小顶堆实现四、 堆排序的递归实现五、堆的上移和下沉六、python中堆heapq模块一、堆排序简介 堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为O(nlogn),它也是不稳定排序。首先简单了解下堆结构。...原创 2019-09-12 11:54:59 · 285 阅读 · 0 评论 -
数组进行排序,时间复杂度O(N)&&求无序数组的中位数
Hello,本篇博客Val要和大家分享关于如何对数组进行排序,且时间复杂度为O(N);和求无序数组的中位数。例题:1 . int a[] = { 12, 13, 12, 13, 19, 18, 15, 12, 15, 16, 17 },要求对数组a进行排序,要求时间复杂度为O(N)2.求一个无序数组的中位数。如:{ 2, 5, 4, 9, 3, 6, 8, 7, 1 }的中位数为5...转载 2019-09-04 19:48:44 · 1262 阅读 · 0 评论 -
最长回文子串——Manacher 算法
参考:https://segmentfault.com/a/1190000003914228(该连接写的很详细,可以看该连接,有对应的图)https://blog.csdn.net/asd136912/article/details/78987624LeetCode 5. Longest Palindromic Substring 最长回文子串 Python 四种解法(Manacher 动...转载 2019-06-11 04:40:58 · 136 阅读 · 0 评论 -
从头到尾彻底理解KMP(2014年8月22日版)
参考:https://blog.csdn.net/v_july_v/article/details/7041827所属专栏:经典算法研究从头到尾彻底理解KMP作者:July时间:最初写于2011年12月,2014年7月21日晚10点 全部删除重写成此文,随后的半个多月不断反复改进。后收录于新书《编程之法:面试和算法心得》第4.4节中。1. 引言...转载 2019-06-09 21:44:00 · 118 阅读 · 0 评论