每日刷题
zzh123353
越努力越幸运
展开
-
LeetCode寻找小镇的法官和搜寻名人
997 找到小镇的法官题目信息在一个小镇里,按从 1 到 n 为 n 个人进行编号。传言称,这些人中有一个是小镇上的秘密法官。如果小镇的法官真的存在,那么:1.小镇的法官不相信任何人。2.每个人(除了小镇法官外)都信任小镇的法官。3.只有一个人同时满足条件 1 和条件 2 。给定数组 trust,该数组由信任对 trust[i] = [a, b] 组成,表示编号为 a 的人信任编号为 b 的人。如果小镇存在秘密法官并且可以确定他的身份,请返回该法官的编号。否则,返回 -1。解题思路这道原创 2021-12-19 21:36:28 · 135 阅读 · 0 评论 -
LeetCode 算法 85 最大矩形
LeetCode 算法 85 最大矩形题目给定一个仅包含 0 和 1 、大小为 rows x cols 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积。解法 单调栈转化为84题直方图矩形的最大面积class Solution {public: int maximalRectangle(vector<vector<char>>& matrix) { int m = matrix.size(); if(m原创 2021-06-24 16:36:37 · 67 阅读 · 0 评论 -
LeetCode 101 对称二叉树
LeetCode 101 对称二叉树题目给定一个二叉树,检查它是否是镜像对称的。解法 递归思路如下:1.怎么判断一棵树是不是对称二叉树? 答案:如果所给根节点,为空,那么是对称。如果不为空的话,当他的左子树与右子树对称时,他对称2.那么怎么知道左子树与右子树对不对称呢?在这我直接叫为左树和右树 答案:如果左树的左孩子与右树的右孩子对称,左树的右孩子与右树的左孩子对称,那么这个左树和右树就对称。仔细读这句话,是不是有点绕?怎么感觉有一个功能A我想实现,但我去实现A的时候又要用到A实现后的功能呢原创 2021-06-22 10:36:43 · 70 阅读 · 0 评论 -
LeetCode 算法538 把二叉搜索树转为累加树
LeetCode 算法538 把二叉搜索树转为累加树题目给出二叉 搜索 树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点 node 的新值等于原树中大于或等于 node.val 的值之和。提醒一下,二叉搜索树满足下列约束条件:节点的左子树仅包含键 小于 节点键的节点。节点的右子树仅包含键 大于 节点键的节点。左右子树也必须是二叉搜索树。解法 反序中序遍历(右、中、左)设计一个全局变量sum来记录总和/** * Definition f原创 2021-06-22 10:29:42 · 50 阅读 · 0 评论 -
LeetCode215 数组中的第K大的元素
LeetCode215 数组中的第K大的元素题目在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。解法 堆排序先把数组建立成一个大顶堆,再进行排序经典堆排序问题class Solution {public: void heapify(vector<int>& nums, int n, int i){ if( i >= n) return;原创 2021-06-20 19:26:11 · 38 阅读 · 0 评论 -
LeetCode 503 下一个更大元素 II
LeetCode 503 下一个更大元素 II题目给定一个循环数组(最后一个元素的下一个元素是数组的第一个元素),输出每个元素的下一个更大元素。数字 x 的下一个更大的元素是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地搜索它的下一个更大的数。如果不存在,则输出 -1。解法 单调栈一开始想的扩容数组,把数组扩大到原来的2倍实现循环class Solution {public: vector<int> nextGreaterElements(vec原创 2021-06-19 16:04:53 · 84 阅读 · 0 评论 -
LeetCode 算法496 下一个更大的元素
LeetCode 算法496 下一个更大的元素题目给你两个 没有重复元素 的数组 nums1 和 nums2 ,其中nums1 是 nums2 的子集。请你找出 nums1 中每个元素在 nums2 中的下一个比其大的值。nums1 中数字 x 的下一个更大元素是指 x 在 nums2 中对应位置的右边的第一个比 x 大的元素。如果不存在,对应位置输出 -1 。解法1 暴力求解class Solution {public: vector<int> nextGreaterE原创 2021-06-19 15:27:47 · 131 阅读 · 0 评论 -
LeetCode 147 对链表进行插入排序
LeetCode 147 对链表进行插入排序题目对链表进行插入排序解法/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : val(x), next(nullptr) {} * ListNode(int原创 2021-06-17 20:26:44 · 39 阅读 · 0 评论 -
LeetCode 96不同的二叉搜索树
LeetCode 96不同的二叉搜索树题目给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。解法 动态规划假设 n 个节点存在二叉排序树的个数是 G (n),令 f(i) 为以 i 为根的二叉搜索树的个数,则G(n)=f(1)+f(2)+f(3)+f(4)+...+f(n)当 i 为根节点时,其左子树节点个数为 i-1 个,右子树节点为 n-i,则f(i) = G(i-1)*G(n-i)f(i)=G(i−1)∗G原创 2021-06-16 15:37:06 · 46 阅读 · 0 评论 -
LeetCode 算法79 单词搜索
LeetCode 算法79 单词搜索题目给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。解法:回溯难点:条件的判断class Solution {public: bool backtrack(vector<vector<cha原创 2021-06-15 20:07:08 · 61 阅读 · 0 评论 -
LeetCode 算法78 子集
LeetCode 算法78 子集题目给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。解法 回溯算法class Solution {public: void backtrack(const vector<int>& nums, vector<vector<int>>& res, vector<原创 2021-06-14 09:46:10 · 67 阅读 · 0 评论 -
LeetCode 算法77 组合
LeetCode 算法77 组合题目给定两个整数 n 和 k,返回 1 … n 中所有可能的 k 个数的组合解法 回溯法class Solution {public: void backtrack(int n, int k, vector<vector<int>>& res, vector<int>& path, int index){ if(path.size() == k)原创 2021-06-14 09:31:54 · 90 阅读 · 0 评论 -
LeetCode 算法63 不同路径II
LeetCode 算法63 不同路径II题目一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?解法 动态规划关键点:当上边界点被阻塞时,其右边的点一起被阻塞;当左边界点被阻塞时,其下边的点一起被阻塞;如果当前点是放有障碍物,则dp[i][j] = 0;class Solution {p原创 2021-06-13 19:26:52 · 62 阅读 · 0 评论 -
LeetCode 算法62 不同路径
LeetCode 算法62 不同路径题目一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。问总共有多少条不同的路径?解法 1.动态规划关键:dp[i - 1][j - 1] = dp[i - 1][j] + dp[i][j -1];到达此点,要么是dp[i - 1][j]向下走一步,要么是dp[i][j - 1]向右走一步class Solutio原创 2021-06-13 19:02:38 · 47 阅读 · 0 评论 -
LeetCode 算法103二叉树的锯齿形层次遍历
LeetCode 算法103二叉树的锯齿形层次遍历题目给定一个二叉树,返回其节点值的锯齿形层序遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。例如:给定二叉树 [3,9,20,null,null,15,7],解法 利用队列并设置标志位进行反转/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * Tre原创 2021-06-12 21:57:08 · 46 阅读 · 0 评论 -
LeetCode 算法38 外观数列
LeetCode 算法38 外观数列题目给定一个正整数 n ,输出外观数列的第 n 项。「外观数列」是一个整数序列,从数字 1 开始,序列中的每一项都是对前一项的描述。你可以将其视作是由递归公式定义的数字字符串序列:countAndSay(1) = “1”countAndSay(n) 是对 countAndSay(n-1) 的描述,然后转换成另一个数字字符串。解法 双指针class Solution {public: string countAndSay(int n) {原创 2021-06-12 21:27:36 · 54 阅读 · 0 评论 -
LeetCode 算法 64 最小路径和
LeetCode 算法 64 最小路径和题目给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。说明:每次只能向下或者向右移动一步。解法 动态规划class Solution {public: int minPathSum(vector<vector<int>>& grid) { int row = grid.size(), col = grid[0].size();原创 2021-06-12 20:45:05 · 38 阅读 · 0 评论 -
LeetCode 算法75 颜色分类
LeetCode 算法75 颜色分类题目给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。此题中,我们使用整数 0、1 和 2 分别表示红色、白色和蓝色。解法 双指针一个指向头元素,一个指向尾元素;遇到0则和p1交换位置,并判断交换后的值是否为2,如果为2则需要与p2交换位置,再次判断交换后的值,只要不是1,则需要再次对其进行判断,执行i–进入下一轮循环进行判断。class Solution {public:原创 2021-06-12 19:45:54 · 134 阅读 · 0 评论 -
LeetCode 算法22 括号生成
LeetCode 算法22 括号生成题目数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。解题方法 回溯法如果左括号数量不大于 nn,我们可以放一个左括号。如果右括号数量小于左括号的数量,我们可以放一个右括号。class Solution {public: void backtrack(vector<string> &res, string combination, int n, int le1, int le2){原创 2021-06-11 11:10:08 · 87 阅读 · 1 评论 -
LeetCode 算法46 全排列
LeetCode 算法46 全排列题目给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。重点是for循环里面的书写内容,交换位置,比较巧妙class Solution {public: void trackback(vector<int>& nums, vector<vector<int>>& combinations, int index){ if(index == nu原创 2021-06-10 19:59:29 · 554 阅读 · 0 评论 -
Leetcode 2 两数之和
Leetcode 算法2 两数之和题目给你两个非空的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字0之外,这两个数都不会以0开头。初步求解思路class Solution {public: ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) { ListNode *res = new Lis原创 2021-06-10 19:17:14 · 52 阅读 · 0 评论 -
Leetcode 39 40 组合总和
Leetcode 39 组合总和题目给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的数字可以无限制重复被选取。说明:所有数字(包括 target)都是正整数。解集不能包含重复的组合。解题方法:回溯法回溯法模板void trackback(参数){ if(条件判断){ 处理结果 返回 } for(条件){ 处理原创 2021-06-09 15:45:16 · 67 阅读 · 0 评论 -
Leetcode 算法17
Leetcode 算法17 电话号码的字母组合题目给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。`解题方法:回溯法首先使用哈希表存储每个数字对应的所有可能的字母,然后进行回溯操作。回溯过程中维护一个字符串,表示已有的字母排列(如果未遍历完电话号码的所有数字,则已有的字母排列是不完整的)。该字符串初始为空。每次取电话号码的一位数字,从哈希表中获得该数字对应的所有可能的字母,并原创 2021-06-09 14:51:53 · 115 阅读 · 0 评论 -
力扣 算法11
Leetcode 算法11 盛水最多的容器题目给你 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。说明:你不能倾斜容器。解法:双指针分析我们先从题目中的示例开始,一步一步地解释双指针算法的过程。稍后再给出算法正确性的证明。题目中的示例为:[1(p1), 8, 6, 2, 5, 4, 8, 3, 7(原创 2021-06-09 10:13:43 · 68 阅读 · 0 评论