LeetCode
LeetCode刷题分类记录
给算法爸爸上香
爱学习的图像算法工程师一枚
展开
-
leetcode刷题46——岛屿系列
给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。此外,你可以假设该网格的四条边均被水包围。考察知识点:深度优先搜索。原创 2022-12-30 19:41:51 · 542 阅读 · 0 评论 -
leetcode刷题45——猜数字大小系列
1.猜数字大小猜数字游戏的规则如下:每轮游戏,我都会从 1 到 n 随机选择一个数字。 请你猜选出的是哪个数字。如果你猜错了,我会告诉你,你猜测的数字比我选出的数字是大了还是小了。你可以通过调用一个预先定义好的接口 int guess(int num) 来获取猜测结果,返回值一共有 3 种可能的情况(-1,1 或 0):-1:我选出的数字比你猜的数字小 pick < num1:我选出的数字比你猜的数字大 pick > num0:我选出的数字和你猜的数字一样。恭喜!你猜对了!pick原创 2021-05-30 19:48:34 · 925 阅读 · 2 评论 -
leetcode刷题44——等差数列划分系列
1.等差数列划分如果一个数列至少有三个元素,并且任意两个相邻元素之差相同,则称该数列为等差数列。例如,以下数列为等差数列:1, 3, 5, 7, 97, 7, 7, 73, -1, -5, -9以下数列不是等差数列。1, 1, 2, 5, 7数组 A 包含 N 个数,且索引从0开始。数组 A 的一个子数组划分为数组 (P, Q),P 与 Q 是整数且满足 0<=P<Q<N 。如果满足以下条件,则称子数组(P, Q)为等差数组:元素 A[P], A[p + 1], …, A原创 2021-05-24 13:50:20 · 369 阅读 · 0 评论 -
leetcode刷题43——递增的子序列系列
1.最长递增子序列给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。方法一:二分查找class Solution {public: int lengthOfLIS(vector<int>& nums) { vector<int> v(nums.size(), INT_MAX)原创 2021-05-22 20:05:08 · 271 阅读 · 0 评论 -
leetcode刷题42——数组的交集系列
1.两个数组的交集给定两个数组,编写一个函数来计算它们的交集。输出结果中的每个元素一定是唯一的,可以不考虑输出结果的顺序。考察知识点:哈希表class Solution {public: vector<int> intersection(vector<int>& nums1, vector<int>& nums2) { vector<int> v; sort(nums1.begin(),nums1原创 2021-05-21 22:31:37 · 159 阅读 · 0 评论 -
leetcode刷题41——反转字符串系列
1.反转字符串编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。你可以假设数组中的所有字符都是 ASCII 码表中的可打印字符。考察知识点:双指针class Solution {public: void reverseString(vector<char>& s) { for(int i=0,j=s.si原创 2021-05-21 22:20:58 · 134 阅读 · 0 评论 -
leetcode刷题40——幂系列
1.2的幂给定一个整数,编写一个函数来判断它是否是 2 的幂次方。class Solution {public: bool isPowerOfTwo(int n) { return n>0 && 2147483648%n==0; }};2.3的幂给定一个整数,写一个函数来判断它是否是 3 的幂次方。如果是,返回 true ;否则,返回 false 。整数 n 是 3 的幂次方需满足:存在整数 x 使得 n = 3^xclass Solu原创 2021-05-15 12:27:13 · 287 阅读 · 0 评论 -
leetcode刷题39——摆动排序系列
1.摆动排序数组摆动排序:就地排序数组,不需要额外数组,满足以下性质:nums[0]<=nums[1]>=nums[2]<=nums[3]…思路1:先给数组排个序,然后只要每次把第三个数和第二个数调换个位置,第五个数和第四个数调换个位置,以此类推直至数组末尾。class Solution {public: void wiggleSort(vector<int>& nums) { sort(nums.begin(), nums.end())原创 2021-05-13 23:23:37 · 578 阅读 · 0 评论 -
leetcode刷题38——区域和检索系列
1.区域和检索 - 数组不可变给定一个整数数组 nums,求出数组从索引 i 到 j(i ≤ j)范围内元素的总和,包含 i、j 两点。实现 NumArray 类:NumArray(int[] nums) 使用数组 nums 初始化对象int sumRange(int i, int j) 返回数组 nums 从索引 i 到 j(i ≤ j)范围内元素的总和,包含 i、j 两点(也就是sum(nums[i], nums[i + 1], … , nums[j]))考察知识点:前缀和class Num原创 2021-05-13 22:09:13 · 119 阅读 · 0 评论 -
leetcode刷题37——H指数系列
1.H 指数给定一位研究者论文被引用次数的数组(被引用次数是非负整数)。编写一个方法,计算出研究者的 h 指数。h 指数的定义:h 代表“高引用次数”(high citations),一名科研人员的 h 指数是指他(她)的 (N 篇论文中)总共有 h 篇论文分别被引用了至少 h 次。且其余的 N - h 篇论文每篇被引用次数 不超过 h 次。例如:某人的 h 指数是 20,这表示他已发表的论文中,每篇被引用了至少 20 次的论文总共有 20 篇。思路:1、首先看到h个元素大于等于某个值,N-h个元素小原创 2021-05-12 23:00:06 · 165 阅读 · 0 评论 -
leetcode刷题36——丑数系列
1.丑数给你一个整数 n ,请你判断 n 是否为 丑数 。如果是,返回 true ;否则,返回 false 。丑数 就是只包含质因数 2、3 和/或 5 的正整数。class Solution {public: bool isUgly(int n) { if(n==0) return false; while(n!=1) { if(n%5==0) n/=5; else if(n%3==0)原创 2021-04-26 12:35:40 · 890 阅读 · 0 评论 -
leetcode刷题35——二叉树的最近公共祖先系列
1.二叉搜索树的最近公共祖先给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”考察知识点:递归class Solution {public: TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {原创 2021-04-22 16:01:22 · 160 阅读 · 0 评论 -
leetcode刷题34——存在重复元素系列
1.存在重复元素给定一个整数数组,判断是否存在重复元素。如果存在一值在数组中出现至少两次,函数返回 true 。如果数组中每个元素都不相同,则返回 false 。考察知识点:哈希表class Solution {public: bool containsDuplicate(vector<int>& nums) { unordered_map<int,int> mp; for(int i=0;i<nums.size();++原创 2021-04-22 15:54:45 · 144 阅读 · 0 评论 -
leetcode刷题33——打家劫舍系列
1.打家劫舍你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。考察知识点:动态规划class Solution {public: int rob(vector<int>& nums) { int n=nums.size原创 2021-04-20 20:43:02 · 147 阅读 · 0 评论 -
leetcode刷题32——链表排序系列
1.对链表进行插入排序对链表进行插入排序。插入排序算法:(1)插入排序是迭代的,每次只移动一个元素,直到所有元素可以形成一个有序的输出列表。(2)每次迭代中,插入排序只从输入数据中移除一个待排序的元素,找到它在序列中适当的位置,并将其插入。(3)重复直到所有输入数据插入完为止。class Solution {public: ListNode* insertionSortList(ListNode* head) { ListNode* dummy=new ListNode原创 2021-04-19 20:25:57 · 307 阅读 · 0 评论 -
leetcode刷题31——二叉树的遍历系列
1.二叉树的前序遍历给你二叉树的根节点 root ,返回它节点值的前 遍历。递归解法:迭代解法:2.二叉树的中序遍历给定一个二叉树的根节点 root ,返回它的中序遍历。递归解法:迭代解法:3.二叉树的后序遍历给定一个二叉树的根节点 root ,返回它的后序遍历。递归解法:迭代解法:...原创 2021-04-19 18:44:34 · 239 阅读 · 0 评论 -
leetcode刷题30——单词拆分系列
1.单词拆分给定一个非空字符串 s 和一个包含非空单词的列表 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。说明:拆分时可以重复使用字典中的单词;你可以假设字典中没有重复的单词。考察知识点:动态规划class Solution {public: bool wordBreak(string s, vector<string>& wordDict) { vector<bool> dp(s.size()+1,fals原创 2021-04-19 15:09:26 · 190 阅读 · 0 评论 -
leetcode刷题29——只出现一次的数字系列
1.只出现一次的数字给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。说明:你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?考察知识点:位运算class Solution {public: int singleNumber(vector<int>& nums) { for(int i=1;i<nums.size();++i) nums[0]^=nums[i];原创 2021-04-19 12:39:06 · 324 阅读 · 0 评论 -
leetcode刷题28——买卖股票的最佳时机系列
1.买卖股票的最佳时机给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。你只能选择某一天买入这只股票,并选择在未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。class Solution {public: int maxProfit(vector<int>& prices) { int sum=0,ans原创 2021-04-18 15:18:15 · 703 阅读 · 0 评论 -
leetcode刷题27——杨辉三角系列
1.杨辉三角给定一个非负整数numRows,生成杨辉三角的前numRows 行。在杨辉三角中,每个数是它左上方和右上方的数的和。考察知识点:动态规划class Solution {public: vector<vector<int>> generate(int numRows) { vector<vector<int>> ans(numRows); for(int i=0;i<numRows;++i)原创 2021-04-18 13:31:27 · 105 阅读 · 0 评论 -
leetcode刷题26——填充二叉树节点指针系列
1.填充每个节点的下一个右侧节点指针给定一个完美二叉树 ,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下:struct Node {int val;Node *left;Node *right;Node *next;}填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。初始状态下,所有 next 指针都被设置为 NULL。考察知识点:递归class Solution {public:原创 2021-04-17 22:22:31 · 155 阅读 · 0 评论 -
leetcode刷题25——构造二叉树系列
1.从前序与中序遍历序列构造二叉树根据一棵树的前序遍历与中序遍历构造二叉树。注意:你可以假设树中没有重复的元素。考察知识点:递归class Solution {public: TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) { return Tree(0,preorder.size()-1,0,inorder.size()-1,preorder,inord原创 2021-04-17 20:01:39 · 150 阅读 · 0 评论 -
leetcode刷题24——二叉树的深度系列
1.二叉树的最大深度给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。说明: 叶子节点是指没有子节点的节点。考察知识点:递归class Solution {public: int maxDepth(TreeNode* root) { if(!root) return 0; return max(maxDepth(root->left),maxDepth(root->right))+1; }};原创 2021-04-17 19:54:52 · 222 阅读 · 0 评论 -
leetcode刷题23——二叉树的层序遍历系列
1.二叉树的层序遍历给你一个二叉树,请你返回其按 层序遍历 得到的节点值。(即逐层地,从左到右访问所有节点)。DFS解法:class Solution {public: vector<vector<int>> ans; vector<vector<int>> levelOrder(TreeNode* root) { dfs(root,0); return ans; } void dfs(T原创 2021-04-17 17:29:49 · 140 阅读 · 0 评论 -
leetcode刷题22——二叉搜索树系列
1.不同的二叉搜索树给定一个整数 n,求以 1 … n 为节点组成的二叉搜索树有多少种?考察知识点:动态规划结题思路:假设n个节点存在二叉排序树的个数是G(n),1为根节点,2为根节点,…,n为根节点;当1为根节点时,其左子树节点个数为0,右子树节点个数为n-1,同理当2为根节点时,其左子树节点个数为1,右子树节点为n-2,所以可得G(n) = G(0)G(n-1)+G(1)(n-2)+…+G(n-1)*G(0)。class Solution {public: int numTrees(i原创 2021-04-17 13:44:01 · 376 阅读 · 0 评论 -
leetcode刷题21——求众数系列
1.求众数给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。你可以假设数组是非空的,并且给定的数组总是存在多数元素。考察知识点:摩尔投票法class Solution {public: int majorityElement(vector<int>& nums) { int n=0,num; for(int i=0;i<nums.size();++i) {原创 2021-04-17 12:47:48 · 184 阅读 · 0 评论 -
leetcode刷题20——搜索矩阵系列
1.搜索二维矩阵编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值。该矩阵具有如下特性:每行中的整数从左到右按升序排列;每行的第一个整数大于前一行的最后一个整数。考察知识点:二分查找思路:若将矩阵每一行拼接在上一行的末尾,则会得到一个升序数组,我们可以在该数组上二分找到目标元素。代码实现时,可以二分升序数组的下标,将其映射到原矩阵的行和列上。class Solution {public: bool searchMatrix(vector<vector<int&g原创 2021-04-16 15:06:03 · 247 阅读 · 0 评论 -
leetcode刷题19——删除排序链表中的重复元素系列
1.删除排序链表中的重复元素存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除所有重复的元素,使每个元素只出现一次 。返回同样按升序排列的结果链表。递归解法:class Solution {public: ListNode* deleteDuplicates(ListNode* head) { if(!head) return head; if(head->next&&head->val==原创 2021-04-16 14:40:18 · 221 阅读 · 0 评论 -
leetcode刷题18——子集系列
1.子集给你一个整数数组nums,数组中的元素互不相同 。返回该数组所有可能的子集(幂集)。解集不能包含重复的子集。你可以按任意顺序返回解集。考察知识点:DFSclass Solution {public: vector<vector<int>> ans; vector<int> v; vector<vector<int>> subsets(vector<int>& nums) {原创 2021-04-16 13:41:25 · 173 阅读 · 0 评论 -
leetcode刷题17——计算器系列
1.基本计算器给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。1 <= s.length <= 3 * 105;s 由数字、’+’、’-’、’(’、’)’、和 ’ ’ 组成;s 表示一个有效的表达式。考察知识点:括号展开、栈class Solution {public: int calculate(string s) { stack<int> st; st.push(1); int sign原创 2021-04-16 13:14:06 · 307 阅读 · 0 评论 -
leetcode刷题16——爬楼梯系列
1.爬楼梯假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?考察知识点:动态规划class Solution {public: int climbStairs(int n) { if(n == 1){return 1;} if(n == 2){return 2;} int a = 1, b = 2, temp; for(int i = 3; i <= n;原创 2021-04-16 12:17:55 · 221 阅读 · 0 评论 -
leetcode刷题15——路径总和系列
1.路径总和给你二叉树的根节点 root 和一个表示目标和的整数 targetSum ,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和 targetSum。叶子节点是指没有子节点的节点。考察知识点:DFSclass Solution {public: bool hasPathSum(TreeNode* root, int targetSum) { if(!root) return false; if(!root->lef原创 2021-04-15 10:44:45 · 226 阅读 · 0 评论 -
leetcode刷题14——不同路径系列
1.不同路径一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。问总共有多少条不同的路径?考察知识点:动态规划class Solution {public: int uniquePaths(int m, int n) { vector<vector<int>> dp(m,vector<int>(n));原创 2021-04-14 22:21:13 · 188 阅读 · 0 评论 -
leetcode刷题13——螺旋矩阵系列
1.螺旋矩阵给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。考察知识点:模拟class Solution {public: vector<int> spiralOrder(vector<vector<int>>& matrix) { vector <int> v; int up=0, down = matrix.size()-1, left=0, right原创 2021-04-14 21:23:52 · 284 阅读 · 0 评论 -
leetcode刷题12——区间系列
1.合并区间以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。考察知识点:排序class Solution {public: vector<vector<int>> merge(vector<vector<int>>& intervals) { sort(in原创 2021-04-14 18:55:57 · 194 阅读 · 0 评论 -
leetcode刷题11——旋转排序数组系列
1.搜索旋转排序数组整数数组 nums 按升序排列,数组中的值 互不相同 。在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length)上进行了 旋转,使数组变为 [nums[k], nums[k+1], …, nums[n-1], nums[0], nums[1], …, nums[k-1]](下标 从 0 开始 计数)。例如, [0,1,2,4,5,6,7] 在下标 3 处经旋转后可能变为 [4,5,6,7,0,1,2] 。给你旋转后的数组nums和原创 2021-04-14 11:28:08 · 351 阅读 · 0 评论 -
leetcode刷题10——环形链表系列
1.环形链表给定一个链表,判断链表中是否有环。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。如果链表中存在环,则返回 true 。 否则,返回 false 。考察知识点:快慢指针class Solution {public: bool hasCyc原创 2021-04-13 18:32:37 · 97 阅读 · 0 评论 -
leetcode刷题9——反转链表系列
1.反正链表反转一个单链表。递归解法:class Solution {public: ListNode* reverseList(ListNode* head) { if (!head || !head->next) return head; ListNode* newHead = reverseList(head->next); head->next->next = head;原创 2021-04-13 17:12:14 · 199 阅读 · 0 评论 -
leetcode刷题8——合并链表系列
1.合并两个有序链表将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。递归解法:class Solution {public: ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) { if (l1 == nullptr) { return l2; } else if (l2 == nullptr)原创 2021-04-13 16:49:44 · 181 阅读 · 0 评论 -
leetcode刷题7——跳跃游戏系列
1.跳跃游戏给定一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个下标。考察知识点:贪心算法解题思路:(1)如果某一个作为 起跳点 的格子可以跳跃的距离是 3,那么表示后面 3 个格子都可以作为 起跳点。(2)可以对每一个能作为 起跳点 的格子都尝试跳一次,把 能跳到最远的距离 不断更新。(3)如果可以一直跳到最后,就成功了.bool canJump(vector<int>& num原创 2021-04-13 14:33:27 · 441 阅读 · 0 评论