
算法与数据结构
文章平均质量分 65
杜小瑞
冲冲冲!!!
展开
-
排序算法总结
代码中的less是比较两个数的大小,swap是对两个数进行交换。冒泡排序冒泡排序是最简单的排序算法,冒泡排序从前往后依次比较相邻两个元素的大小,前面一个比后面一个大就进行交换,这样一轮下来,最后一个元素就是最大值。然后对前面n-1个数重复这个过程,最后完成排序。public class BubbleSort implements IArraySort { @Override public int[] sort(int[] sourceArray) throws Exception {原创 2021-08-03 20:13:59 · 90 阅读 · 0 评论 -
LeetCode刷题|两个链表的第一个公共节点
题目描述题目地址:两个链表的第一个公共节点解法一:暴力枚举一个朴素的想法是直接对每一个节点进行枚举,这样做的时间复杂度是O(M*N)。public class Solution { public ListNode getIntersectionNode(ListNode headA, ListNode headB) { for(ListNode pa = headA; pa!=null; pa = pa.next) { for(ListNode pb原创 2021-07-21 21:29:15 · 168 阅读 · 0 评论 -
LeetCode刷题|38外观数组
做了半天的一道题一看竟然是一道简单题。。题目描述地址:外观数组题目意思很好理解,就是一个递归的过程,从‘1’开始,对每一个输入字符串做一个几个几这样格式的描述,然后再把这个描述作为下一次的输入,直到求出第n项的结果。解法一这题是一个比较明显的递归题目,但是由于我递归学的不好,所以就考虑如何不使用递归直接做出来。那么简单说一下我的想法。我的做法就是先写一个将输入字符串进行划分并描述的函数,然后反复调用这个函数就可以了。所以这种方法的重点在于如何写字符串划分并描述的函数。class Solutio原创 2021-05-16 14:24:59 · 148 阅读 · 0 评论 -
LeetCode刷题|13罗马数字转整数
三个月前做的一道题,变成了今天的每日一题了,看样子不记录一下果然还是很快就会忘。题目描述地址:罗马数字转整数解法一虽然题目给了罗马数字转整数的六种特殊情况,但是实际上,本题的核心在于,将罗马数组转为整数的过程中,需要观察前后两个数的大小关系,如果前面一个数比后面的数小,那么久需要减去这个前面这个数,反之,就是要加上这个数。逻辑很简单,那么我们再把每一个字母代表的数字对应起来,然后遍历一遍给出的字符串就可以了。class Solution: def romanToInt(self, s:原创 2021-05-15 16:07:36 · 768 阅读 · 0 评论 -
LeetCode刷题|897递增顺序搜索树
终于结束了几天的动态规划,迎来了今天这一道简单题。但是仔细一看,这一道跟树相关的简单题好像也没有那么简单,至少对于我来说是这样的。刷了这么久的题,对树的题目做的还是比较少的,正好乘今天好好学一下。题目描述题目地址:递增顺序搜索树解法一解法一的思想比较简单直接,就是直接中序遍历然后把所有元素存储到一个数组中,然后在从数组中拿出元素重新构建一颗树。# Definition for a binary tree node.# class TreeNode:# def __init__(sel原创 2021-04-25 13:29:40 · 123 阅读 · 0 评论 -
LeetCode刷题|368最大整除子集(动态规划)
今天的每日一题还是一个动态规划题目。题目描述题目地址:最大整除子集动态规划如果考虑暴力法的话这道题应该怎么做呢,最简单的能想到的方法就是枚举每一个元素作为开头,然后遍历其他元素。但是这种方法并不可靠,可以举个例子看一下:[9,18,54,90,108,180,360,540,720][9,18,54,90,108,180,360,540,720][9,18,54,90,108,180,360,540,720]这样一个数组,从9开始的话会得到[9,18,54,108,540][9,18,54,10原创 2021-04-23 20:46:29 · 212 阅读 · 1 评论 -
LeetCode刷题|打家劫舍-动态规划入门
今天记录的题目是一道动态规划算法,刷题也有一段时间了,但是每次遇到动态规划算法还是唯恐避之不及,看到使用动态规划就害怕,但是学习不能老是逃避,终究还是要学的,今天的题目正好很适合作为动态规划初学者的练手题目,题目并不难,因此,学习动态规划,就从今天这道打家劫舍题目开始吧。题目描述题目地址:打家劫舍动态规划在看今天这题的解法之前,我们先来看一下什么是动态规划。先来看一下《算法导论》中是如何描述动态规划的:从以上的描述中我们提取出几个重点,一是动态规划与分治的思想相似,都是把问题分解为子问题解决。原创 2021-04-15 11:32:43 · 280 阅读 · 0 评论 -
LeetCode刷题|54螺旋矩阵
今天的每日一题是一道关于遍历矩阵的题目。先看一下题目长啥样。LeetCode地址:螺旋矩阵解法一第一种方法很自然的就可以想到,每次遍历到行末或者列末就转向,但是如何设计使得到达末尾就转向比较麻烦。我们可以使用一个转向数组,里面存放-1,0,1三种数,-1表示减一,0表示不动,1表示加一,前进一步。那么一个数组[0,1],第一位是行,第二位是列的话,就可以用这个数组表示行不动,列每一次加一,也就是往右前进。以此类推[1,0]就表示往下前进,[-1,0]表示往左前进,[0,-1]表示往上前进。这样我们每原创 2021-03-15 15:31:04 · 137 阅读 · 1 评论 -
LeetCode刷题|331验证二叉树的前序序列化
今天的每日一题是一道与二叉树相关的题目。刷了20多天的题目之后这还是我第一次做到二叉树的题目,因此对于这类题目我还不是很熟悉,所以直接看了答案。还是先看一下今天的题目。地址:验证二叉树的前序序列化解法一解法一是使用一个计数器。将计数器理解为存放数据的槽位,当节点非空时,就占用一个槽位,但是非空节点又会连接两个子节点,因此在增加两个槽位。所以当节点非空时直接增加一个槽位。当节点为#,即为空时,直接减少一个槽位。统计过程中如果出现槽位为空或者小于0的情况说明不是前序序列化二叉树。遍历结束后如果槽位不为原创 2021-03-12 11:52:31 · 164 阅读 · 0 评论 -
LeetCode刷题|224基本计算器一&227基本计算器二
这次记录的两题是这两天做的每日一题的题目,正好这两题是同一个系列的,所以放到一起记下来。先看一下第一题的题目描述。地址:基本计算器一题目很好理解,就是让我们实现计算字符串形式的数学表达式。主要需要关注提示中的内容,提示告诉我们s中只包含加减运算,另外还需要考虑括号对计算顺序的影响,没有涉及到乘除法运算。那么我们看到这个题目,首先想到的肯定应该是使用栈来解决。那么看一下如何用栈来解答这道题吧。解法一既然题目说了只有加减法,那么我们就只考虑加减法,我们可以设置一个标记,用来表示加减法,标记的值为+1原创 2021-03-11 17:34:17 · 188 阅读 · 0 评论 -
LeetCode刷题|36有效的数独
这道题是官方编辑的初级算法中数组部分的一个题目,是一道中等难度的题。首先还是先看一下题目描述吧。题目地址:有效的数独数独大家都很熟悉,简单来讲这个题目就是要让我们写一个程序判断这个数独是不是合法的。但是题目并不要求我们判断数独是不是可解的,而且数独是一个9宫格。解答方法拿到这题第一反应还是暴力法,直接遍历三次,一次判断每行是否合法,一次判断每列是否合法,一次判断每个33的格子是否合法。但是实际上,这三个判断并不需要遍历数组三次,只需要一次就够了。另外,遍历每一个33的格子这个有点难度,反正我做的时原创 2021-03-09 18:14:34 · 267 阅读 · 0 评论 -
LeetCode刷题|1047删除字符串中的所有相邻重复项
连续两天没有更新了,主要原因是前面两天的每日一题有点难,我一直都还没搞明白,所以就没有记录下来。今天的每日一题是一个简单题,虽然我还是搞了很久才搞出结果来。先看一下题目吧。使用栈的方法这题一开始我是打算直接从前往后遍历,删除前后两个元素一样的数,但是根据题目要求,需要反复遍历,所以如果只遍历一遍的肯定是不行的。但是由于不知道字符串里面存在多少个相邻重复,所以这个方法不可取。可以使用的方法就是使用栈来操作了,之前做过一个括号匹配的题目,跟这个题目的想法思路都是一样的。当栈空时,我们把当前元素压入栈中,原创 2021-03-09 17:55:20 · 251 阅读 · 0 评论 -
LeetCode刷题|283移动零&66加一
这篇文章记录两道LeetCode官方编辑的初级算法中的数组部分的题目。首先看第一道题。移动零LeetCode地址:移动零本题要将数组中所有的零移动到数组最后,第一想法当然是冒泡,将每一个零一步一步移动到最后。冒泡class Solution: def moveZeroes(self, nums: List[int]) -> None: """ Do not return anything, modify nums in-place instead.原创 2021-03-06 17:25:38 · 160 阅读 · 0 评论 -
LeetCode刷题|503下一个更大元素 二
还是今天的每日一题,今天的是一个中等难度的题目。先看一下题目描述吧。题目描述简单解释一下就是寻找数组中每一个元素的下一个比它大的元素,这个数组是一个循环数组。暴力解法(已失败)看到这个题目,果然我只想得到暴力解法。所谓的暴力解法,就是遍历数组中每一个元素,然后再从当前元素开始再遍历数组,直到找到比当前元素大的下一个元素,然后开始下一轮遍历。这个方法的时间复杂度很显然的O(n**2)。class Solution: def nextGreaterElements(self, nums: L原创 2021-03-06 12:25:58 · 305 阅读 · 0 评论 -
LeetCode刷题|232用栈实现队列
今天的每日一题是用栈实现队列,是一个简单题。先来看一下题目描述吧。题目描述LeetCode地址:用栈实现队列双栈方法最开始看到这个题我想到的是用一个栈来模拟队列,但是python里面没有栈这个数据结构,只能用列表来模拟栈。但是实现完之后提交虽然通过了,我回来再仔细一看感觉有些不对,题目要求只能用栈的操作,但是我好像还用到了insert函数,我是直接把一个列表当做一个栈来使用了,这样虽然能通过测试,但是是不符合题目要求的。于是看了一下官方题解,原来可以使用两个栈来模拟队列。一个栈作为输入,一个栈作为原创 2021-03-05 12:06:45 · 188 阅读 · 0 评论 -
LeetCode刷题|350两个数组的交集
本题来自于官方编辑的初级算法中数组分类下的一个题目。先看一下题目描述。题目描述LeetCode地址:两个数组的交集最开始看到这个题目时,我的想法很简单,既然求交集,那就是元素在两个数组中都出现过,那么我直接遍历一个数组,看这个数组中的元素是不是在另一个数组中也出现过,不就找到交集了吗。于是我试了一下这个方法,但是提交的时候出错了。原因在于没有看清题目的一个要求,输出结果中每个元素出现的次数,应与元素在两个数组中出现次数的最小值一致。当我们输入为[2,1,2,1,2]和[2,2,1]时,输出值为[2原创 2021-03-04 15:57:37 · 168 阅读 · 1 评论 -
LeetCode刷题|136只出现一次的数字
这道题来自于LeetCode官方编辑的初级算法里面数组这一类别的题目,这道题目很简单,本来不打算记录的,但是这道题的解法我感觉还是挺有意思的,于是还是打算稍微记录一下,加深印象,以便日后遇到这样的题目可以想到类似方法。在看这道题之前,先看一下另一道类似的题目:存在重复元素这道题要求我们判断数组中是否存在重复元素,存在返回True,不存在返回False。最直接的想法就是直接把数组排序,然后扫描数组,对比前后两个元素是否一致。如果遍历结束都没有两个一样的数,那说明数组不存在重复元素。另外有一种简单的方法就原创 2021-03-03 20:06:53 · 167 阅读 · 1 评论 -
LeetCode刷题|338比特位计数
今天的每日一题是一道与二进制有关的题目,也是我第一次做这样的题目。还是先看一下题目描述吧。题目描述LeetCode地址:比特位计数我的解法暴力解法第一人又开始表演了。这个题要求我们返回0-num之间所有数字的二进制表示的1的数量,返回值是一个数组。那么最直接的想法就是,遍历每一个数字,将数字转化为二进制,再遍历每一个二进制位的每一个元素,计算有多少个1,然后加入到一个数组中。最后返回整个数组。class Solution: def countBits(self, num: int) -&原创 2021-03-03 17:34:36 · 173 阅读 · 1 评论 -
LeetCode刷题|304二维区域和检索-矩阵不可变
这篇的题目还是来自每日一题的打卡题目,今天的题目是在昨天一维数组的基础上变成了二维的矩阵,求矩阵一个区域内的元素和。先看一下题目吧。题目描述LeetCode地址:二维区域和检索-矩阵不可变我的解法作为暴力解法爱好者,看到这个题目第一反应当然是直接把元素加起来就行了啊。那么要怎么加起来呢,写两个嵌套循环,分别对行和列进行遍历,然后把遍历到的元素直接相加。最高端的食材仅仅需要最简单的烹饪,啊不,最厉害的解法仅仅需要最简洁的步骤。明确了思路后,直接上手实现吧,这个代码也比较简单。一顿操作之后,得到了原创 2021-03-02 20:38:32 · 183 阅读 · 0 评论 -
LeetCode刷题|189旋转数组
这题是LeetCode编辑的初级算法中的一题,先来看一下题目描述吧。题目描述LeetCode地址:旋转数组这个题目可以说是相当熟悉了,题目意思也很好理解,当时考研的时候教材里面就有这个题目,但是隔了这么久再次看到时,竟然还是想不起来咋做。于是我又开始了我最擅长的暴力解题法。首先介绍一下我自己的菜鸡解法。我的解法我看到这个题第一个想法就是再创建一个数组,然后把每个元素的index往后挪三位放到新建的数组中。数组下标加k后如果超过数组长度就减一个数组长度。因为题目要求原地解决,不能有返回值,因此最后原创 2021-03-02 15:43:54 · 140 阅读 · 0 评论 -
leetcode刷题|303区域和检索 - 数组不可变
打卡第二天,还是LeetCode每日一题的题目。题目描述LeetCode地址:区域和检索-数组不可变这个题目,我在没有看答案之前反复看了多遍题目和测试用例,楞是没有看懂。最后迫不得已直接看了答案才有点明白了。本题的核心其实就是在于求出给定i到j范围内所有数字的和,但是由于需要多次调用sumRange函数求和,如果每次都吧数组初始化一次,那么就会很耗费时间。因此我们需要考虑在创建对象的时候先初始化一个sum数组,这个sum数组保存了前n个数组元素的和。有了这个sum数组之后,我们求i到j的元素和的时原创 2021-03-01 18:19:29 · 250 阅读 · 1 评论 -
LeetCode刷题|896单调数列
前言从今天开始,我打算在这里记录下每一次的刷题。边做边学边总结,到目前为止我都还是只能解决简单难度的题目,希望我能坚持下来,能看到我的提高。题目LeetCode每日一题:单调数列我的解法拿到题目,我的第一反应是先用前两个数判断整个数列可能的升降趋势。但是仔细一想这种方法是行不通的,因为前面两个数可能是相等的,而且可能还会出现前面n个数都是相等的,所以这种想法pass掉。于是我就想到,既然前两个数判断不了整个数列可能的趋势,那么第一个数和最后一个数用来比较不就可以判断整个数列的趋势了吗。因此,将原创 2021-02-28 14:56:56 · 191 阅读 · 3 评论