leecode
free1993
这个作者很懒,什么都没留下…
展开
-
149. 直线上最多的点数
题目给你一个数组 points ,其中 points[i] = [xi, yi] 表示 X-Y 平面上的一个点。求最多有多少个点在同一条直线上。思路暴搜代码class Solution {public: int maxPoints(vector<vector<int>>& points) { int n = points.size(); if(n < 3) return n; int maxx = 0原创 2021-06-24 15:43:25 · 51 阅读 · 0 评论 -
剑指 Offer 34. 二叉树中和为某一值的路径
题目输入一棵二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径。从树的根节点开始往下一直到叶节点所经过的节点形成一条路径。示例代码class Solution {public: int target; vector<vector<int>> ans; void getPath(TreeNode * cur, vector<int> path, int curSum){ if(cur == NULL) retu原创 2021-06-23 17:08:49 · 59 阅读 · 0 评论 -
2021-06-22
题目给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。思路典型的dp代码class Solution {public: int translateNum(int num) { string str = to_string(num); int n = str.size();原创 2021-06-22 20:27:47 · 45 阅读 · 0 评论 -
剑指 Offer 55 - II. 平衡二叉树
题目输入一棵二叉树的根节点,判断该树是不是平衡二叉树。如果某二叉树中任意节点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {}原创 2021-06-22 20:07:50 · 48 阅读 · 0 评论 -
剑指 Offer 28. 对称的二叉树
题目思路如果对称,对于一个节点来说,假设这个节点非空,那么必须满足:cur->left和cur->right首先数值相同cur->left->left和cur->right->right相同cur->left->right和cur->right->left相同代码/** * Definition for a binary tree node. * struct TreeNode { * int val; *原创 2021-06-22 19:42:26 · 48 阅读 · 0 评论 -
剑指 Offer 27. 二叉树的镜像
题目请完成一个函数,输入一个二叉树,该函数输出它的镜像。思路就是交换每个节点的左右节点的指针指向。/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class原创 2021-06-22 19:10:29 · 48 阅读 · 0 评论 -
剑指 Offer 55 - I. 二叉树的深度
题目输入一棵二叉树的根节点,求该树的深度。从根节点到叶节点依次经过的节点(含根、叶节点)形成树的一条路径,最长路径的长度为树的深度。代码/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {原创 2021-06-22 17:56:02 · 41 阅读 · 0 评论 -
leecode.从上到下打印二叉树系列
从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行。代码/** * 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 {原创 2021-06-22 17:36:51 · 66 阅读 · 0 评论 -
剑指 Offer 38. 字符串的排列
题目输入一个字符串,打印出该字符串中字符的所有排列。你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。示例一输入:s = “abc”输出:[“abc”,“acb”,“bac”,“bca”,“cab”,“cba”]代码class Solution {public: int n; vector<string> ans; void DFS(int cur, string str, vector<bool> & vis, string原创 2021-06-22 17:20:42 · 51 阅读 · 0 评论 -
剑指 Offer 54. 二叉搜索树的第k大节点
题目给定一棵二叉搜索树,请找出其中第k大的节点。示例思路中序遍历代码/** * 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 {pu原创 2021-06-21 16:30:20 · 60 阅读 · 0 评论 -
剑指 Offer 58 - I. 翻转单词顺序
题目输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student. “,则输出"student. a am I”。示例一输入: “the sky is blue”输出: “blue is sky the”代码class Solution {public: string reverseWords(string s) { int n = s.size(); int l =原创 2021-06-21 15:50:04 · 42 阅读 · 0 评论 -
剑指 Offer 05. 替换空格
题目请实现一个函数,把字符串 s 中的每个空格替换成"%20"。实例一输入:s = “We are happy.”输出:“We%20are%20happy.”代码class Solution {public: string replaceSpace(string s) { string a = "%20"; string ans; for(auto d : s){ if(isspace(d)){原创 2021-06-21 15:24:44 · 71 阅读 · 0 评论 -
剑指 Offer 66. 构建乘积数组
题目给定一个数组 A[0,1,…,n-1],请构建一个数组 B[0,1,…,n-1],其中 B[i] 的值是数组 A 中除了下标 i 以外的元素的积, 即 B[i]=A[0]×A[1]×…×A[i-1]×A[i+1]×…×A[n-1]。不能使用除法。思路用两个dp数组记录,第一个dp记录从头的连乘,第二个dp记录从后面的连乘。代码class Solution {public: vector<int> constructArr(vector<int>& a)原创 2021-06-21 15:13:15 · 58 阅读 · 0 评论 -
剑指 Offer 44. 数字序列中某一位的数字
题目数字以0123456789101112131415…的格式序列化到一个字符序列中。在这个序列中,第5位(从下标0开始计数)是5,第13位是1,第19位是4,等等。请写一个函数,求任意第n位对应的数字。思路归纳数学规律的题目从1-9有9个数字,每个数字1位从10-99有90个数字,每个数字2位。。。代码typedef long long ll;class Solution {public: int findNthDigit(int n) { int bit原创 2021-06-21 12:29:13 · 41 阅读 · 0 评论 -
剑指 Offer 09. 用两个栈实现队列
题目用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )示例一输入:[“CQueue”,“appendTail”,“deleteHead”,“deleteHead”][[],[3],[],[]]输出:[null,null,3,-1]代码class CQueue {public: stack<int> s原创 2021-06-21 12:05:26 · 49 阅读 · 0 评论 -
剑指 Offer 61. 扑克牌中的顺子
从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,A为1,J为11,Q为12,K为13,而大、小王为 0 ,可以看成任意数字。A 不能视为 14。代码class Solution {public: bool isStraight(vector<int>& nums) { bool vis[14]; for(int i = 0;i < 14;i++) vis[i] = false; i原创 2021-06-20 18:06:21 · 47 阅读 · 0 评论 -
剑指 Offer 48. 最长不含重复字符的子字符串
题目请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度示例一输入: “abcabcbb”输出: 3解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。思路用一个hash来存储已经访问过得字母,然后使用双向指针来记录此时的右边界和左边界。本质上就是求两个相同字母之间的距离的最大值。代码class Solution {public: int lengthOfLongestSubstring(string s) { int n =原创 2021-06-20 14:45:39 · 54 阅读 · 0 评论 -
剑指 Offer 43. 1~n 整数中 1 出现的次数
题目输入一个整数 n ,求1~n这n个整数的十进制表示中1出现的次数。例如,输入12,1~12这些整数中包含1 的数字有1、10、11和12,1一共出现了5次。思路分析统计每一位出现1的次数,累加。对于数据12来说,当个位是2,我们要统计小于等于12的个位数上出现1的个数,01和11两个。若为10,只会有01.若为11,有11和01.代码typedef long long ll;class Solution {public: int countDigitOne(int n)原创 2021-06-20 13:23:25 · 49 阅读 · 0 评论 -
剑指 Offer 63. 股票的最大利润
题目假设把某股票的价格按照时间先后顺序存储在数组中,请问买卖该股票一次可能获得的最大利润是多少?思路分析因为数据限制所以必须采用O(n)的复杂度。因此有点单调栈的感觉,就是每次找左边的最小值。代码class Solution {public: int maxProfit(vector<int>& prices) { int n = prices.size(); if(n < 2) return 0; int l =原创 2021-06-16 20:36:42 · 40 阅读 · 0 评论 -
剑指offer07.重构二叉树
题目描述输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如,给出前序遍历 preorder = [3,9,20,15,7]中序遍历 inorder = [9,3,15,20,7]返回如下的二叉树:限制:0 <= 节点个数 <= 5000代码class Solution {public: unordered_map<int, int> index; int n; TreeNod原创 2021-06-16 17:46:45 · 44 阅读 · 0 评论 -
acm分类题目
原创 2021-05-16 22:40:28 · 41 阅读 · 0 评论 -
剑指 Offer 50. 第一个只出现一次的字符
题目在字符串 s 中找出第一个只出现一次的字符。如果没有,返回一个单空格。 s 只包含小写字母。示例一s = “abaccdeff”返回 “b”s = “”返回 " "代码class Solution {public: char firstUniqChar(string s) { unordered_map<char, int> myHash; for(auto c : s){ myHash[c]++;原创 2021-03-28 15:29:28 · 50 阅读 · 0 评论 -
剑指 Offer 57. 和为s的两个数字
题目输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,则输出任意一对即可。示例一输入:nums = [2,7,11,15], target = 9输出:[2,7] 或者 [7,2]代码class Solution {public: vector<int> twoSum(vector<int>& nums, int target) { vector<int> ans;原创 2021-03-28 14:55:47 · 41 阅读 · 0 评论 -
leecode.1761. 一个图中连通三元组的最小度数
题目给你一个无向图,整数 n 表示图中节点的数目,edges 数组表示图中的边,其中 edges[i] = [ui, vi] ,表示 ui 和 vi 之间有一条无向边。一个 连通三元组 指的是 三个 节点组成的集合且这三个点之间 两两 有边。连通三元组的度数 是所有满足此条件的边的数目:一个顶点在这个三元组内,而另一个顶点不在这个三元组内。请你返回所有连通三元组中度数的 最小值 ,如果图中没有连通三元组,那么返回 -1 。示例一输入:n = 6, edges = [[1,2],[1,3],[3原创 2021-03-02 13:10:36 · 207 阅读 · 0 评论 -
leecode.23. 合并K个升序链表
题目给你一个链表数组,每个链表都已经按升序排列。请你将所有链表合并到一个升序链表中,返回合并后的链表。示例一输入:lists = [[1,4,5],[1,3,4],[2,6]]输出:[1,1,2,3,4,4,5,6]解释:链表数组如下:[1->4->5,1->3->4,2->6]将它们合并到一个有序链表中得到。1->1->2->3->4->4->5->6思路分析使用优先队列模拟小顶堆,每次取队头元素,作为原创 2021-01-05 12:16:24 · 110 阅读 · 0 评论 -
2020-12-31
题目给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。返回滑动窗口中的最大值。示例 1:输入:nums = [1,3,-1,-3,5,3,6,7], k = 3输出:[3,3,5,5,6,7]解释:滑动窗口的位置 最大值[1 3 -1] -3 5 3 6 7 31 [3 -1 -3] 5 3 6 7 31原创 2020-12-31 15:28:27 · 48 阅读 · 0 评论 -
leecode.128. 最长连续序列
题目给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度进阶:你可以设计并实现时间复杂度为 O(n) 的解决方案吗?实例一输入:nums = [100,4,200,1,3,2]输出:4解释:最长数字连续序列是 [1, 2, 3, 4]。它的长度为 4。思路分析我们使用一个set作为额外的存储,每次统计数字。代码class Solution {public: int longestConsecutive(vector<int原创 2020-12-31 14:21:35 · 139 阅读 · 1 评论 -
剑指 Offer 57 - II. 和为s的连续正数序列
题目输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。示例一输入:target = 9输出:[[2,3,4],[4,5]]思路用双端队列维护一个连续的窗口,窗口代表了连续的子序列。代码class Solution {public: vector<vector<int>> findContinuousSequence(int target) {原创 2021-03-22 18:13:14 · 36 阅读 · 0 评论 -
剑指 Offer 39. 数组中出现次数超过一半的数字
题目数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。你可以假设数组是非空的,并且给定的数组总是存在多数元素。示例一输入: [1, 2, 3, 2, 2, 2, 5, 4, 2]输出: 2思路一找众数。用一个map<int, int>,前面存数字的数值,后面存出现的次数,这样可以统计出来出现了多少次。需要开一个O(n)的空间,时间复杂度需要遍历整个数组。O(n)思路二排序。排序结束后的数组的中间数字是众数。排序快的基本上是O(nlogn)的时间复杂度思路原创 2021-03-22 14:28:58 · 38 阅读 · 0 评论 -
剑指 Offer 03. 数组中重复的数字
题目找出数组中重复的数字。在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。示例一输入:[2, 3, 1, 0, 2, 5, 3]输出:2 或 3思路因为这道题目数据范围是0~n-1,那么我们利用原数组进行存储。对于下标为i的数字来说,其应该对应的数组num[i]应该等于i。因此,当不满足上面的条件,我们把nums[nums[i]]和nums[i]进行比原创 2021-03-22 13:54:52 · 30 阅读 · 0 评论 -
最小的k个数
题目输入整数数组 arr ,找出其中最小的 k 个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。示例一输入:arr = [3,2,1], k = 2输出:[1,2] 或者 [2,1]思路一堆排序,使用优先队列维护一个大顶堆,每次保证堆的大小是k代码class Solution {public: vector<int> getLeastNumbers(vector<int>& arr, int k) {原创 2021-03-17 11:41:43 · 51 阅读 · 0 评论 -
0~n-1中缺失的数字
题目一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n-1之内。在范围0~n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字。代码class Solution {public: int missingNumber(vector<int>& nums) { int ans = 0; for(int i = 0;i < nums.size();i++){ if(nums[原创 2021-03-16 19:37:00 · 59 阅读 · 0 评论 -
leecode.1748. 唯一元素的和
题目给你一个整数数组 nums 。数组中唯一元素是那些只出现 恰好一次 的元素。请你返回 nums 中唯一元素的 和 。代码class Solution {public: int sumOfUnique(vector<int>& nums) { vector<int> ans(101, 0); int cnt = 0; for(auto d : nums) ans[d]++; for(int i原创 2021-03-04 16:53:44 · 76 阅读 · 1 评论 -
leecode.1732. 找到最高海拔
题目有一个自行车手打算进行一场公路骑行,这条路线总共由 n + 1 个不同海拔的点组成。自行车手从海拔为 0 的点 0 开始骑行。给你一个长度为 n 的整数数组 gain ,其中 gain[i] 是点 i 和点 i + 1 的 净海拔高度差(0 <= i < n)。请你返回 最高点的海拔 。代码class Solution {public: int largestAltitude(vector<int>& gain) { int ans =原创 2021-03-04 16:13:54 · 75 阅读 · 1 评论 -
leecode.1753. 移除石子的最大得分
题目你正在玩一个单人游戏,面前放置着大小分别为 a、b 和 c 的 三堆 石子。每回合你都要从两个 不同的非空堆 中取出一颗石子,并在得分上加 1 分。当存在 两个或更多 的空堆时,游戏停止。给你三个整数 a 、b 和 c ,返回可以得到的 最大分数 。示例1输入:a = 2, b = 4, c = 6输出:6解释:石子起始状态是 (2, 4, 6) ,最优的一组操作是:从第一和第三堆取,石子状态现在是 (1, 4, 5)从第一和第三堆取,石子状态现在是 (0,原创 2021-03-02 19:04:59 · 287 阅读 · 0 评论 -
leecode.1752. 检查数组是否经排序和轮转得到
题目给你一个数组 nums 。nums 的源数组中,所有元素与 nums 相同,但按非递减顺序排列。如果 nums 能够由源数组轮转若干位置(包括 0 个位置)得到,则返回 true ;否则,返回 false 。源数组中可能存在 重复项 。注意:我们称数组 A 在轮转 x 个位置后得到长度相同的数组 B ,当它们满足 A[i] == B[(i+x) % A.length] ,其中 % 为取余运算。示例一输入:nums = [3,4,5,1,2]输出:true解释:[1,2,3,4,5] 为有原创 2021-03-02 18:44:59 · 127 阅读 · 0 评论 -
leecode.1758. 生成交替二进制字符串的最少操作数
题目给你一个仅由字符 ‘0’ 和 ‘1’ 组成的字符串 s 。一步操作中,你可以将任一 ‘0’ 变成 ‘1’ ,或者将 ‘1’ 变成 ‘0’ 。交替字符串 定义为:如果字符串中不存在相邻两个字符相等的情况,那么该字符串就是交替字符串。例如,字符串 “010” 是交替字符串,而字符串 “0100” 不是。返回使 s 变成 交替字符串 所需的 最少 操作数。示例一输入:s = “0100”输出:1解释:如果将最后一个字符变为 ‘1’ ,s 就变成 “0101” ,即符合交替字符串定义。代码cl原创 2021-03-01 19:29:54 · 308 阅读 · 0 评论 -
leecode.1769. 移动所有球到每个盒子所需的最小操作数
题目有 n 个盒子。给你一个长度为 n 的二进制字符串 boxes ,其中 boxes[i] 的值为 ‘0’ 表示第 i 个盒子是 空 的,而 boxes[i] 的值为 ‘1’ 表示盒子里有 一个 小球。在一步操作中,你可以将 一个 小球从某个盒子移动到一个与之相邻的盒子中。第 i 个盒子和第 j 个盒子相邻需满足 abs(i - j) == 1 。注意,操作执行后,某些盒子中可能会存在不止一个小球。返回一个长度为 n 的数组 answer ,其中 answer[i] 是将所有小球移动到第 i 个盒子原创 2021-03-01 15:26:56 · 74 阅读 · 0 评论 -
leecode.1768. 交替合并字符串
题目给你两个字符串 word1 和 word2 。请你从 word1 开始,通过交替添加字母来合并字符串。如果一个字符串比另一个字符串长,就将多出来的字母追加到合并后字符串的末尾。返回 合并后的字符串 。示例一输入:word1 = “abc”, word2 = “pqr”输出:“apbqcr”解释:字符串合并情况如下所示:word1: a b cword2: p q r合并后: a p b q c r代码class Solution {public:原创 2021-02-28 20:27:31 · 96 阅读 · 0 评论 -
leecode.896.单调数列
题目如果数组是单调递增或单调递减的,那么它是单调的。如果对于所有 i <= j,A[i] <= A[j],那么数组 A 是单调递增的。 如果对于所有 i <= j,A[i]> = A[j],那么数组 A 是单调递减的。当给定的数组 A 是单调数组时返回 true,否则返回 false。示例一输入:[1,2,2,3]输出:true思路分析首先先求出差分数列diff判断差分数列是否所有的数字<=0 || >=0代码class Solution {p原创 2021-02-28 12:40:01 · 69 阅读 · 0 评论