
leetcode题目
本专栏以本人刷leetcode时写下的通过代码为基础(可能有些代码还需要多多优化),旨在记录当时的刷题思路,同时也给想要查看部分题目的人介绍一下该题目。题目的详细介绍可以在leetcode官网上直接搜索题号即可。
rasotae
普通码农
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
剑指 Offer 58 - II. 左旋转字符串
题目链接:https://leetcode-cn.com/problems/zuo-xuan-zhuan-zi-fu-chuan-lcof/思路:创建一个新字符串,先加n~s.size()-1部分,再加0~n-1部分即可。class Solution {public: string reverseLeftWords(string s, int n) { string temp = ""; for(int i = 0;i<n;i++)原创 2021-03-05 20:59:56 · 105 阅读 · 0 评论 -
151. 翻转字符串里的单词
题目链接:https://leetcode-cn.com/problems/reverse-words-in-a-string/思路:使用一个数组保存每一段字符串,最后合并即可。用空间换取时间。class Solution {public: string reverseWords(string s) { vector<string> list; string temp = ""; for(int i = 0;i<s.si原创 2021-03-05 20:58:50 · 99 阅读 · 0 评论 -
剑指 Offer 05. 替换空格
题目链接:https://leetcode-cn.com/problems/ti-huan-kong-ge-lcof/思路:创建一个新的字符串,遍历原来字符串,到空格替换为%20即可。class Solution {public: string replaceSpace(string s) { string new_s = ""; for(int i = 0;i<s.size();i++) { if(s[i原创 2021-03-05 20:57:28 · 92 阅读 · 0 评论 -
541. 反转字符串 II
题目链接:https://leetcode-cn.com/problems/reverse-string-ii/思路:根据题意,每2k长度的字符串,交换前k个字符,则可以按照2k为单位来划分字符串。用count记是当前的第几段,每段交换前k个字符,然后拼接后续k个字符。当最后不足2k,则看是否小于k。若小于则全部反转,否则反转前k个即可。class Solution {public: string reverseStr(string s, int k) { int t原创 2021-03-05 20:56:29 · 112 阅读 · 0 评论 -
344. 反转字符串
题目链接:https://leetcode-cn.com/problems/reverse-string/思路:反转字符串,则交换两边字符的位置,直到中间位置重合即可。class Solution {public: void reverseString(vector<char>& s) { char temp; for(int i = 0,j = s.size()-1;j-i>=1;i++,j--) {原创 2021-03-05 20:55:17 · 95 阅读 · 0 评论 -
383. 赎金信
题目链接:https://leetcode-cn.com/problems/ransom-note/思路:利用unorder_map结构,键存放字母,值为字母出现的顺序。遍历magazine和ransomNote,当map的值小于0,说明不可构造。class Solution {public: bool canConstruct(string ransomNote, string magazine) { unordered_map<char,int> ma原创 2021-03-05 20:52:42 · 95 阅读 · 0 评论 -
454. 四数相加 II
题目链接:https://leetcode-cn.com/problems/4sum-ii/思路:将4组数字分成两组分别进行计算。首先用一个map存储A[i]+B[j]的结果,其中A[i]+B[j]作为键。A[i]+B[j]的值出现的次数作为值。这样是为了统计同样值出现的次数。然后另0-(C[i]+D[j]),如果在map中,map对应的值即为这一组4个数求和为0出现的次数。然后累加上所有满足条件的组数即可。class Solution {public: int fourSumCou原创 2021-02-25 22:24:53 · 168 阅读 · 0 评论 -
1. 两数之和
题目链接:https://leetcode-cn.com/problems/two-sum/思路:使用map结构。target-nums[i] 算出另外一个值,如果在map中,则返回下标即可。否则将这个数加入map,重复操作。class Solution {public: vector<int> twoSum(vector<int>& nums, int target) { unordered_map <int,int> m原创 2021-02-25 21:41:08 · 90 阅读 · 0 评论 -
202. 快乐数
题目链接:https://leetcode-cn.com/problems/happy-number/思路:检查计算sum是否已经出现过一次,出现则说明进入了无限循环,不是快乐数,否则不停计算即可。使用unordered_set数据结构很方便查找插入。class Solution {public: int getSum(int n){ int sum = 0; while(n) { sum = sum + (n%原创 2021-02-25 21:39:39 · 93 阅读 · 0 评论 -
349. 两个数组的交集
题目链接:https://leetcode-cn.com/problems/intersection-of-two-arrays/思路:使用set集合,set中元素最多出现一次,遍历完数组之后进行vector赋值即可。class Solution {public: vector<int> intersection(vector<int>& nums1, vector<int>& nums2) { vector<原创 2021-02-25 21:38:18 · 104 阅读 · 0 评论 -
242. 有效的字母异位词
题目链接:https://leetcode-cn.com/problems/valid-anagram/思路:对字符串排序后依次比较即可。class Solution {public: bool isAnagram(string s, string t) { if(s.length() != t.length()) return false; sort(s.begin(),s.end()); s原创 2021-02-25 21:36:59 · 113 阅读 · 0 评论 -
142. 环形链表 II
题目链接:https://leetcode-cn.com/problems/linked-list-cycle-ii/思路:提供一个效率稍差但好想的解法。具体如下:首先利用双指针判断有没有环。假如有环的话就遍历链表,同时将遍历过的节点存储进向量中,当下次遍历的节点在向量中时,说明是入环节点。/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next;原创 2021-02-25 21:35:25 · 93 阅读 · 0 评论 -
206. 反转链表
思路:这里考虑用双指针。两个指针一个代表将要交换到前面的节点(node2),一个代表当前交换完后的尾部节点(node1)。每次先将链表尾部接上,即node1->next = node2->next,然后将node2插入到head的前面,最后更新head指向的位置即可。/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * Li原创 2021-02-20 21:51:46 · 247 阅读 · 0 评论 -
707. 设计链表
思路:链表的几种基本操作,这里采用设置虚拟头节点的方法来简化操作。list->val头节点的数据存放链表长度,本题需要注意的是节点序号索引从0开始,因此 list->val-1 是索引的范围。class MyLinkedList {public: typedef struct ListNode{ int val; struct ListNode *next; ListNode() : val(0),next(NULL){}原创 2021-02-20 21:49:48 · 114 阅读 · 0 评论 -
203. 移除链表元素
思路:增设一个虚拟头节点virtualHead,然后双指针同时遍历,当后一个节点的值等于val时,前一个指针的下一个节点指向后一个节点的下一个节点,然后重新赋值查找节点即可。/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(i原创 2021-02-20 21:47:08 · 94 阅读 · 0 评论 -
142. 环形链表 II
思路:暴力解法。首先利用双指针判断有没有环。假如有环的话就遍历链表,同时将遍历过的节点存储进向量中,当下次遍历的节点在向量中时,说明是入环节点。/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {pub原创 2021-02-20 21:44:56 · 95 阅读 · 0 评论 -
59. 螺旋矩阵 II
题目给你一个正整数n,生成一个包含1到n2所有元素,且元素按顺时针顺序螺旋排列的n x n正方形矩阵matrix。思路:本题主要难点在于正常填充元素时,边界条件的判断。这里采用模拟填充顺序的方法,设置x,y变量代表将要填充的坐标,direction表示此时的填充方向,direction为0~3表示向右,向下,向左,向上填充。当触及到边界条件时,direction就做一次改变,指向下一个方向。当向右填充,则y++,x不变。其余方向类似。需要注意的是当到达边界时,这意味...原创 2021-02-19 21:12:09 · 187 阅读 · 0 评论 -
209. 长度最小的子数组
题目给定一个含有n个正整数的数组和一个正整数 target 。找出该数组中满足其和 ≥ target 的长度最小的 连续子数组[numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。示例 1:输入:target = 7, nums = [2,3,1,2,4,3]输出:2解释:子数组[4,3]是该条件下的长度最小的子数组。示例 2:输入:target = 4, nums = [1,4,4]输出...原创 2021-02-19 21:08:34 · 137 阅读 · 0 评论 -
27. 移除元素
题目给你一个数组 nums和一个值 val,你需要 原地 移除所有数值等于val的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。说明:为什么返回数值是整数,但输出的答案是数组呢?请注意,输入数组是以「引用」方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。你可以想象内部操作如下:// nums 是以“引用”方式传递的。也就是说,不...原创 2021-02-19 21:07:04 · 99 阅读 · 0 评论 -
35. 搜索插入位置
题目给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。你可以假设数组中无重复元素。示例 1:输入: [1,3,5,6], 5输出: 2示例2:输入: [1,3,5,6], 2输出: 1示例 3:输入: [1,3,5,6], 7输出: 4示例 4:输入: [1,3,5,6], 0输出: 0思路:利用二分查找的思想,进行查找,假如该值在数组中,则返回查找下标即可,否则未查找到,最后一次更新中.原创 2021-02-19 21:05:04 · 79 阅读 · 0 评论 -
346. 数据流中的移动平均值
给定一个整数数据流和一个窗口大小,根据该滑动窗口的大小,计算其所有整数的移动平均值。详细题目可查看leetcodehttps://leetcode-cn.com/problems/moving-average-from-data-stream/解题思路题目表述的不是很清晰,最后输出的结果是滑动窗口内部的数字的平均数。具体做法是使用一个队列,当队列长度小于滑动窗口值时,计算队列内的平均数即可。当队列长度大于滑动窗口值时,弹出适合数量的队首元素(滑动窗口取的是队列尾部的元素),然后计算均值即可。原创 2021-01-05 17:54:10 · 672 阅读 · 0 评论 -
622. 设计循环队列
循环队列的一个好处是我们可以利用这个队列之前用过的空间。在一个普通队列里,一旦一个队列满了,我们就不能插入下一个元素,即使在队列前面仍有空间。但是使用循环队列,我们能使用这些空间去存储新的值。你的实现应该支持如下操作:MyCircularQueue(k): 构造器,设置队列长度为 k 。Front: 从队首获取元素。如果队列为空,返回 -1 。Rear: 获取队尾元素。如果队列为空,返回 -1 。enQueue(value): 向循环队列插入一个元素。如果成功插入则返回真。deQueue()原创 2021-01-05 17:51:02 · 172 阅读 · 0 评论 -
61. 旋转链表
具体题目描述可以查看leetcode:61. 旋转链表题目描述:给定一个链表,旋转链表,将链表每个节点向右移动k个位置,其中k是非负数。思路:先遍历一次链表,把尾指针指向开头形成环,再到相应位置剪开链表即可。需要注意的是在什么位置剪开,假如移动k步,k比链表长度小的话,需要从开头向下找的是len-k步,假如k比len大,则每多len个长度相当于一步未移动,因此把多的len步排除,最后走的是len - (k-(k/len)*len)步。/** * Definition for si...原创 2020-12-25 03:07:44 · 159 阅读 · 0 评论 -
138. 复制带随机指针的链表
具体描述可以查看leetcode给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点。要求返回这个链表的深拷贝。我们用一个由n个节点组成的链表来表示输入/输出中的链表。每个节点用一个[val, random_index]表示:val:一个表示Node.val的整数。random_index:随机指针指向的节点索引(范围从0到n-1);如果不指向任何节点,则为null。思路:由于是深拷贝,不能利用原节点,需要重新申请...原创 2020-12-25 02:03:23 · 155 阅读 · 0 评论 -
430. 扁平化多级双向链表
题目:具体图解可在leetcode查看多级双向链表中,除了指向下一个节点和前一个节点指针之外,它还有一个子链表指针,可能指向单独的双向链表。这些子列表也可能会有一个或多个自己的子项,依此类推,生成多级数据结构,如下面的示例所示。给你位于列表第一级的头节点,请你扁平化列表,使所有结点出现在单级双链表中。思路:深度遍历多级链表并用一个数组记录遍历节点,同时用一个辅助数组记录当前节点的遍历状态,为0说明反向遍历找下一个节点时忽略,为1则说明下一次遍历从该处开始。这样每次深度遍历到空指针时就回溯数.原创 2020-12-25 01:19:45 · 204 阅读 · 0 评论 -
用 Rand7() 实现 Rand10()
用 Rand7() 实现 Rand10(已有方法rand7可生成 1 到 7 范围内的均匀随机整数,试写一个方法rand10生成 1 到 10 范围内的均匀随机整数。不要使用系统的Math.random()方法。示例 1:输入: 1输出: [7]示例 2:输入: 2输出: [8,4]示例 3:输入: 3输出: [8,1,10]提示:rand7已定义。传入参数:n表示rand10的调用次数。进阶:rand7()调用次数的...原创 2020-12-13 21:58:56 · 667 阅读 · 0 评论 -
旋转数组
void rotate(int* nums, int numsSize, int k) { int count = 1; while (count <= k) { int temp = nums[numsSize - 1]; for (int i = numsSize - 1; i>0; i--) { nums[i] = nums[i - 1]; } ...原创 2018-09-07 12:22:33 · 131 阅读 · 0 评论 -
删除排序数组中的重复项
int removeDuplicates(int* nums, int numsSize) { for (int i = 0; i<numsSize; i++) { for (int j = i + 1; j<numsSize; j++) { if (nums[i] == nums[j]) //遇到重复元素 { for (int q = j; ...原创 2018-09-07 12:22:02 · 243 阅读 · 0 评论 -
买卖股票的最佳时机—2
买卖股票的最佳时机—2:题目:用一个数组表示股票每天的价格,数组的第i个数表示股票在第i天的价格。交易次数不限,但一次只能交易一支股票,也就是说手上最多只能持有一支股票,求最大收益。你可以完成尽可能多的交易(多次买卖股票)。然而, 你不能同时参与多个交易(你必须在再次购买前出售股票)。解法:贪心算法,买卖次数不限,问题就简单了,只要挣钱就卖出。//示例代码 1int max...原创 2018-09-07 12:21:22 · 234 阅读 · 0 评论 -
两数之和
/** 两数之和* Note: The returned array must be malloced, assume caller calls free().*/int* twoSum(int* nums, int numsSize, int target) { int *r = (int *)malloc(sizeof(int) * 2); int flag = 0; for (...原创 2018-09-07 12:20:36 · 133 阅读 · 0 评论 -
两个数组的交集 II
//找数组中的相同元素,元素出现个数与两数组中都相同#include<stdio.h>#include<stdlib.h>#define num1Size 10#define num2Size 4int* intersect(int* nums1, int* nums2, int* returnSize);int* intersect(int* nums1...原创 2018-09-07 12:19:57 · 107 阅读 · 0 评论 -
移动零
//移动零void moveZeroes(int* nums, int numsSize) { for (int i = 0; i<numsSize; i++) //从外层遍历 { if (nums[i] == 0) //遇到0 { for (int j = i + 1; j<numsSize; j++) //从下一个元素开始遍历,遇到非0...原创 2018-09-07 12:23:05 · 287 阅读 · 0 评论 -
有效的数独
//有效的数独#define SIZE 9 //九宫格尺寸typedef struct LNode { //链表结点 char *data;}LNode;typedef struct { //表头 LNode chap[SIZE];}Chapter;bool isValidSudoku(char** board, int b...原创 2018-09-07 12:23:49 · 152 阅读 · 0 评论 -
回文链表
//回文链表的判断 #include<stdio.h>#include<stdlib.h>#include<string.h>#define MAXSIZE 1000/*int main(void) //链表小时可以先存到数组中判断{ freopen("r1.txt","r",stdin); int a[MAXSIZE];...原创 2018-09-07 12:29:51 · 111 阅读 · 0 评论 -
相交链表
/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *he...原创 2018-10-13 00:05:19 · 109 阅读 · 0 评论 -
两数相加
/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) { ...原创 2018-10-13 00:08:28 · 102 阅读 · 0 评论 -
奇偶链表
/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */struct ListNode* oddEvenList(struct ListNode* head) { if(head == NULL || hea...原创 2018-10-13 00:12:52 · 111 阅读 · 0 评论 -
旋转链表
给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数。示例 1:输入: 1->2->3->4->5->NULL, k = 2输出: 4->5->1->2->3->NULL解释:向右旋转 1 步: 5->1->2->3->4->NULL向右旋转 2 步: 4-&a原创 2018-10-13 20:36:44 · 471 阅读 · 0 评论 -
加一
/**加一* Return an array of size *returnSize.* Note: The returned array must be malloced, assume caller calls free().*/int* plusOne(int* digits, int digitsSize, int* returnSize) { int *r = (in...原创 2018-09-07 12:14:50 · 140 阅读 · 0 评论