Leetcode
Clock_zzd
忍耐和坚持是痛苦的,但它会逐给你好处。
展开
-
ACM模式数组构建二叉树
那么此时大家是不是应该知道了,数组如何转化成 二叉树了。如果父节点的数组下标是i,那么它的左孩子下标就是i * 2 + 1,右孩子下标就是 i * 2 + 2。#include <iostream>#include <vector>#include <queue>using namespace std;struct TreeNode { int val; TreeNode *left; TreeNode *right; ...原创 2022-03-10 17:14:20 · 1751 阅读 · 0 评论 -
剑指offer 56 - 1.数组中数字出现的次数
一个整型数组 nums 里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。示例 1:输入:nums = [4,1,4,6]输出:[1,6] 或 [6,1]示例 2:输入:nums = [1,2,10,4,1,4,3,3]输出:[2,10] 或 [10,2]思路:相同的数异或得0,不同数异或得1,分组异或。class Solution {public: vector<int>原创 2022-03-06 16:24:09 · 156 阅读 · 0 评论 -
剑指offer 31.栈的、压入弹出序列
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如,序列 {1,2,3,4,5} 是某栈的压栈序列,序列 {4,5,3,2,1} 是该压栈序列对应的一个弹出序列,但 {4,3,5,1,2} 就不可能是该压栈序列的弹出序列。示例 1:输入:pushed = [1,2,3,4,5], popped = [4,5,3,2,1]输出:true解释:我们可以按以下顺序执行:push(1), push(2), push(3), pus原创 2022-03-05 18:18:31 · 144 阅读 · 0 评论 -
剑指offer 26.数字的子结构
输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构)B是A的子结构, 即 A中有出现和B相同的结构和节点值。例如:给定的树 A:3/ \4 5/ \1 2给定的树 B:4/1返回 true,因为 B 与 A 的一个子树拥有相同的结构和节点值。思路:B是A的子结构有三种可能, B是A左子树的子结构,B是A右子树的子结构,B和A的根节点值相等,且是A的子结构。class Solut...原创 2022-03-05 15:45:27 · 138 阅读 · 0 评论 -
剑指offer 15.二进制中1的个数
解法一:n & n - 1 可以让 n 最右边的 1 变为 0 ,其余位不变。class Solution {public: int hammingWeight(uint32_t n) { int res = 0; while (n) { n &= n-1; res++; } return res; }};解法二:n & 1:若 = 1原创 2022-03-01 18:08:54 · 51 阅读 · 0 评论 -
剑指offer14 1.剪绳子
给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段(m、n都是整数,n>1并且m>1),每段绳子的长度记为 k[0],k[1]...k[m-1] 。请问 k[0]*k[1]*...*k[m-1] 可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。示例 1:输入: 2输出: 1解释: 2 = 1 + 1, 1 × 1 = 1示例2:输入: 10输出: 36解释: 10 = 3 + 3 + 4, 3 ×..原创 2022-03-01 17:09:32 · 353 阅读 · 0 评论 -
剑指offer 11.旋转数组的最小数字
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。给你一个可能存在 重复 元素值的数组 numbers ,它原来是一个升序排列的数组,并按上述情形进行了一次旋转。请返回旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一次旋转,该数组的最小值为1。示例 1:输入:[3,4,5,1,2]输出:1示例 2:输入:[2,2,2,0,1]输出:0思路:二分搜索,每次去无序的那部分数组找最小元素class Solution原创 2022-03-01 15:35:37 · 58 阅读 · 0 评论 -
剑指offer 09.用两个栈实现队列
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead操作返回 -1 )示例 1:输入:["CQueue","appendTail","deleteHead","deleteHead"][[],[3],[],[]]输出:[null,null,3,-1]示例 2:输入:["CQueue","deleteHead","appendTail",.原创 2022-03-01 14:40:26 · 61 阅读 · 0 评论 -
287.寻找重复数
给定一个包含 n + 1 个整数的数组 nums ,其数字都在 [1, n] 范围内(包括 1 和 n),可知至少存在一个重复的整数。假设 nums 只有 一个重复的整数 ,返回 这个重复的数 。你设计的解决方案必须 不修改 数组 nums 且只用常量级 O(1) 的额外空间。示例 1:输入:nums = [1,3,4,2,2]输出:2示例 2:输入:nums = [3,1,3,4,2]输出:3思路:这道题可以抽象成链表,然后利用快慢指针寻找链表环的入口思想来做。.原创 2022-02-24 15:18:02 · 816 阅读 · 0 评论 -
279.完全平方数
给你一个整数 n ,返回 和为 n 的完全平方数的最少数量 。完全平方数 是一个整数,其值等于另一个整数的平方;换句话说,其值等于一个整数自乘的积。例如,1、4、9 和 16 都是完全平方数,而 3 和 11 不是。示例1:输入:n = 12输出:3解释:12 = 4 + 4 + 4示例 2:输入:n = 13输出:2解释:13 = 4 + 9思路:动态规划:dp[i]记录和为i的完全平方数最小数量,内层循环表示的是状态转移方程。class Solution ..原创 2022-02-24 14:13:43 · 502 阅读 · 0 评论 -
238.除自身以外数组的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。请不要使用除法,且在 O(n) 时间复杂度内完成此题。示例 1:输入: nums = [1,2,3,4]输出: [24,12,8,6]示例 2:输入: nums = [-1,1,0,-3,3]输出: [0,0,9,0,0]思路:分两次原创 2022-02-23 18:24:27 · 135 阅读 · 0 评论 -
236.二叉树的最近公共祖先
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”示例 1:输入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1输出:3解释:节点 5 和节点 1 的最近公共祖先是节点 3 。思路:递归左右,共分三种情况。class S原创 2022-02-23 17:32:20 · 149 阅读 · 0 评论 -
208.实现Trie(前缀树)
思路:使用多叉树记录,val代表是否是word,指针数组表示字母'a'~'z' 。注意this指针的使用。class Trie { Trie *child[26]; bool isWord;public: /** Initialize your data structure here. */ Trie() { isWord = false; for(int i=0;i<26;i++){ child[i]原创 2022-02-23 15:13:29 · 128 阅读 · 0 评论 -
207.课程表
你这个学期必须选修 numCourses 门课程,记为0到numCourses - 1 。在选修某些课程之前需要一些先修课程。 先修课程按数组prerequisites 给出,其中prerequisites[i] = [ai, bi] ,表示如果要学习课程ai 则 必须 先学习课程bi 。例如,先修课程对[0, 1] 表示:想要学习课程 0 ,你需要先完成课程 1 。请你判断是否可能完成所有课程的学习?如果可以,返回 true ;否则,返回 false 。示例 1:输入:...原创 2022-02-22 17:58:49 · 68 阅读 · 0 评论 -
200.岛屿数量
给你一个由'1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量。岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。此外,你可以假设该网格的四条边均被水包围。示例 1:输入:grid = [ ["1","1","1","1","0"], ["1","1","0","1","0"], ["1","1","0","0","0"], ["0","0","0","0","0"]]输出:1示例 2:输入:grid = [ ...原创 2022-02-22 16:17:29 · 73 阅读 · 0 评论 -
198.打家劫舍
dp[i]表示经过第i个房子的最大金额,经过一个房子有两种选择,偷或者不偷。class Solution {public: int rob(vector<int>& nums) { int n = nums.size(); if (n == 1) return nums[0]; vector<int> dp(n); dp[0] = nums[0]; dp[1] = max(num.原创 2022-02-22 15:33:25 · 503 阅读 · 0 评论 -
160.相交链表
给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。图示两个链表在节点 c1 开始相交:题目数据 保证 整个链式结构中不存在环。注意,函数返回结果后,链表必须 保持其原始结构 。思路:解决这个问题的关键是,通过某些方式,让 p1 和 p2 能够同时到达相交节点 c1。如果用两个指针 p1 和 p2 分别在两条链表上前进,我们可以让 p1 遍历完链表 A 之后开始遍历链表 B,让 p2...原创 2022-02-21 02:30:48 · 478 阅读 · 0 评论 -
152.乘积最大子数组
给你一个整数数组 nums ,请你找出数组中乘积最大的非空连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。测试用例的答案是一个 32-位 整数。子数组 是数组的连续子序列。示例 1:输入: nums = [2,3,-2,4]输出: 6解释:子数组 [2,3] 有最大乘积 6。示例 2:输入: nums = [-2,0,-1]输出: 0解释:结果不能为 2, 因为 [-2,-1] 不是子数组。思路:动态规划,需要分别记录包含当前数字的最大、最..原创 2022-02-20 23:05:30 · 336 阅读 · 0 评论 -
148.排序列表
给你链表的头结点head,请将其按 升序 排列并返回 排序后的链表 。示例 1:输入:head = [4,2,1,3]输出:[1,2,3,4]思路:最适合链表的排序方式就是归并排序,把链表从中间切开,两边分别排序再合并有序链表。操作分为三步:1.拆分(cut)2.排序(sort)3.合并(merge)class Solution {public: ListNode* sortList(ListNode* head) { return s..原创 2022-02-20 22:15:49 · 255 阅读 · 0 评论 -
142.环形列表2
给定一个链表的头节点 head,返回链表开始入环的第一个节点。如果链表无环,则返回null。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。不允许修改 链表。示例 1:输入:head = [3,2,0,-4], pos = 1...原创 2022-02-18 01:17:39 · 167 阅读 · 0 评论 -
139.单词拆分
思路:## 动态规划,背包问题单词就是物品,字符串s就是背包,单词能否组成字符串s,就是问物品能不能把背包装满。1. 确定dp数组以及下标的含义dp[i] : 字符串长度为i的话,dp[i]为true,表示可以拆分为一个或多个在字典中出现的单词。2. 确定递推公式如果确定dp[j] 是true,且 [j, i] 这个区间的子串出现在字典里,那么dp[i]一定是true。(j < i )。所以递推公式是 if([j, i] 这个区间的子串出现在字典里 && d原创 2022-02-17 23:26:06 · 395 阅读 · 0 评论 -
136.只出现一次的数字
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。说明:你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?示例 1:输入: [2,2,1]输出: 1示例2:输入: [4,1,2,1,2]输出: 4思路: 交换律:a ^ b ^ c <=> a ^ c ^ b 任何数于0异或为任何数 0 ^ n => n 相同的数异或为0: n ^ n => 0 c.原创 2022-02-17 22:05:17 · 193 阅读 · 0 评论 -
128.最长连续序列
给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。请你设计并实现时间复杂度为O(n) 的算法解决此问题。示例 1:输入:nums = [100,4,200,1,3,2]输出:4解释:最长数字连续序列是 [1, 2, 3, 4]。它的长度为 4。思路:使用unordered_set记录以nums[i]开头的连续数组是否存在class Solution {public: int longestConsecutive..原创 2022-02-17 15:39:59 · 119 阅读 · 0 评论 -
105.从前序与中序序列构造二叉树
给定两个整数数组preorder 和 inorder,其中preorder 是二叉树的先序遍历, inorder是同一棵树的中序遍历,请构造二叉树并返回其根节点。示例 1:输入: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]输出: [3,9,20,null,null,15,7]思路:构造二叉树,第一件事一定是找根节点,然后想办法构造左右子树。前序遍历序列的第一个值就是根节点,然后在中序遍历序列中寻找这个值,再分左右...原创 2022-02-16 01:19:21 · 353 阅读 · 0 评论 -
102.二叉树的层序遍历
给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。示例 1:输入:root = [3,9,20,null,null,15,7]输出:[[3],[9,20],[15,7]]思路:BFS算法,使用队列。层序遍历的一般写法,通过一个 while 循环控制从上向下一层层遍历,for 循环控制每一层从左向右遍历:class Solution {public: vector<vector<int>&..原创 2022-02-13 17:54:06 · 295 阅读 · 0 评论 -
BFS算法框架
BFS问题的本质就是让你在一幅「图」中找到从起点start到终点target的最近距离// 计算从起点 start 到终点 target 的最近距离int BFS(Node start, Node target) { Queue<Node> q; // 核心数据结构 Set<Node> visited; // 避免走回头路 q.offer(start); // 将起点加入队列 visited.add(start); ...原创 2022-02-13 17:51:43 · 232 阅读 · 0 评论 -
101.对称二叉树
给你一个二叉树的根节点root, 检查它是否轴对称。示例 1:输入:root = [1,2,2,3,4,4,3]输出:trueclass Solution {public: bool isSymmetric(TreeNode* root) { if (root == nullptr) return true; return check(root->left, root->right); } bool che..原创 2022-02-13 17:01:31 · 127 阅读 · 0 评论 -
98.验证二叉搜索树
给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。有效 二叉搜索树定义如下:节点的左子树只包含 小于 当前节点的数。节点的右子树只包含 大于 当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。示例 1:输入:root = [2,1,3]输出:true做这题很容易有误区:BST 不是左小右大么,那我只要检查 root.val > root.left.val 且 root.val < root.right.val 不就行了?这样..原创 2022-02-13 16:46:44 · 144 阅读 · 0 评论 -
96.不同的二叉搜索树
给你一个整数n,求恰由n个节点组成且节点值从1到n互不相同的二叉搜索树有多少种?返回满足题意的二叉搜索树的种数。示例 1:输入:n = 3输出:5首先,上面是二叉搜索树(BST)?1、对于 BST 的每一个节点node,左子树节点的值都比node的值要小,右子树节点的值都比node的值大。2、对于 BST 的每一个节点node,它的左侧子树和右侧子树都是 BST。二叉搜索树并不算复杂,直接基于 BST 的数据结构有 AVL 树,红黑树等等,拥有了自...原创 2022-02-13 15:54:02 · 215 阅读 · 0 评论 -
二叉树遍历框架
前序遍历:class Solution {public: void traversal(TreeNode* cur, vector<int>& vec) { if (cur == NULL) return; vec.push_back(cur->val); // 中 traversal(cur->left, vec); // 左 traversal(cur->right, vec);原创 2022-02-13 15:02:45 · 141 阅读 · 0 评论 -
79.单词搜索
给定一个m x n 二维字符网格board 和一个字符串单词word 。如果word 存在于网格中,返回 true ;否则,返回 false 。单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。示例 1:输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "ABCCED"输出:true...原创 2022-02-12 17:54:07 · 172 阅读 · 0 评论 -
78.子集
给你一个整数数组nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。示例 1:输入:nums = [1,2,3]输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]示例 2:输入:nums = [0]输出:[[],[0]]思路:回溯算法注意收集子集要放在终止条件的上面,否则会漏掉自己!class Solution {private: ..原创 2022-02-12 16:38:33 · 66 阅读 · 0 评论 -
75.颜色分类
给定一个包含红色、白色和蓝色、共 n 个元素的数组 nums ,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。必须在不使用库的sort函数的情况下解决这个问题。示例 1:输入:nums = [2,0,2,1,1,0]输出:[0,0,1,1,2,2]示例 2:输入:nums = [2,0,1]输出:[0,1,2]思路:双指针,p0用来交换0,p2用来交换2。注意细节:交换2时不能只原创 2022-02-12 15:53:07 · 55 阅读 · 0 评论 -
70.爬楼梯
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?示例 1:输入:n = 2输出:2解释:有两种方法可以爬到楼顶。1. 1 阶 + 1 阶2. 2 阶示例 2:输入:n = 3输出:3解释:有三种方法可以爬到楼顶。1. 1 阶 + 1 阶 + 1 阶2. 1 阶 + 2 阶3. 2 阶 + 1 阶思路:这题很像斐波那契数列:爬到第n级台阶的方法个数等于爬到n - 1的方法个数和爬到n ...原创 2022-02-12 15:11:40 · 317 阅读 · 0 评论 -
62.不同路径
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。问总共有多少条不同的路径?示例 1:输入:m = 3, n = 7输出:28思路:动态规划,用dp[i][j]表示从[0][0]走到[i][j]有多少条不同的路径,注意如何初始dp数组以及状态转移方程。class Solution {public: int uniq.原创 2022-02-12 14:27:02 · 243 阅读 · 0 评论 -
56.合并区间
以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。示例 1:输入:intervals = [[1,3],[2,6],[8,10],[15,18]]输出:[[1,6],[8,10],[15,18]]解释:区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].示例2:输入:intervals = [[1,4]...原创 2022-02-11 23:34:45 · 88 阅读 · 0 评论 -
55.跳跃游戏
给定一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个下标。示例 1:输入:nums = [2,3,1,1,4]输出:true解释:可以先跳 1 步,从下标 0 到达下标 1, 然后再从下标 1 跳 3 步到达最后一个下标。示例2:输入:nums = [3,2,1,0,4]输出:false解释:无论怎样,总会到达下标为 3 的位置。但该下标的最大跳跃长度是 0 , 所以永远不可能到达最.原创 2022-02-11 16:04:50 · 2676 阅读 · 0 评论 -
53.最大子数组和
给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。子数组 是数组中的一个连续部分。示例 1:输入:nums = [-2,1,-3,4,-1,2,1,-5,4]输出:6解释:连续子数组[4,-1,2,1] 的和最大,为6 。思路:利用数学归纳法,用dp[i]推出dp[i+1]吗。由于子数组一定是连续的,按照我们之前dp数组定义,并不能保证nums[0..i]中的最大子数组与nums[i+1]是相邻...原创 2022-02-10 22:58:17 · 157 阅读 · 0 评论 -
49.字母异位词分组
给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。字母异位词 是由重新排列源单词的字母得到的一个新单词,所有源单词中的字母通常恰好只用一次。示例 1:输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]输出: [["bat"],["nat","tan"],["ate","eat","tea"]]思路:异位词这类问题的关键在于,你如何迅速判断两个字符串是异位词。一般的思路是对字符串进行编码(k原创 2022-02-10 20:39:27 · 275 阅读 · 0 评论 -
48.旋转图像
给定一个 n × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。示例 1:输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]输出:[[7,4,1],[8,5,2],[9,6,3]]思路我们可以先将n x n矩阵matrix按照左上到右下的对角线进行镜像对称:然后再对矩阵的每一行进行反转:发现结果就是...原创 2022-02-10 20:18:04 · 327 阅读 · 0 评论