leetcode
文章平均质量分 72
Booksort
纯粹小白,博客只为加深自己理解
展开
-
Leetcode-不同路径I和II(计数型动态规划)
机器人到达(m,n)位置,只能通过(m-1,n)+1和(m,n-1)+1到达,且机器人到达(m-1,n)/(m,n-1)也算通过其点的两个点达到…,以此类推假设m=1,n=1,那么从(0,0)到达(1,1)只有两种方法,到(1,0),(0,1),就是1+1。原创 2022-10-03 18:11:47 · 637 阅读 · 0 评论 -
Leetcode-跳跃游戏I和II(动态规划)
当可以跳跃到最后一个位置n-1时,考虑是从位置i跳跃到n-1的位置。i原创 2022-10-03 17:23:51 · 1108 阅读 · 0 评论 -
Leetcode.322-零钱兑换(最大/小型动态规划)
动态规划适用于:最大/小值,可不可行,计数问题这类集中场景本题,求解是否可以由指定面值的硬币完成兑换且统计最少需要的硬币的数量,可以使用动态规划来求解。动态规划。原创 2022-09-30 19:03:51 · 1589 阅读 · 0 评论 -
LeetCode.154 - 寻找旋转排序数组中的最小值 II(二分思想)
154. 寻找旋转排序数组中的最小值 II方法一:暴力解法这个十分暴力,就是依次去遍历,然后元素之间比较大小。时间复杂度O(N),代码简单。方法二:二分思想利用二分的思想可以加速查找,因为二分每次判断都会丢弃一般的数据量。虽然这个数组不是有序的,但是部分有序的。可以由于题目的特性可能会出现,[0,n/2+a]区间都是升序的(a∈[−n/2,n/2])。理解一下就是左半边区间是可能是有序的,也可能是右半区间是有序的。所以,我们可以考虑使用mid=(left+right)>>1来判断原创 2022-01-17 09:00:00 · 159 阅读 · 0 评论 -
Leetcode.32-最长有效括号(两方法)_
题目链接要统计最长的有效括号。一般这种题目就要求最长,最优的可以考虑用动态规划来做。基本可以保证时间复杂度在O(n)。因为DP可以利用前面的状态方程的结果,而不会造成重复运算。DP最关键的是找出问题与状态转移方程。对于本题而言,要求最长的的有效括号()...原创 2021-10-21 19:40:04 · 1712 阅读 · 4 评论 -
Leetcode-102.二叉树层序遍历
题目链接写这博客,主要是想回顾一下二叉树的层序遍历。我们都知道,二叉树有 前序遍历、中序遍历、后序遍历,这些遍历方式用递归的方法改变访问节点的顺序就能得到这些遍历方式。而层序遍历,是每一层去遍历这些节点,一层一层的遍历,这一层遍历完了,才回去遍历下一层节点。而层序遍历是要借助queue队列,这个数据结构。介绍一下方法。从二叉树的第一个节点开始,把这个节点放入队列中。当走到尽头时,这一行没有节点了。就把这个节点出队,然后还要把该节点的两个左右子节点入队,先左节点,再右节点如果是空,就不入队原创 2021-10-03 18:29:23 · 137 阅读 · 1 评论 -
Leetcode-739.每日温度(双思路分析)
方法一:单调栈看代码分析思想提问:为什么用while循环不用if判断方法二:KMP的思想分析思想图解算法看代码题目链接方法一:单调栈作为一道要依序比较元素之间大小、求差,最先想到的就是利用栈。栈真的是一个很好用的数据结构,利用其后进先出的模式,用起来相当爽。以前做过匹配括号,可以说和这道题类似,只要符合条件,就入栈、弹栈。这到题,找比这个数大的一个数,两下标一减,就能得到要等几天才会有较高温度,就意味着,每个元素都要入栈,只有符合条件的后(比这个栈顶元素大),就能进行弹栈,并进行下一次的入栈.原创 2021-09-28 23:22:06 · 376 阅读 · 2 评论 -
Leetcode-946.验证栈序列
题目链接题目要求就是,以某种顺序将元素压栈,,然后有一种出栈的顺序,判断这种出栈顺序是否符合这个栈。所以,我们要使用一个栈stack类。来入栈验证,进行一种模拟。依次遍历要入栈的元素,同时,用另一个下标去遍历弹栈顺序的数组。但是要拿栈的栈顶元素去与弹栈顺序的数组去匹配,如果匹配了,就代表这个弹栈顺序是可以的。如果不允许(不匹配),就继续入栈,而弹栈顺序的数组就下标不动。直到找到元素匹配的。同时,还要满足,弹栈匹配的前提是,栈不为空。否则就会越界。看代码class Solution {publi原创 2021-09-11 13:34:14 · 310 阅读 · 10 评论 -
Leetcode-53.最大子序列和
分析问题代码题目链接最近在学DP(动态规划),用动态规划的思路来解析这道题。动态规划作为一种设计方法后者说算法思想,可以考察这个问题的所有解,并最终得到最优解。DP实现步骤定义状态状态转移(状态之间的递推关系)算法实现对于使用DP算法的问题,需要寻找问题的关键,要将问题给抽象出来,并寻找最相似的子问题。DP算法解决问题有三大特点把原有问题分解成几个相似的子问题所有的子问题只需要解决一次储存需要的子问题的解(用已得到最优的解)使用场景:最大/小值、其条件是否可行、方案的个数.原创 2021-09-04 20:46:16 · 235 阅读 · 1 评论 -
Leetcode-255.用队列实现栈
题目描述方法一:双队列实现栈方法二:一个队列实现栈题目描述题目链接题目要求用队列这个数据结构来实现栈这个数据结构,是指用队列来实现栈的特性后进先出。因为队列的特性是先进先出,所以我们要对队列的成员函数进行一些处理封装。方法一:双队列实现栈使用一个队列进行数据入队,出队的中转,以达到后进先出的效果。不知道为什么好糊?通过另一个队列的中转来使另一个队列能够变成栈,同时还要交换队列。先将一个元素push进一个空队列,在把另一个队列里的,所有元素push进这个队列,根据递推的关系,可以让这些.原创 2021-09-03 18:08:42 · 167 阅读 · 2 评论 -
Leetcode-110.平衡二叉树(三方法趣解)
对于判断二叉树是否平衡,需要计算每个节点左右子树的高度,再求差。所以,关键是要找到每一个根节点,并且计算其子树的高度差。方法1所以就需要一个函数去计算其每个子树的高度。参考二叉树的最大深度对于第一个节点而言其需要得到左子树与右子树的高度,之后再进行比较判断则我们就需要提供两个去向(或者说计算高度的函数分别要计算根节点的左右子树的高度)。同时,递归到下一个根节点,也同样要进行计算其两个子树的高度,并且递归到下一个节点,直到遇到NULL。当然,如果一个根节点的两个子树都是NULL,那这个.原创 2021-05-09 14:26:45 · 842 阅读 · 12 评论 -
Leetcode-100.相同的树
根据题目描述,得判断两个树是否完全一样。就如上的例子而言是一个完全一样的二叉树没错。而看起来是对称的,但并不意味着这是一个完全相同的二叉树。对于左边的树而言是[1,2]而右边的树却是[1,NULL,2]是不一样的。依旧可以利用二叉树的特性:根节点,左子树,右子树。而每个子树又可再次分为根节点与左右子树。就利用这个性质。两个二叉树要相同的前提是,两个树的左右子树要依次相同,并且根节点也要相同(虽然会被不断子树化),但利用不断划分子树的性质去不断比较子树的根节点是否相同。则这道.原创 2021-05-08 00:31:31 · 147 阅读 · 1 评论 -
Leetcode-104.二叉树的最大深度
对于二叉树的深度思考。要找二叉树中,最深的那个叶子节点,可不是各个节点遍历可以得到的。这需要利用二叉树的性质。每一个二叉树都有三部分组成:根节点,左子树,右子树。而二叉树的深度就是左右子树的最大深度加1,也就是加那个根节点。而每个子树又可以看成/分解成一个新的二叉树,同时还有三部分:根节点,左子树,右子树。而其新二叉树的深度又是其左右子树的最大深度+1.就这样无限套娃。当某一个新二叉树的左右子树都是NULL时,则已知,其深度未1.因为其子树的最大深度为0。就这样,不断利用其左右子树的最大深度+1.原创 2021-05-07 00:54:41 · 401 阅读 · 8 评论 -
Leetcode-965.单值二叉树
题目如下节点遍历作为二叉树,我们可以采用递归的方法去遍历每一个节点。我首先想到的是,使用一个函数去递归每个节点,再各个相互比较,使用一个flag去判断是否属于单值二叉树。static int flag=1;void order(struct TreeNode* root){ if(root==NULL) return ; if(root->left==NULL&&root->right==NULL) return ;原创 2021-05-07 00:13:38 · 129 阅读 · 3 评论 -
Leetcode-141.环形链表(龟兔赛跑算法)
这种可能带环的链表是比较麻烦的,要判断链表中是否有环。我看过设置一个标记来断开一个环的算法(虽然我觉得没什么意义),两者是完全不一样的。这道题以我目前的水平不会使用一些高级的数据结构,只能通过一个算法来解答–弗洛伊德循环查找算法(龟兔赛跑算法)。接下来,我会通过一些数学推理来验证该算法。该算法的实现底层是快慢指针。而对于快慢指针而言,通常我们会设计快指针一次走两个结点,而慢指针一次走一个结点,这样保险一点且不会错过结点。至于为什么,我会在下面的验证过程中得出。为什么会认为快慢指针就能得出链表中是否.原创 2021-04-14 19:16:26 · 284 阅读 · 0 评论 -
Leetcode-876.链表的中间结点-剑指22.到数第K个结点(快慢指针)
这种链表的题,找第几个结点,有个很骚的解法,就是用计数器找到那个结点,但是感觉完全避开了他想考察的算法。这种题应该使用要能熟练使用快慢指针这种算法。原创 2021-04-09 17:49:57 · 1423 阅读 · 13 评论 -
Leetcode-206.反转链表(迭代与递归详解)
关于这道题,总的来说有两类方法:迭代和递归。先来介绍迭代,递归的思路要在迭代上延申。常见的三指针法思路用一个cur指针来定位目前遍历的结点的位置。一个pre指针来记录上一个结点的位置,为了可以对目前结点的指向进行反转。用一个指针last来保存下一个结点的位置,可以保证目前结点的指针转向后,可以继续遍历。这样一次遍历就足够完成反转,且只创建了三个指针空间。时间复杂度O(n),空间复杂度O(1)。struct ListNode* reverseList(struct ListNode* he.原创 2021-04-08 00:52:18 · 2464 阅读 · 9 评论 -
leetcode-203.移除链表元素
我首先想到的就是哨兵法。也就是建一个新的头结点(其数据域无任何意义)。struct ListNode* removeElements(struct ListNode* head, int val){ struct ListNode* p = (struct ListNode*)malloc(sizeof(struct ListNode));//开辟一个空间设置一个结点 struct ListNode* s; p->next = head; s = p; if (head == NU.原创 2021-04-04 23:09:39 · 296 阅读 · 1 评论 -
leetcode-移动0(283),删除重复项(26),加一(66)
283,移动0我先前是打算前后两个指针分别遍历如果找到0,就交换,但是效率太低,要多吃判断。改进方法,创建一个虚拟的数组,同时一次遍历,只需得到非0的元素放入虚拟数组中,再其他都是0,即可void moveZeroes(int* nums, int numsSize) { if (numsSize < 1) return; int front = 0; for (int i = 0; i < numsSize; i++) { if (nums[i] != 0) {原创 2021-03-22 20:32:06 · 134 阅读 · 1 评论 -
leetcode-两数相加(#2)
先来看题目我写这道题的时候刚刚接触链表,我原先是想,链表元素提出来再相加,再放回链表。结果不断显示超出时间限制,被一个超出 long long 范围的数教做人。后来更新了方法。struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){ int num; struct ListNode* head=NULL,*p,*end; head=(struct ListNode*)malloc(sizeof(s原创 2021-03-17 19:43:05 · 121 阅读 · 0 评论 -
leetcode-两数之和
这就是题目。由于Leetcode是接口OJ,所以只写实现函数。先出代码,再分析这是一种方法。int* twoSum(int* num, int len,int target,int* retsize){ for (int i = 0; i < len-1; i++) { for (int j = i + 1; j < len; j++) { if (target==(num[i]+num[j])) { int* ret = (int*)malloc(s.原创 2021-03-12 17:30:42 · 166 阅读 · 0 评论