自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(39)
  • 收藏
  • 关注

原创 438 给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。异位词 指由相同字母重排列形成的字符串(包括相同的字符串)

map是固定的,可以按每一类字符来比较,初始化一个计数器valid=0,如果窗口内某类字符完全一致,那么valid加1,最后如果valid==map.size()那么说明我们找到了一个解。更新valid:数据移入窗口时,如果当前字符在给定的map中,我们要的字符种类出现了,如果这类字符的数量和给定map中该类字符的数量也一致,那么说明该类字符我们就搞定了。更新valid:数据移出窗口时,如果该字符在map中,说明是我们要处理的字符,其字符数量和map中一致时,此时要移出窗口,valid要减1。

2022-09-02 21:54:45 170 1

原创 524. 通过删除字母匹配到字典里最长单词(没写出来)

给你一个字符串 s 和一个字符串数组 dictionary ,找出并返回 dictionary 中最长的字符串,该字符串可以通过删除 s 中的某些字符得到。如果答案不止一个,返回长度最长且字母序最小的字符串。如果答案不存在,则返回空字符串。用双指针,代码不知道哪里出错了。...

2022-08-28 10:26:57 145

原创 680. 验证回文串 II

在允许最多删除一个字符的情况下,同样可以使用双指针,通过贪心实现。每次判断两个指针指向的字符是否相同,如果相同,则更新指针,将low 加 1,high 减 1,然后判断更新后的指针范围内的子串是否是回文字符串。如果两个指针指向的字符不同,则两个字符中必须有一个被删除,此时我们就分成两种情况:即删除左指针对应的字符,留下子串 s[low+ 1 :high] ,或者删除右指针对应的字符,留下子串 s[low:high−1]。当这两个子串中至少有一个是回文串时,就说明原始字符串删除一个字符之后就以成为回文串。..

2022-08-28 09:28:01 145

原创 122. 买卖股票的最佳时机 II

随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6 - 3 = 3。解释:在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5 - 1 = 4。在每一天,你可以决定是否购买和/或出售股票。给你一个整数数组 prices ,其中 prices[i] 表示某支股票第 i 天的价格。输入:prices = [7,1,5,3,6,4]总利润为 4 + 3 = 7。...

2022-08-27 10:11:12 73

原创 452.用最少数量的箭引爆气球

增加代码随想录的另一种方法:用气球尾部排序,反向遍历。

2022-08-26 19:52:26 65

原创 605 种花问题

给你一个整数数组 flowerbed 表示花坛,由若干 0 和 1 组成,其中 0 表示没种植花,1 表示种植了花。另有一个数 n ,能否在不打破种植规则的情况下种入 n 朵花?能则返回 true ,不能则返回 false。假设有一个很长的花坛,一部分地块种植了花,另一部分却没有。可是,花不能种植在相邻的地块上,它们会争夺水源,两者都会死去。解法:在数组前后各加一个0。...

2022-08-26 15:36:39 67

原创 135 分发糖果

贪心策略:先考虑一侧的大小关系,从左到右遍历先保证右边评分高的的糖果多(局部最优),再从右到左遍历保证左边评分高的糖果比右边高。n 个孩子站成一排。给你一个整数数组 ratings 表示每个孩子的评分。你可以分别给第一个、第二个、第三个孩子分发 2、1、2 颗糖果。相邻两个孩子评分更高的孩子会获得更多的糖果。每个孩子至少分配到 1 个糖果。...

2022-08-25 21:38:03 71

原创 通过前序和中序构建二叉树

代码】通过前序和中序构建二叉树。

2022-08-03 23:33:06 89

原创 32.最长有效括号长度(双指针优化)

不用栈,用两个变量left、right,从左到右遍历过程中,用left记录‘(’的数量,用right记录‘)’的数量。2.如果left>=right,显然这个时候‘)’都将一定能够得到匹配。所以当前的有效括号长度为2*right,然后更新max。1.如果left...

2022-08-01 17:22:09 122

原创 32.最长有效括号

3.对于遇到的每个“)”,我们弹出栈顶的元素并将当前元素的下标与弹出元素下标做差,得到当前有效括号最长长度。2.对于遇到的每个“(”,我们将它的下标放入栈中。1.先把-1放进栈内。

2022-08-01 16:41:00 51

原创 链表求和

具体而言,如果当前两个链表处相应位置的数字为n1,n2,​,进位值为carry,则它们的和sum为n1+n2+carry;其中,答案链表处相应位置的数字为sum%10,而新的进位值为sum/10.如果两个链表的长度不同,则可以认为长度短的链表的后面有若干个00。此外,如果链表遍历结束后,有carry>0,还需要在答案链表的后面附加一个节点,节点的值为carry。由于输入的两个链表都是反向存放数字的位数的,因此两个链表中同一位置的数字可以直接相加。...

2022-07-31 13:46:01 626

原创 61.旋转链表

如果用for循环,每循环一次执行一次旋转操作回超出时间限制,找k和链表长度n的关系,先让链表闭合为环,可以知道,旋转后的新链表头节点是原链表第n-k%n个节点,则需要找到原链表第n-k%n-1个节点保存新头节点,然后将指针域置为null。...

2022-07-31 10:25:34 94

原创 92.反转链表

给你单链表的头指针head和两个整数left和right,其中left

2022-07-30 11:57:51 178

原创 83和82.删除链表中重复元素

83是八重复元素删的只剩一个82是把所有重复元素删完。

2022-07-30 10:24:34 72

原创 判断回文链表的三种解法

3.快慢指针和反转链表。

2022-07-29 23:32:39 179

原创 25.k个一组翻转链表

代码】25.k个一组翻转链表。

2022-07-29 19:58:27 161

原创 206 反转链表(递归和非递归)

代码】206反转链表(递归和非递归)

2022-07-29 13:34:16 135

原创 958.判断是否为完全二叉树

代码】958.判断是否为完全二叉树。

2022-07-28 12:53:06 1429

原创 找出数组重复元素(二分法 不改变元素位置)

代码】找出数组重复元素(二分法不改变元素位置)

2022-07-20 21:06:53 166

原创 不用哈希表找出数组中重复元素解法1

在一个长度为n的数组nums里的所有数字都在0~n-1的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。

2022-07-20 21:04:12 91

原创 86.分割链表

给你一个链表的头节点head和一个特定值x,请你对链表进行分隔,使得所有小于x的节点都出现在大于或等于x的节点之前。你应当保留两个分区中每个节点的初始相对位置。

2022-07-15 14:12:16 61

原创 239. 滑动窗口最大值

给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。返回滑动窗口中的最大值。解;用单调队列,设计单调队列的时候,pop,和push操作要保持如下规则:...

2022-07-11 11:11:42 57

原创 150.逆波兰表达式求值

示例 1:示例 2:思路:遇到数字则入栈;遇到算符则取出栈顶两个数字进行计算,并将结果压入栈中

2022-07-10 23:19:48 36

原创 20. 有效的括号

给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。有效字符串需满足:示例 1:示例 2:示例 3:示例 4:示例 5:用栈,先把左括号相匹配的右括号压栈,然后比较当前元素和栈顶元素是否相等,若不等返回false;若栈为空,则表示有多余的右括号 返回false;遍历完字符串,发现栈不为空,则表示有多余的左括号 返回false;...

2022-07-08 10:44:07 199

原创 225.用队列模拟栈

使用队列实现栈的下列操作:注意:队列模拟栈,其实一个队列就够了,那么我们先说一说两个队列来实现栈的思路。队列是先进先出的规则,把一个队列中的数据导入另一个队列中,数据的顺序并没有变,并没有变成先进后出的顺序。所以用栈实现队列, 和用队列实现栈的思路还是不一样的,这取决于这两个数据结构的性质。...

2022-07-08 09:40:16 248

原创 用两个栈模拟一个队列

使用栈来模式队列的行为,如果仅仅用一个栈,是一定不行的,所以需要两个栈一个输入栈,一个输出栈,这里要注意输入栈和输出栈的关系。在push数据的时候,只要数据放进输入栈就好,但在pop的时候,操作就复杂一些,输出栈如果为空,就把进栈数据全部导入进来(注意是全部导入),再从出栈弹出数据,如果输出栈不为空,则直接从出栈弹出数据就可以了。最后如何判断队列为空呢?如果进栈和出栈都为空的话,说明模拟的队列为空了。...

2022-07-07 21:19:14 202

原创 151.翻转字符串里的单词

给定一个字符串,逐个翻转字符串中的每个单词。示例 1:输入: "the sky is blue"输出: "blue is sky the"示例 2:输入: " hello world! "输出: "world! hello"解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。示例 3:输入: "a good example"输出: "example good a"解释: 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。解题思路如下:...

2022-07-03 17:02:53 198

原创 剑指Offer 05.替换空格

请实现一个函数,把字符串 s 中的每个空格替换成"%20"。示例 1: 输入:s = "We are happy."输出:"We%20are%20happy."首先扩充数组到每个空格替换成"%20"之后的大小。然后从后向前替换空格,也就是双指针法,过程如下:i指向新长度的末尾,j指向旧长度的末尾。从后向前填充元素,避免了从前先后填充元素要来的 每次添加元素都要将添加元素之后的所有元素向后移动。...

2022-07-03 11:48:23 33

原创 18.四数之和

题意:给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值与 target 相等?找出所有满足条件且不重复的四元组。注意:答案中不可以包含重复的四元组。示例: 给定数组 nums = [1, 0, -1, 0, -2, 2],和 target = 0。 满足要求的四元组集合为: [ [-1, 0, 0, 1], [-2, -1, 1, 2], [-2, 0, 0, 2] 依然类比三数之和,使用双

2022-07-03 09:50:07 48

原创 15.双指针解决三数之和

给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。注意: 答案中不可以包含重复的三元组。示例:给定数组 nums = [-1, 0, 1, 2, -1, -4],满足要求的三元组集合为: [ [-1, 0, 1], [-1, -1, 2] ]首先将数组排序,然后有一层for循环,i从下标0的地方开始,同时定一个下标left 定义在i+1的位置上,定义下标right 在数组结尾的位置上。依然还是

2022-07-02 11:47:01 58

原创 383:赎金信

383:赎金信

2022-07-02 10:01:56 50

原创 454.四数相加

题目描述:给你四个整数数组 nums1、nums2、nums3 和 nums4 ,数组长度都是 n ,请你计算有多少个元组 (i, j, k, l) 能满足: 0 <= i, j, k, l < n nums1[i] + nums2[j] + nums3[k] + nums4[l] == 0本题解题步骤:首先定义 一个unordered_map,key放a和b两数之和,value 放a和b两数之和出现的次数。 遍历大A和大B数组,统计两个数组元素之和,和出现的次数,放到m...

2022-03-20 16:42:25 63

原创 202 快乐数

题目描述:编写一个算法来判断一个数 n 是不是快乐数。「快乐数」 定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。 然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。 如果这个过程 结果为 1,那么这个数就是快乐数。这道题用先写一个各个位平方和的函数,然后再用哈希表unordered_set去判断是否有重复class Solution {public: // 取数值各个位上的单数之和 int getSum(in...

2022-03-19 16:06:34 48

原创 876.链表的中间节点

leetcode中的head节点指的是第一个节点。题目描述:给定一个头结点为 head 的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点了。我想到的第一个解法:先遍历一遍链表,找到链表长度size,然后用链表长度/2得到中间节点的索引mid(链表长度为奇数或偶数都成立),然后遍历到mid节点返回。class Solution {public: ListNode* middleNode(ListNode* head) { ListNod

2022-03-17 13:45:27 1055

原创 242.有效的字母异位词

题目描述:给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。解法:用哈希表,把s中字母出现的次数记录在一个数组中,由于总共有26个英文字母,所有数组长度设置为26,具体实现是把原字母映射成数组的下标,用每个字母-a,得到在数组中的下标。对也是类似操作,只不过要将次数做一个减法。看最后得到的数组是否全为零,全为零则返回true.bool isAnagram(string s, str

2022-03-15 21:09:22 41

原创 移除零元素

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。请注意 ,必须在不复制数组的情况下原地对数组进行操作。解法一:双指针,用一个右指针指向非零元素(遇到零跳过),左指针指向零元素,左右指针之间是零,交换左右指针所指的值。class Solution {public: void moveZeroes(vector<int>& nums) { int n = nums.size(), left = 0, righ

2022-03-15 16:48:29 70

原创 【链表相交】

返回第一个相交节点的指针,一般做法是用两个指针同时去遍历,但有个问题是两个链表在相交节点之前的节点数目不一致,这样两个指针就不能站在同一起跑线上遍历链表。所有得先求出两个链表的长度,让指向节点数目多的链表的指针先遍历,然后两个指针同时遍历,如果两个指针相同则返回这个指针。class Solution {public: ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) { int lenA=0;

2022-03-14 11:12:54 1472

原创 【双指针】删除链表的倒数第N个节点

之前用遍历两次链表的本方法,这次借鉴网上的经典双指针方法。算法主体思想是:用两个指针一个快指针,一个慢指针,快指针先在前面跑步一段(为了让快慢指针间隔n步),然后快慢指针一起跑,直到快指针指向null结束。但是如果是这样的话,slow指针指向的是要删除的指针(删除某一个节点要指向它之前的节点)所以得让fast指针多走一步。代码如下:class Solution {public: ListNode* removeNthFromEnd(ListNode* head, int n) {

2022-03-13 11:14:29 457

原创 【无标题】删除链表倒数第n个节点

本题我用了应该是比较笨的做法,主体思想是:先遍历一遍链表找到链表总节点数,然后在遍历到倒数第N个节点之前的节点,然后执行删除操作。class Solution {public: ListNode* removeNthFromEnd(ListNode* head, int n) { ListNode*VirHead=new ListNode(0);//定义一个虚拟头节点,便于后面删除实际头节点 VirHead->next=head; Lis

2022-03-13 10:08:21 784

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除