
LeetCode
LeetCode中的算法题目逐渐更新,每道题目要力求思路新颖独特,代码清晰简单,多解法。
bwqiang
日日新。
展开
-
LeetCode 单词搜索(I、II) (C++)
1、单词搜索题目描述给定一个二维网格和一个单词,找出该单词是否存在于网格中。单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。示例:board =[ ['A','B','C','E'], ['S','F','C','S'], ['A','D','E','E']]给定 word = "ABCCED", 返回 true给定 word = "SEE", 返回 true给定 word = "原创 2020-09-23 20:04:00 · 248 阅读 · 0 评论 -
LeetCode 全排列,下一个排列,第k个排列等问题(C++)
1、全排列问题描述给定一个 没有重复 数字的序列,返回其所有可能的全排列。示例:输入: [1,2,3]输出:[ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1]]解题思路代码实现class Solution {public: void backtrack(vector<vector<int>>& res, vector<int>& nums原创 2020-09-17 20:44:08 · 460 阅读 · 0 评论 -
LeetCode 第 202 场周赛 (C++)
1、存在连续三个奇数的数组(3分)问题描述给你一个整数数组 arr,请你判断数组中是否存在连续三个元素都是奇数的情况:如果存在,请返回true ;否则,返回false 。示例 1:输入:arr = [2,6,4,1]输出:false解释:不存在连续三个元素都是奇数的情况。示例 2:输入:arr = [1,2,34,3,4,5,7,23,12]输出:true解释:存在连续三个元素都是奇数的情况,即 [5,7,23] 。提示:1 <= arr.length <= 1000原创 2020-09-10 10:12:45 · 238 阅读 · 0 评论 -
LeetCode 组合、组合总和(I ~ IV)(C++)(回溯法、图的深度优先遍历)
1、组合问题描述给定两个整数n和k,返回1 ... n 中所有可能的 k个数的组合。示例:输入: n = 4, k = 2输出:[ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4],]解题思路该题目使用 回溯(su)法也等价于树(图)的深度优先遍历算法来求解。分别定义用于存储最终结果的二维vector容器和存储每个结点的一维vector容器。二维容器用于将每次一维容器装满元素后的压入。而大小为k的一维容器用于装大小为k的个数的组原创 2020-09-10 09:52:35 · 358 阅读 · 0 评论 -
LeetCode:整理字符串(C++)
问题描述给你一个由大小写英文字母组成的字符串 s。一个整理好的字符串中,两个相邻字符 s[i] 和 s[i + 1] 不会同时满足下述条件:0 <= i <= s.length - 2s[i] 是小写字符,但 s[i + 1] 是相同的大写字符;反之亦然 。请你将字符串整理好,每次你都可以从字符串中选出满足上述条件的 两个相邻 字符并删除,直到字符串整理好为止。请返回整理好的 字符串 。题目保证在给出的约束条件下,测试样例对应的答案是唯一的。注意:空字符串也属于整理好的字符串,尽原创 2020-08-12 10:23:15 · 450 阅读 · 0 评论 -
LeetCode:找出第 N 个二进制字符串中的第 K 位(C++),python字符串操作语法
问题描述给你两个正整数 n和 k,二进制字符串 Sn 的形成规则如下:S1 = "0"当i > 1 时,Si = Si-1 + "1" + reverse(invert(Si-1))其中 + 表示串联操作,reverse(x) 返回反转x 后得到的字符串,而invert(x) 则会翻转x中的每一位(0变为1,而 1 变为0)例如,符合上述描述的序列的前 4个字符串依次是:S1 = "0"S2 = "011"S3 = "0111001"S4 = "011100110110001"请原创 2020-08-12 10:09:22 · 590 阅读 · 0 评论 -
LeetCode斐波那契数列、青蛙跳台阶、爬楼梯(C++,python)
1、斐波那契数列问题描述写一个函数,输入n ,求斐波那契(Fibonacci)数列的第n 项。斐波那契数列的定义如下:F(0) = 0, F(1) = 1F(N) = F(N - 1) + F(N - 2), 其中 N > 1.斐波那契数列由0和1开始,之后的斐波那契数就是由之前的两数相加而得出。答案需要取模1e9+7 1000000007,如计算初始结果为:1000000008,请返回 1。示例 1:输入:n = 2输出:1示例 2:输入:n = 5输出:5提示:原创 2020-09-07 10:00:17 · 457 阅读 · 0 评论 -
数据结构十大排序算法讲解:算法原理和LeetCode代码实现(C++,java)
0、排序算法导论排序的概念 数据结构中的一个重点概念就是内部排序,内部排序是指待排序列完全存放在内存中所进行的排序过程,适合不太大的元素序列。其功能是对一个数据元素集合或序列重新排列成一个按数据元素某个相知有序(递增,递减)的序列。排序的分类插入类排序:直接插入排序、希尔排序。交换类排序:冒泡排序、快速排序。选择排序:简单选择排序、堆排序。归并排序。基数排序。桶排序。计数排序。术语说明稳定的排序: 排序过程中有前后两个元素相同的点,待排序结束后,这两个相同的点的相对前后位置不原创 2020-07-22 23:29:02 · 560 阅读 · 1 评论 -
LeetCode 三角形最小路径和(C++, 动态规划)
问题描述给定一个三角形,找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点上。相邻的结点 在这里指的是 下标 与 上一层结点下标 相同或者等于 上一层结点下标 + 1的两个结点。例如,给定三角形:[ [2], [3,4], [6,5,7], [4,1,8,3]]自顶向下的最小路径和为 11(即,2 + 3 + 5 + 1 = 11)。解题思路用f[i][j]f[i][j]f[i][j]表示从三角形顶部走到位置 (i,j)(i, j)(i,j)的最小路原创 2020-07-15 11:56:14 · 465 阅读 · 0 评论 -
LeetCode 求数组和字符串数组中的交集(C++)
1、两个数组的交集问题描述给定两个数组,编写一个函数来计算它们的交集。示例 1:输入:nums1 = [1,2,2,1], nums2 = [2,2]输出:[2]示例 2:输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]输出:[9,4]说明:输出结果中的每个元素一定是唯一的。我们可以不考虑输出结果的顺序。解题思路使用C++的STL中的求两个集合的交集的函数是:set_intersection()。语法格式是:set_intersection(v原创 2020-07-13 23:45:45 · 781 阅读 · 0 评论 -
LeetCode 仅含 1 的子串数(C++)
题目描述给你一个二进制字符串 s(仅由'0'和'1'组成的字符串)。返回所有字符都为 1 的子字符串的数目。由于答案可能很大,请你将它对10^9 + 7取模后返回。示例 1:输入:s = "0110111"输出:9解释:共有 9 个子字符串仅由 '1' 组成"1" -> 5 次"11" -> 3 次"111" -> 1 次示例 2:输入:nums = [1,1,1,1]输出:6解释:数组中的每组数字都是好数对示例 3:输入:nums = [1,2,3]原创 2020-07-13 00:02:37 · 376 阅读 · 0 评论 -
LeetCode:回文数和回文字符串相关题目(C++)
1、回文数问题描述判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。示例 1:输入: 121输出: true示例 2:输入: -121输出: false解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。示例 3:输入: 10输出: false解释: 从右向左读, 为 01 。因此它不是一个回文数。代码实现class Solution {public: bool isPalindrom原创 2020-07-08 00:21:20 · 301 阅读 · 0 评论 -
LeetCode 所有蚂蚁掉下来前的最后一刻(C++)
问题描述有一块木板,长度为 n个 单位 。一些蚂蚁在木板上移动,每只蚂蚁都以 每秒一个单位 的速度移动。其中,一部分蚂蚁向 左 移动,其他蚂蚁向 右 移动。当两只向 不同 方向移动的蚂蚁在某个点相遇时,它们会同时改变移动方向并继续移动。假设更改方向不会花费任何额外时间。而当蚂蚁在某一时刻t到达木板的一端时,它立即从木板上掉下来。给你一个整数n 和两个整数数组left以及right 。两个数组分别标识向左或者向右移动的蚂蚁在t = 0 时的位置。请你返回最后一只蚂蚁从木板上掉下来的时刻。示例 1:原创 2020-07-06 22:46:25 · 411 阅读 · 0 评论 -
LeetCode 有关链表的算法题目(C++)
1、反转链表问题描述反转一个单链表。示例:输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULL代码实现/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {原创 2020-06-24 14:35:53 · 287 阅读 · 0 评论 -
LeetCode 最佳观光组合(C++)
问题描述给定正整数数组A,A[i]表示第i个观光景点的评分,并且两个景点i和j之间的距离为j - i。一对景点(i < j)组成的观光组合的得分为(A[i] + A[j] + i - j):景点的评分之和减去它们两者之间的距离。返回一对观光景点能取得的最高分。示例:输入:[8,1,5,2,6]输出:11解释:i = 0, j = 2, A[i] + A[j] + i - j = 8 + 5 + 0 - 2 = 11解题思路(1)从前向后设置双for循环思路是正确的,但是超时。(原创 2020-06-23 12:43:03 · 426 阅读 · 0 评论 -
LeetCode 第 193 场周赛(C++)
1、一维数组的动态和问题描述给你一个数组 nums 。数组「动态和」的计算公式为:runningSum[i] = sum(nums[0]…nums[i])。请返回nums 的动态和。示例 1:输入:nums = [1,2,3,4]输出:[1,3,6,10]解释:动态和计算过程为 [1, 1+2, 1+2+3, 1+2+3+4] 。提示:1 <= nums.length <= 1000-10^6 <= nums[i] <= 10^6解题思路迭代求和即可。代原创 2020-06-22 23:09:00 · 139 阅读 · 0 评论 -
LeetCode 只出现一次的数字 寻找重复数 等相关题目(C++)
1、只出现一次的数字问题描述给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。示例 1:输入: [2,2,1]输出: 1示例 2:输入: [4,1,2,1,2]输出: 4解题思路首先将序列由小到大排序,序列一定是奇数个。频率为1的数字可能出现在序列中或者是序列的最后一个位置。每两个数迭代一次,判断前者是否等于后者;如果每两个数都相等,答案肯定是最后一个数。代码实现class Solution {public: i原创 2020-06-22 23:06:58 · 477 阅读 · 0 评论 -
LeetCode 有关二叉树的算法题目(C++)
1、二叉树的前序遍历问题描述给定一个二叉树,返回它的 前序 遍历。示例:输入: [1,null,2,3] 1 \ 2 / 3 输出: [1,2,3]代码实现/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x)原创 2020-06-18 11:55:03 · 468 阅读 · 0 评论 -
LeetCode 两数之和,三数之和,最接近的三数之和,四数之和(C++)
1. 两数之和问题描述给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。解题思路使用map来存储容器中的元素和数组下标,判断target - nums[i]是否在map中,如果不在,返回{},如果在判断元素nums[i]数组下标的和nums[target - nums[i]]的数组下标是否一致,只有在不一致时才符合题意。示例:给定 nums = [2原创 2020-06-16 17:39:11 · 387 阅读 · 0 评论 -
LeetCode 第 27 场双周赛(C++)
1、通过翻转子数组使两个数组相等(3分)问题描述给你两个长度相同的整数数组 target和 arr。每一步中,你可以选择arr的任意 非空子数组 并将它翻转。你可以执行此过程任意次。如果你能让 arr变得与 target相同,返回True;否则,返回 False。示例 1:输入:target = [1,2,3,4], arr = [2,4,1,3]输出:true解释:你可以按照如下步骤使 arr 变成 target:1- 翻转子数组 [2,4,1] ,arr 变成 [1,4,2,3]2原创 2020-06-12 23:28:04 · 223 阅读 · 0 评论 -
LeetCode第 191 场周赛(C++)
1、数组中两元素的最大乘积(3分)问题描述给你一个整数数组 nums,请你选择数组的两个不同下标i和j,使 (nums[i]-1)*(nums[j]-1)取得最大值。请你计算并返回该式的最大值。示例 1:输入:nums = [3,4,5,2]输出:12解释:如果选择下标 i=1 和 j=2(下标从 0 开始),则可以获得最大值,(nums[1]-1)(nums[2]-1) = (4-1) * (5-1) = 34 = 12 。示例 2:输入:nums = [1,5,4,5]输出:1原创 2020-06-12 23:27:46 · 299 阅读 · 0 评论 -
常用的OJ关键字术语
对于经常在线编程的人来说,需要掌握OJ中出现问题的含义和简写。列表如下:简写全称中文含义OJOnline Judge在线判题系统ACAccepted通过WAWrong Answer答案错误TLETime Limit Exceed超出时间限制OLEOutput Limit Exceed超出输出限制MLEMemory Limit Exceed超出内存限制RERuntime Error运行时错误PEPresentat原创 2020-05-31 17:28:31 · 697 阅读 · 0 评论 -
LeetCode第 190 场周赛(C++)
1、检查单词是否为句中其他单词的前缀(3分)问题描述给你一个字符串sentence作为句子并指定检索词为 searchWord,其中句子由若干用 单个空格 分隔的单词组成。请你检查检索词searchWord是否为句子sentence中任意单词的前缀。如果 searchWord是某一个单词的前缀,则返回句子sentence中该单词所对应的下标(下标从1开始)。如果 searchWord是多个单词的前缀,则返回匹配的第一个单词的下标(最小下标)。如果 searchWord不是任何单词的前缀,则返回原创 2020-05-27 10:20:18 · 258 阅读 · 0 评论 -
LeetCode第 189 场周赛(C++)
1、 在既定时间做作业的学生人数(3分)问题描述给你两个整数数组startTime(开始时间)和 endTime(结束时间),并指定一个整数 queryTime 作为查询时间。已知,第i名学生在 startTime[i]时开始写作业并于endTime[i]时完成作业。请返回在查询时间 queryTime时正在做作业的学生人数。形式上,返回能够使 queryTime处于区间[startTime[i], endTime[i]](含)的学生人数。示例 1:输入:startTime = [1,2,3],原创 2020-05-21 22:22:12 · 227 阅读 · 0 评论 -
LeetCode第 189 场周赛(C++)之第二题之相关C++知识点梳理(map,vector,multimap)
LeetCode第 189 场周赛第二题简述:将一个句子中的单词按照单词字母数量的小大重新排列。vector<string> svec中的插入操作,push_back()可以直接插入一个字符串,无需每个字母逐次push_back()。vector<string> svec;string str;svec.push_back(str);map和multimap的本质就是map的关键字key只能对应唯一一个value,multimap的关键字可以对应多个value,即m原创 2020-05-18 10:54:40 · 199 阅读 · 0 评论 -
LeetCode第 188 场周赛(C++)
1、用栈操作构建数组(3分)题目描述给你一个目标数组 target和一个整数n。每次迭代,需要从 list = {1,2,3..., n}中依序读取一个数字。请使用下述操作来构建目标数组target:Push:从 list 中读取一个新元素, 并将其推入数组中。Pop:删除数组中的最后一个元素。如果目标数组构建完成,就停止读取更多元素。题目数据保证目标数组严格递增,并且只包含1到 n之间的数字。请返回构建目标数组所用的操作序列。题目数据保证答案是唯一的。示例 1:输入:target原创 2020-05-21 22:22:06 · 414 阅读 · 0 评论 -
LeetCode第 187 场周赛(C++)
1、旅行终点站(3分)题目描述给你一份旅游线路图,该线路图中的旅行线路用数组 paths表示,其中 paths[i] = [cityAi, cityBi]表示该线路将会从 cityAi直接前往 cityBi。请你找出这次旅行的终点站,即没有任何可以通往其他城市的线路的城市。题目数据保证线路图会形成一条不存在循环的线路,因此只会有一个旅行终点站。示例 1:输入:paths = [["Lon...原创 2020-05-09 22:42:29 · 299 阅读 · 0 评论 -
LeetCode第 186 场周赛(C++)
1、分割字符串的最大得分(3分)题目描述给你一个由若干 0 和 1 组成的字符串 s ,请你计算并返回将该字符串分割成两个 非空 子字符串(即 左 子字符串和 右 子字符串)所能获得的最大得分。「分割字符串的得分」为 左 子字符串中 0 的数量加上 右 子字符串中 1 的数量。示例 1:输入:s = "011101"输出:5 解释:将字符串 s 划分为两个非空子字符串的可行方案有:...原创 2020-05-09 14:51:55 · 264 阅读 · 0 评论 -
LeetCode 239 滑动窗口最大值(C++)
问题描述给定一个数组nums,有一个大小为 k的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的k个数字。滑动窗口每次只向右移动一位。返回滑动窗口中的最大值。进阶:你能在线性时间复杂度内解决此题吗?示例:输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3输出: [3,3,5,5,6,7] 解释: 滑动窗口的位置 ...原创 2020-05-03 16:25:16 · 291 阅读 · 0 评论 -
LeetCode 3. 无重复字符的最长子串
题目描述给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。示例 1:输入: "abcabcbb"输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。示例 2:输入: "bbbbb"输出: 1解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。示例 3:输入: "pwwkew"输出: 3解释: 因为无重复字符的最长子串是...原创 2020-04-21 15:36:57 · 125 阅读 · 0 评论 -
LeetCode 用动态规划解决最长上升子序列(LIS)问题(C++)
问题描述给定一个无序的整数数组,找到其中最长上升子序列的长度,序列可以不连续。示例1:输入: [10,9,2,5,3,7,101,18]输出: 4解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4。示例2:输入: [10,9,2,7,3,6,5,8,12,9,11]输出: 4解释: 最长的上升子序列是 [2,3,5,8,9,11],它的长度是 6。算法思想利用...原创 2020-03-15 15:48:09 · 463 阅读 · 0 评论 -
Leetcode 一个数组的三等分(C++实现)
问题描述给你一个整数数组 AAA,只有可以将其划分为三个和相等的非空部分时才返回 true,否则返回 false。形式上,如果可以找出索引i+1<ji+1 < ji+1<j 且满足 (A[0]+A[1]+...+A[i]==A[i+1]+A[i+2]+...+A[j−1]==A[j]+A[j−1]+...+A[A.length−1])(A[0] + A[1] + ... + ...原创 2020-03-17 16:47:57 · 1090 阅读 · 0 评论 -
LeetCode 两数之和(4种方法 C、C++ 实现)
问题描述给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。示例给定 nums=[2,7,11,15],target=9nums = [2, 7, 11, 15], target = 9nums=[2,7,11,15],target=9因为...原创 2020-03-17 20:56:57 · 396 阅读 · 0 评论 -
leetcode 数组中的各项位数的求和(C++)
问题描述给出两个 非空的 链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。您可以假设除了数字 0 之外,这两个数都不会以 0 开头。示例输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)输出:7 -> 0 -&...原创 2020-03-17 22:12:47 · 446 阅读 · 0 评论 -
leetcode 计算二叉树的直径(C++)
问题描述给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过根结点。示例给定二叉树 1 / \ 2 3 / \ 4 5 返回 3, 它的长度是路径 [4,2,1,3] 或者 [5,2,1,3]。注意:两结点之间的路径长度是以它们之间边的数目表示。解题思路本题是递...原创 2020-03-17 22:30:13 · 745 阅读 · 0 评论 -
LeetCode 反转链表(C++)
题目描述反转一个单链表。示例输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULL进阶:你可以迭代或递归地反转链表。你能否用两种方法解决这道题?解题思路本题目可以通过三种方法,递归和非递归(迭代)和 创建新数组 的方法实现。非递归:对于上面的例子,可将结点1的指针指向空,结点2的指针...原创 2020-03-18 10:43:50 · 240 阅读 · 0 评论