数据结构与算法
后端工匠之道
欢迎来到"后端工匠之道",我是禾乃儿老师,一个热衷于探索Web后端技术的工程师。在这个博客中,我将分享我的技术洞察、项目经验和行业见解,带你深入探索后端开发的无限可能。
我是一位注重代码质量、性能优化和系统设计的后端工程师。我的使命是通过创造性的编码和创新性的解决方案,不断推动后端技术的边界。在"后端工匠之道"这个空间,我将分享我在构建可靠、高效和可扩展Web应用程序方面的见解,以及面临的挑战和解决方案。
本人专注于,数据库优化与设计,RESTful API 构建,服务端性能调优,微服务架构实践,高可用分布式系统搭建,安全性与身份验证
让我们一同探索后端的奇妙世界,打磨我们的技术,成为后端工匠
展开
-
算法图解之快排归纳整理
快速排序分而治之D&C 是一种解决问题的思路和方法,也是我们第一种了解的算法思想的方法4.1 分而治之(思想)将最小的基线条件找出,不断的缩小范围sum函数 将list里的元素单独取出进行相加求和4.2 快速排序当你做算法排序的时候,第一步是什么?第一步:先找到基线条件,什么是基线条件?基线条件就是基础的退出循环的条件1. 当数组为空的时候,可以退出循环。2. 当数组只有一个值的时候,不需要排序,可以退出循环。所以在快速排序过程中第一句的代码如下:def quicksort(原创 2022-01-18 11:19:02 · 401 阅读 · 0 评论 -
《算法导论第一章》——插入排序算法的手敲,及正倒序的问题
# 插入排序倒序def insertion_sort(a_list): if len(a_list) >= 2: for j in range(1, len(a_list) + 1): # j 等于下标的从元素列表第二个开始取值 while j < len(a_list) and j - 1 >= 0: if a_list[j - 1] > a_list[j]: # >.原创 2021-12-23 14:42:39 · 237 阅读 · 0 评论 -
《算法导论第一章》——插入排序算法和并归排序算法的速度实验实例
算法导论的一道思考题1.2-2 假设我们正在比较插入排序和并归排序在相同机器上的实现。对规模n的输入,插入排序程序运行8n^2步,而并归排序运行64nlogn步,对于哪些n值,插入排序优于并归排序?首先我们都知道插入排序的时间复杂度为n^2,也就是我们常说比较高的时间复杂度,实际应用需要试验结果得出并归排序的时间复杂度为nlogn,同比之下,并归速度吊打插入,肯定用并归做算法!书中给到一个例子,让一个超级大牛写插入排序,只要8次就能运行完整个插入排序一个菜鸟写并归,他需要写64次代码才能执行完,原创 2021-12-17 11:12:26 · 855 阅读 · 0 评论 -
leetcode控制台运行的代码和我本地运行的一样,但是结果不一样,不知道为什么
"""4. 寻找两个正序数组的中位数给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。算法的时间复杂度应该为 O(log (m+n)) 。示例 1:输入:nums1 = [1,3], nums2 = [2]输出:2.00000解释:合并数组 = [1,2,3] ,中位数 2示例 2:输入:nums1 = [1,2], nums2 = [3,4]输出:2.50000解释:合并数组 = [1,2,3,.原创 2021-11-25 17:34:14 · 916 阅读 · 0 评论 -
2021-08-04装水最多的容器,11题,两个for循环超时待改进
def maxAreas(height): """ :type height: List[int] :rtype: int """ max_area = 0 for i in range(len(height)): x1 = i + 1 # 求出每个数据的X轴长度 y1 = height[i] # 求出第一组数据的Y for k in range(x1, len(height)): x原创 2021-08-04 18:30:21 · 73 阅读 · 0 评论 -
《买卖股票的最佳时机》算法日记 2021.7.23,每天一道算法题,怒刷Leetcode,解题完成,写了两种解题方法,时间超出限制,待优化!
今天写了两种解法,第一种感觉不像在写算法,在凑算法,没继续写了,看着很麻烦的样子。第二种用双指针加一个for循环和while循环,感觉复杂度应该是nlogn,但是不满足题目要求,提交了几次都是超出时间限制,准备自己研究一下,可能是每次操作数据的增删改查比较费时吧。今天先到这里,周末快乐!"""给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获原创 2021-07-23 19:05:02 · 110 阅读 · 2 评论 -
《爬楼梯》算法日记 2021.7.22,每天一道算法题,怒刷Leetcode,未做出,看评论思路后得出解。
"""70. 爬楼梯假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?注意:给定 n 是一个正整数。示例 1:输入: 2输出: 2解释: 有两种方法可以爬到楼顶。1. 1 阶 + 1 阶2. 2 阶示例 2:输入: 3输出: 3解释: 有三种方法可以爬到楼顶。1. 1 阶 + 1 阶 + 1 阶2. 1 阶 + 2 阶3. 2 阶 + 1 阶通过次数497,323提交次数949,697请问原创 2021-07-22 17:55:42 · 106 阅读 · 0 评论 -
《最大子序和》算法日记 2021.7.20,每天一道算法题,怒刷Leetcode,解决之前速度问题。代码为评论区,思路动态规划,继续学习中
def maxSubArray(nums): """ :type nums: List[int] :rtype: int """ for i in range(1, len(nums)): print(nums[i]) print("max", max(nums[i - 1], 0)) nums[i] = nums[i] + max(nums[i - 1], 0) print(nums) return原创 2021-07-20 18:29:43 · 68 阅读 · 0 评论 -
《括号生成》算法日记 2021.7.19,每天一道算法题,怒刷Leetcode,解题思路查看答案得出,难但要坚持!
"""22.括号生成数字n代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且有效的括号组合。示例1:输入:n = 3输出:["((()))",(()()),(())(),()(()),()()()"]示例2:输入:n = 1输出:["()"]提示:1 <= n <= 8通过次数303, 831提交次数393, 400请问您在哪类招聘中遇到此题?"""def generateParenthesis(n): res =原创 2021-07-19 19:04:40 · 87 阅读 · 0 评论 -
《括号生成》算法日记 2021.7.16,每天一道算法题,怒刷Leetcode,解题失败,今天工作巨忙,标记一下,有时间补上!
"""22.括号生成数字n代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且有效的括号组合。示例1:输入:n = 3输出:["((( )))",(() ())(() )()()( ())()( )()"]示例2:输入:n = 1输出:["()"]提示:1 <= n <= 8通过次数303, 831提交次数393, 400请问您在哪类招聘中遇到此题?"""def generateParenthesis(n):原创 2021-07-16 18:48:04 · 85 阅读 · 0 评论 -
《最大子序和》算法日记 2021.7.15,每天一道算法题,怒刷Leetcode,解题失败,超出时间限制!
"""给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 示例 1:输入:nums = [-2,1,-3,4,-1,2,1,-5,4]输出:6解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。示例 2:输入:nums = [1]输出:1示例 3:输入:nums = [0]输出:0示例 4:输入:nums = [-1]输出:-1示例 5:输入:nums = [-100000]输出:-100000原创 2021-07-15 17:25:41 · 207 阅读 · 0 评论 -
《无重复字符的最长子串》中级难度 算法日记 2021.7.14,每天一道算法题,怒刷Leetcode
"""3. 无重复字符的最长子串给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。示例 1:输入: s = "abcabcbb"输出: 3解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。示例 2:输入: s = "bbbbb"输出: 1解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。示例 3:输入: s = "pwwkew"输出: 3解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。 请注意原创 2021-07-14 16:39:54 · 67 阅读 · 0 评论 -
《删除有序数组中的重复项》算法日记 2021.7.13,每天一道算法题,怒刷Leetcode
"""26. 删除有序数组中的重复项给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。说明:为什么返回数值是整数,但输出的答案是数组呢?请注意,输入数组是以「引用」方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。你可以想象内部操作如下:// nums 是以“引用”方式传递的。也就是说,不对实参做任何拷贝in原创 2021-07-13 16:43:56 · 74 阅读 · 0 评论 -
《 有效的括号》算法日记 2021.7.12,每天一道算法题,怒刷Leetcode
"""给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。 示例 1:输入:s = "()"输出:true示例 2:输入:s = "()[]{}"输出:true示例 3:输入:s = "(]"输出:false示例 4:输入:s = "([)]"输出:false示例 5:输入:s = "{[]}"输出:true 提示:原创 2021-07-12 15:53:22 · 85 阅读 · 3 评论 -
如何使用hashmap双向链表实现LruCache算法?
python的lrucache算法lruCache算法是什么?双向链表LinkedHashMap一点废话:对于世间事物,我们都应该充满好奇心。对于学习,我们更应该保持一份积极乐观的态度和敢于质疑的精神。我不认为自己是在做毫无意义的事情,因为内心的驱动力就是我拾起它源源不断的动力。记得两年前看到‘算法‘二字便可劝退我内心高大伟岸的灵魂(byl)!!!现在我们试着接触看看!lruCache算法是什么?LruCache算法,又称为近期最少使用算法。LruCache 中 Lru 算法的实现就是通过 Link原创 2021-06-26 16:44:56 · 331 阅读 · 0 评论 -
关于快速排序和python的sort函数性能比较
最爱问的快速排序性能测试手写的快速排序,最简单,无优化的版本居然比python内置函数sort慢了近100倍import timeimport randomdef partition(arr, low, high): # 分割 i = (low - 1) # 最小元素的索引 pivot = arr[high] for j in range(low, high): # 当前元素小于或等于pivot if arr[j] <= pivot:原创 2020-11-11 16:04:08 · 1815 阅读 · 2 评论 -
撸袖子敲python算法之快速排序(手敲)
python快速排序原创 2020-11-10 15:34:08 · 791 阅读 · 0 评论 -
撸袖子敲python算法之插入排序(手敲)
def inster_sort(sort_list): # 插入排序 length = len(sort_list) # 计算列表长度 for i in range(1, length): # 循环列表次数 key = sort_list[i] # 赋值key为第一个要比对的值 j = i - 1 # 取列表最小索引开始 while j > 0 and key > sort_list[i]: #原创 2020-11-06 10:49:05 · 183 阅读 · 0 评论 -
撸袖子敲python算法之冒泡排序(手敲)
def inster_sort(sort_list): # 插入排序 length = len(sort_list) # 计算列表长度 for i in range(1, length): # 循环列表次数 key = sort_list[i] # 赋值key为第一个要比对的值 j = i - 1 # 取列表最小索引开始 while j > 0 and key > sort_list[i]: #原创 2020-11-05 16:30:05 · 118 阅读 · 0 评论 -
撸袖子敲python算法之选择排序(手敲)
def selection_sort(sort_list): for i in range(len(sort_list)): mid_index = i # 获取最小索引 for j in range(i + 1, len(sort_list)): if sort_list[mid_index] > sort_list[j]: mid_index = j sort_list[mid_inde原创 2020-11-05 14:42:01 · 92 阅读 · 0 评论 -
python之冒泡排序后的基于递归的二分法查找数据算法
纯手敲实例:# 冒泡排序unordered_list = [1, 89, 6, 55, 45, 78, 43, 7, 53, 2, 6, 8, 45, 88]for i in range(len(unordered_list) - 1): # 循环列表长度个数为下标,但是需要减一,因为列表元素个数和range函数的计数单位不一样 for j in range(len(unordered_list) - 1 - i): # 减少一个就少循环一次 if unorde原创 2020-11-04 18:37:45 · 183 阅读 · 0 评论 -
python中什么时候使用列表,什么时候使用数组?
当列表不是首选时很多同学在使用python数据类型时候,很多时候直接使用list,虽然列表既灵活又简单,但面对各类需求时,我们可能会有更好的选择。比如,要存放1000万个浮点数的话,数组(array)的效率就要高得多,因为数组在背后存的并不是float对象,而是数字的机器翻译,也就是字节表述。这一点就跟C语言中的数组一样。再比如说,如果需要频繁对序列做先进先出的操作,deque(双端队列)的速度应该会更快。如果在你的代码里,包含操作(比如检查一个元素是否出现在一个集合中)的频率很高,用set(集合)会原创 2020-10-29 16:02:17 · 1421 阅读 · 1 评论 -
python之元组与记录,及拆包
import osx, y = (2, 10) # 这里是元组拆包print(x, y)x, y = y, x # 这里是优雅的交换变量值print(x, y)print(divmod(20, 1))t = (39, 3)for i in t:print(i)print(divmod(*t)) # * 可以把一个可以迭代的对象拆开作为参数x, y = divmod(*t)print(x, y)_, s = os.path.split("/home") # 这个函数会返回以路径原创 2020-09-11 09:17:06 · 356 阅读 · 0 评论 -
python之迭代与反向迭代
Python迭代的反向迭代for i in reversed(range(1, 10)): print(i)for i in range(1, 10): print(i)迭代反向迭代 reversed原创 2020-08-25 14:21:52 · 171 阅读 · 0 评论 -
Python算法之实现二分法查找(递归方式)
算法之二分法查找前言学习算法?什么是二分法查找?前言在接触算法之前,对算法一直是敬而远之的态度,每每提到什么排序算法,数据结构什么的就很害怕,在进行一番心里搏斗之后,发现其实也就这样,一本好的算法书(算法第四版),让感受到算法的魅力,全书以java语言实现,会编程语言不会编程语言都可以靠这本书学习算法思维和算法的优点,java只是用作简单的算法实现工具,并没有太多的使用到java本身语言的特性,如果你会编程,你只需要一点点的语法知识,便很简单的理解它,没有也不要紧,前书有基础章节可以让你更好的了解jav原创 2020-06-24 14:36:13 · 1082 阅读 · 0 评论