
leetcode
l_c_c_c
这个作者很懒,什么都没留下…
展开
-
leetcode155. 最小栈 1441. 用栈操作构建数组 剑指 Offer 09. 用两个栈实现队列
题目:leetcode155. 最小栈题目描述:设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。代码:class MinStack {public: /** initialize your data structure here. */ stack<int>s1; stack<int>s2; void push(int x) { s1.push(x); if(s2.原创 2020-09-27 23:52:31 · 796 阅读 · 0 评论 -
589. N叉树的前序遍历
题目描述:给定一个 N 叉树,返回其节点值的前序遍历。代码:/*// Definition for a Node.class Node {public: int val; vector<Node*> children; Node() {} Node(int _val) { val = _val; } Node(int _val, vector<Node*> _children) { val原创 2020-09-01 23:15:32 · 108 阅读 · 0 评论 -
94. 二叉树的中序遍历C++
题目描述:给定一个二叉树,返回它的中序 遍历。解题思路:(1)根的左孩子依次入栈(2)左孩子全部入栈后,栈顶元素出栈。(3)若栈顶元素有右孩子重复(1)的操作。代码:/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL),原创 2020-08-31 23:19:14 · 138 阅读 · 0 评论 -
965. 单值二叉树C++
题目描述:如果二叉树每个节点都具有相同的值,那么该二叉树就是单值二叉树。只有给定的树是单值二叉树时,才返回 true;否则返回 false。代码:/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL原创 2020-08-29 21:21:54 · 162 阅读 · 0 评论 -
24. 两两交换链表中的节点C++
题目描述:给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。代码:/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public: ListNode* swapPairs(ListNode*原创 2020-08-28 23:07:24 · 146 阅读 · 0 评论 -
19. 删除链表的倒数第N个节点C++
题目描述:给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。代码:/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public: ListNode* removeNthFromEn原创 2020-08-27 22:43:38 · 114 阅读 · 0 评论 -
226. 翻转二叉树C++
题目描述:翻转一棵二叉树。解题思路:根节点入栈,然后依次交换根节点的左右子树。代码:/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution原创 2020-08-26 21:34:27 · 260 阅读 · 0 评论 -
671. 二叉树中第二小的节点C++
题目描述:给定一个非空特殊的二叉树,每个节点都是正数,并且每个节点的子节点数量只能为 2 或 0。如果一个节点有两个子节点的话,那么该节点的值等于两个子节点中较小的一个。给出这样的一个二叉树,你需要输出所有节点中的第二小的值。如果第二小的值不存在的话,输出 -1 。代码:/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode原创 2020-08-25 22:50:35 · 194 阅读 · 0 评论 -
101. 对称二叉树C++
题目描述:给定一个二叉树,检查它是否是镜像对称的。解题思路:二叉树要想对称,根结点的左孩子的右子树要等于根结点的右孩子的左子树;左孩子的左子树要等于右孩子的右子树。代码:/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL原创 2020-08-24 21:16:32 · 193 阅读 · 0 评论 -
617. 合并二叉树C++
题目描述:给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠。你需要将他们合并为一个新的二叉树。合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为 NULL 的节点将直接作为新二叉树的节点。代码:/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right;原创 2020-08-23 20:27:45 · 338 阅读 · 0 评论 -
257. 二叉树的所有路径C++
题目描述:给定一个二叉树,返回所有从根节点到叶子节点的路径。解题思路:分别递归左子树和右子树。代码:/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class S原创 2020-08-22 17:06:53 · 199 阅读 · 0 评论 -
538. 把二叉搜索树转换为累加树C++
题目描述:给定一个二叉搜索树(Binary Search Tree),把它转换成为累加树(Greater Tree),使得每个节点的值是原来的节点值加上所有大于它的节点值之和。解题思路:中序遍历右—中—左。右子树都是大于根节点本身的,所以右子树的累加和就是根节点需要累加的数值。 而左子树有些特殊。根的左根,要累加根节点的数值。左根要累加它自身的右子树的数值。 左根右子树,因为小于根节点,所以计算左根右子树的时候还要把根节点的数值算上去,因为根节点大于它。左根的左子树要累加左跟的数值。代码:/**原创 2020-08-21 17:49:51 · 145 阅读 · 0 评论 -
108. 将有序数组转换为二叉搜索树C++
题目描述:将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。解题思路:二叉搜索树的左子树值小于根的值,右子树的值大于根的值。将数组的中间元素设为根的值,数组的前半部分元素构建左子树,数组的后半部分构建右子树。代码:/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode原创 2020-08-20 18:34:03 · 224 阅读 · 0 评论 -
110. 平衡二叉树C++
题目描述:给定一个二叉树,判断它是否是高度平衡的二叉树。本题中,一棵高度平衡二叉树定义为: 一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。解题思路:判断一棵树是否为二叉树关键看树中结点的左右孩子是否存在同时左右孩子的高度差是否超过一。代码:/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *rig原创 2020-08-19 20:46:38 · 123 阅读 · 0 评论 -
637. 二叉树的层平均值C++
题目描述:给定一个非空二叉树, 返回一个由每层节点平均值组成的数组。解题思路:要借助一个队列得知每层有多少个结点。队列的头结点出队,头节点若有左右孩子则入队。代码:/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL),原创 2020-08-18 19:11:45 · 313 阅读 · 0 评论 -
leetcode第1304. 和为零的N个唯一整数C++
题目描述:给你一个整数 n,请你返回 任意 一个由 n 个 各不相同 的整数组成的数组,并且这 n 个数相加和为 0 。解题思路:n为偶数数组关于正负号对称;n为奇数数组以0为中心对称。代码:class Solution {public: vector<int> sumZero(int n) { vector<int>A(n); for(int i=0;i<n;++i) A[i]=i*2-n+1;原创 2020-07-30 18:13:13 · 159 阅读 · 0 评论 -
leetcode第1346. 检查整数及其两倍数是否存在C++
题目描述:给你一个整数数组 arr,请你检查是否存在两个整数 N 和 M,满足 N 是 M 的两倍(即,N = 2 * M)。解题思路:注意0这个特殊值。代码:class Solution {public: bool checkIfExist(vector<int>& arr) { unordered_map<int,int>s; for(int x:arr) s[x]++; for(int原创 2020-07-29 21:17:42 · 141 阅读 · 0 评论 -
leetcode第605. 种花问题C++
题目描述:假设你有一个很长的花坛,一部分地块种植了花,另一部分却没有。可是,花卉不能种植在相邻的地块上,它们会争夺水源,两者都会死去。给定一个花坛(表示为一个数组包含0和1,其中0表示没种植花,1表示种植了花),和一个数 n 。能否在不打破种植规则的情况下种入 n 朵花?能则返回True,不能则返回False。解题思路:在 flowerbed 数组两端各增加一个 0, 这样处理的好处在于不用考虑边界条件,任意位置处只要连续出现三个 0 就可以栽上一棵花。代码:class Solution {publ原创 2020-07-28 18:01:22 · 519 阅读 · 0 评论 -
leetcode第1502. 判断能否形成等差数列C++
题目描述:给你一个数字数组 arr 。如果一个数列中,任意相邻两项的差总等于同一个常数,那么这个数列就称为 等差数列 。如果可以重新排列数组形成等差数列,请返回 true ;否则,返回 false 。先排好序。代码:class Solution {public: bool canMakeArithmeticProgression(vector<int>& arr) { sort(arr.begin(),arr.end()); int dif原创 2020-07-27 17:44:46 · 618 阅读 · 0 评论 -
leetcode第1018. 可被 5 整除的二进制前缀C++
题目描述:给定由若干 0 和 1 组成的数组 A。我们定义 N_i:从 A[0] 到 A[i] 的第 i 个子数组被解释为一个二进制数(从最高有效位到最低有效位)。返回布尔值列表 answer,只有当 N_i 可以被 5 整除时,答案 answer[i] 为 true,否则为 false。解题思路:被5整除末位只能是0或者是5。代码:class Solution {public: vector<bool> prefixesDivBy5(vector<int>&原创 2020-07-26 12:32:38 · 240 阅读 · 0 评论 -
leetcode第561. 数组拆分 IC++
题目描述:给定长度为 2n 的数组, 你的任务是将这些数分成 n 对, 例如 (a1, b1), (a2, b2), …, (an, bn) ,使得从1 到 n 的 min(ai, bi) 总和最大。解题思路:先排序然后把数组下标为奇数的元素加起来。代码:class Solution {public: int arrayPairSum(vector<int>& nums) { sort(nums.begin(),nums.end()); i原创 2020-07-25 21:30:37 · 171 阅读 · 0 评论 -
leetcode第989. 数组形式的整数加法C++
题目描述:对于非负整数 X 而言,X 的数组形式是每位数字按从左到右的顺序形成的数组。例如,如果 X = 1231,那么其数组形式为 [1,2,3,1]。给定非负整数 X 的数组形式 A,返回整数 X+K 的数组形式。代码解析:A[i] += K;K = A[i] / 10;A[i] %= 10;先加再除然后取余。代码:class Solution {public: vector<int> addToArrayForm(vector<int>& A,原创 2020-07-24 20:43:35 · 245 阅读 · 0 评论 -
leetcode第717. 1比特与2比特字符C++
题目描述:有两种特殊字符。第一种字符可以用一比特0来表示。第二种字符可以用两比特(10 或 11)来表示。现给一个由若干比特组成的字符串。问最后一个字符是否必定为一个一比特字符。给定的字符串总是由0结束。代码:class Solution {public: bool isOneBitCharacter(vector<int>& bits) { bool c; for(int i=0;i<bits.size();){原创 2020-07-24 19:15:09 · 135 阅读 · 0 评论 -
leetcode第1185. 一周中的第几天C++
题目描述:给你一个日期,请你设计一个算法来判断它是对应一周中的哪一天。输入为三个整数:day、month 和 year,分别表示日、月、年。您返回的结果必须是这几个值中的一个 {“Sunday”, “Monday”, “Tuesday”, “Wednesday”, “Thursday”, “Friday”, “Saturday”}。代码解析:基姆拉尔森计算公式把一月和二月看成是上一年的十三月和十四月,例:如果是2004-1-10则换算成:2003-13-10来代入公式计算。代码:class Solu原创 2020-07-23 19:09:04 · 266 阅读 · 0 评论 -
leetcode第766. 托普利茨矩阵C++
题目描述:如果矩阵上每一条由左上到右下的对角线上的元素都相同,那么这个矩阵是 托普利茨矩阵 。给定一个 M x N 的矩阵,当且仅当它是托普利茨矩阵时返回 True。代码:class Solution {public: bool isToeplitzMatrix(vector<vector<int>>& matrix) { int m=matrix.size(),n=matrix[0].size(); for(int i=1;i原创 2020-07-22 19:33:43 · 223 阅读 · 0 评论 -
leetcode第1470. 重新排列数组C++
题目描述:给你一个数组 nums ,数组中有 2n 个元素,按 [x1,x2,…,xn,y1,y2,…,yn] 的格式排列。请你将数组按 [x1,y1,x2,y2,…,xn,yn] 格式重新排列,返回重排后的数组。代码解析:return vector(ans,ans+n2);从数组ans中获取n2个值。解题思路:关键是如何获取n后面的元素。代码:class Solution {public: vector<int> shuffle(vector<int>&原创 2020-07-21 21:46:58 · 372 阅读 · 0 评论 -
leetcode第977. 有序数组的平方C++
题目描述:给定一个按非递减顺序排序的整数数组 A,返回每个数字的平方组成的新数组,要求也按非递减顺序排序。解题思路:比较元素绝对值。代码:class Solution {public: vector<int> sortedSquares(vector<int>& A) { vector<int>res(A.size()); int l=0,r=A.size()-1; for(int k=A.size(原创 2020-07-20 22:41:02 · 268 阅读 · 0 评论 -
leetcode第1491. 去掉最低工资和最高工资后的工资平均值C++
题目描述:给你一个整数数组 salary ,数组里每个数都是 唯一 的,其中 salary[i] 是第 i 个员工的工资。请你返回去掉最低工资和最高工资以后,剩下员工工资的平均值。代码:class Solution {public: double average(vector<int>& salary) { if(salary.size()==2) return 0; int mins=INT_MAX; int maxs=I原创 2020-07-19 21:33:08 · 215 阅读 · 0 评论 -
leetcode第19. 删除链表的倒数第N个节点C++
题目描述:给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。解题思路:先让t2走n步,等t2走完时t1刚好在n的位置。代码:/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public:原创 2020-07-18 21:38:01 · 158 阅读 · 0 评论 -
leetcode第21. 合并两个有序链表C++
题目描述:将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 代码:/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public: ListNode*原创 2020-07-17 21:57:01 · 116 阅读 · 0 评论 -
leetcode第92. 反转链表 IIC++
题目描述:反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。解题思路:先遍历前m-1个节点,再反转m到n之间的节点。代码:/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public: L原创 2020-07-16 21:50:09 · 141 阅读 · 0 评论 -
leetcode第725. 分隔链表C++
题目描述:给定一个头结点为 root 的链表, 编写一个函数以将链表分隔为 k 个连续的部分。每部分的长度应该尽可能的相等: 任意两部分的长度差距不能超过 1,也就是说可能有些部分为 null。这k个部分应该按照在链表中出现的顺序进行输出,并且排在前面的部分的长度应该大于或等于后面的长度。返回一个符合上述规则的链表的列表。代码:/** * Definition for singly-linked list. * struct ListNode { * int val; * Li原创 2020-07-15 22:16:35 · 244 阅读 · 0 评论 -
leetcode第155. 最小栈C++
题目描述:设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。push(x) —— 将元素 x 推入栈中。pop() —— 删除栈顶的元素。top() —— 获取栈顶元素。getMin() —— 检索栈中的最小元素。代码: class MinStack {private: stack<int>s1; stack<int>s2;public: /** initialize your data structur原创 2020-07-14 22:19:00 · 145 阅读 · 0 评论 -
leetcode第. 有效的括号C++
题目描述:给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。代码解析:最后一行不能return true,因为当只有(,{,【时会出错。代码:class Solution {public: bool isValid(string s) { stack<char>paren; for(char&c:s){ switch(c){ case'('原创 2020-07-13 22:30:50 · 122 阅读 · 0 评论 -
leetcode第148. 排序链表C++
题目描述:在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序。解题思路:归并排序:1,快慢指针找中点;2,递归调用mergeSort,3,合并两个链表代码:/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class原创 2020-07-12 22:44:13 · 101 阅读 · 0 评论 -
leetcode第86. 分隔链表C++
题目描述:给定一个链表和一个特定值 x,对链表进行分隔,使得所有小于 x 的节点都在大于或等于 x 的节点之前。你应当保留两个分区中每个节点的初始相对位置。解题思路:整两个临时链表头,小的放进L,大的放进R。最后拼接二者。函数执行完毕后两个临时表头会自动析构。代码:/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(in原创 2020-07-11 21:36:58 · 194 阅读 · 0 评论 -
leetcode第61. 旋转链表C++
题目描述:给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数。解题思路:先遍历链表长度,然后将末尾节点指向头节点,计算出k的值。代码:/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solut原创 2020-07-10 22:32:41 · 137 阅读 · 0 评论 -
leetcode第82. 删除排序链表中的重复元素 IIC++
题目描述:给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字。代码:/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public: ListNode* delet原创 2020-07-09 22:52:07 · 182 阅读 · 0 评论 -
leetcode第2. 两数相加C++
题目描述:给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。您可以假设除了数字 0 之外,这两个数都不会以 0 开头。解题思路:先设置一个哨兵,前链表两个元素先相加然后取余,之后整除10(进位)。代码:/** * Definition for singly-linked list. * struct ListNode { * int val原创 2020-07-08 22:29:42 · 140 阅读 · 0 评论 -
leetcode第441. 排列硬币C++
题目描述:你总共有 n 枚硬币,你需要将它们摆成一个阶梯形状,第 k 行就必须正好有 k 枚硬币。给定一个数字 n,找出可形成完整阶梯行的总行数。代码:class Solution {public: int arrangeCoins(int n) { int i=1; while(n>=i) n-=i,i++; return i-1; }};...原创 2020-07-07 22:49:14 · 210 阅读 · 0 评论