leetcode 100题
Leetcode 热题100题
livingsu
这个作者很懒,什么都没留下…
展开
-
leetcode 78. 子集
一、题目给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。二、解法解法一:位操作遍历0表示不取,1表示取,那么全集就是111…11,空集就是00…00,一共有2n−12^n-12n−1个元素class Solution {public: vector<vector<int>> subsets(vector<int>& nums) {原创 2021-06-07 10:07:20 · 297 阅读 · 1 评论 -
leetcode 76. 最小覆盖子串
一、题目给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 “” 。注意:如果 s 中存在这样的子串,我们保证它是唯一的答案。输入:s = “ADOBECODEBANC”, t = “ABC”输出:“BANC”二、解法思路:滑动窗口用两个指针lll,rrr构成一个滑动窗口,维护这个窗口里面的数据保证是符合答案的。过程是:首先不断右移rrr直至满足答案(扩张窗口),然后不断左移lll同时保证窗口也满足(原创 2021-06-06 11:11:08 · 244 阅读 · 0 评论 -
leetcode 56. 合并区间
一、题目以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。输入:intervals = [[1,3],[2,6],[8,10],[15,18]]输出:[[1,6],[8,10],[15,18]]解释:区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].输入:intervals = [[1,4],[4,5]]输出:原创 2021-05-31 17:31:26 · 179 阅读 · 0 评论 -
leetcode 39. 组合总和
一、题目给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的数字可以无限制重复被选取。说明:所有数字(包括 target)都是正整数。解集不能包含重复的组合。示例 1:输入:candidates = [2,3,6,7], target = 7,所求解集为:[[7],[2,2,3]]二、解法看到组合,就想到回溯法。关键在于回溯法函数,void dfs(原创 2021-05-31 11:34:59 · 92 阅读 · 1 评论 -
leetcode 34. 在排序数组中查找元素的第一个和最后一个位置
一、题目给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值 target,返回 [-1, -1]。进阶:你可以设计并实现时间复杂度为 O(log n) 的算法解决此问题吗?输入:nums = [5,7,7,8,8,10], target = 8输出:[3,4]输入:nums = [5,7,7,8,8,10], target = 6输出:[-1,-1]二、解法二分查找:寻找leftIdx(第一个原创 2021-05-31 11:08:15 · 76 阅读 · 0 评论 -
leetcode 33. 搜索旋转排序数组
一、题目整数数组 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-05-31 10:22:52 · 62 阅读 · 0 评论 -
leetcode 32. 最长有效括号
一、题目给你一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长有效(格式正确且连续)括号子串的长度。输入:s = “)()())”输出:4解释:最长有效括号子串是 “()()”二、解法思路:动态规划dp[i]dp[i]dp[i]表示以s[i]s[i]s[i]结尾的有效子串的最长长度。考察s[i]s[i]s[i]和s[i−1]s[i-1]s[i−1]:若s[i]==(s[i]==(s[i]==(,则dp[i]=0dp[i]=0dp[i]=0若s[i]==)s[i]==)s[i]==),原创 2021-05-31 00:24:55 · 73 阅读 · 0 评论 -
leetcode 31. 下一个排列
一、题目实现获取 下一个排列 的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。必须 原地 修改,只允许使用额外常数空间。输入:nums = [1,2,3]输出:[1,3,2]输入:nums = [3,2,1]输出:[1,2,3]二、解法思路:要找到一个尽可能靠右的“较小数”,和一个尽可能靠右的“较大数”,交换两者。方法:从后往前遍历,第一个满足nums[i]<nums[i+1]n原创 2021-05-30 23:08:55 · 63 阅读 · 0 评论 -
leetcode 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二、解法解法1:暴力数组排序:用一个数组保存所有链原创 2021-05-29 18:54:37 · 125 阅读 · 0 评论 -
leetcode 22. 括号生成
一、题目数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。输入:n = 3输出:["((()))","(()())","(())()","()(())","()()()"]二、解法思路:回溯法具体思想:用一个回溯函数,记录当前已经得到的组合,首先判断是否达到边界情况,然后添加组合,继续递归求解,最后回退组合。本题中,有几个关键的地方:使用字符串的长度作为边界情况判断的记录要满足有效的括号组合,需要满足以下情况:左括号数不能超过n右括号原创 2021-05-29 16:32:00 · 89 阅读 · 0 评论 -
leetcode 19. 删除链表的倒数第 N 个结点
一、题目给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。进阶:你能尝试使用一趟扫描实现吗输入:head = [1,2,3,4,5], n = 2输出:[1,2,3,5]二、解法解法1:遍历两次,第一次遍历得到链表的长度 lengthlengthlength,第二次遍历到第 length−nlength-nlength−n 个节点即可要注意删除虚拟节点dummy,避免出现内存泄漏问题(c++会出现该问题)/** * Definition for singly-原创 2021-05-29 13:15:41 · 56 阅读 · 0 评论 -
leetcode 17. 电话号码的字母组合
一、题目给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。输入:digits = “23”输出:[“ad”,“ae”,“af”,“bd”,“be”,“bf”,“cd”,“ce”,“cf”]输入:digits = “”输出:[]二、解法本题与全排列那题很类似,使用回溯法。回溯法函数原型void backtrace(vector<T>& ans,T&原创 2021-05-29 12:45:52 · 143 阅读 · 0 评论 -
leetcode 15. 三数之和
一、题目给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。注意:答案中不可以包含重复的三元组。二、解法要使答案不包含重复的三元组,思路是将nums进行排序,并且每次拿出来的元素都不能和上一次的相同。比如[-1,-1,0,1],如果第一次迭代拿出了两个-1,那么答案中就会有重复。对于三重循环 i,j,ki,j,ki,j,k ,如果固定了 iii ,随着 nums[j]num原创 2021-05-29 11:08:20 · 61 阅读 · 0 评论 -
leetcode 5. 最长回文子串
一、题目给你一个字符串 s,找到 s 中最长的回文子串。输入:s = “babad”输出:“bab”解释:“aba” 同样是符合题意的答案。二、解法思路:动态规划dp[i][j]dp[i][j]dp[i][j] 表示下标从 iii 至 jjj 的子串是否是回文串。显然 dpdpdp 是一个半三角型,因为 i>ji>ji>j 时字符串无意义。可以列出转移方程:dp[i][j]=dp[i+1][j−1]&&S[i]==S[j]dp[i][j]=d原创 2021-05-26 10:09:34 · 49 阅读 · 0 评论 -
leetcode 4. 寻找两个正序数组的中位数
一、题目给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。输入:nums1 = [1,2], nums2 = [3,4]输出:2.50000解释:合并数组 = [1,2,3,4] ,中位数 (2 + 3) / 2 = 2.5输入:nums1 = [], nums2 = [1]输出:1.00000二、解法问题实际上是求两个正序数组的第k小的数。简单的思路是双指针一个一个往后移动,时间复杂度是 O(m+n)O(原创 2021-05-26 09:16:07 · 49 阅读 · 0 评论 -
leetcode 3. 无重复字符的最长子串
一、题目给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。输入: s = "abcabcbb"输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。输入: s = "pwwkew"输出: 3解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。 请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。二、解法思路:滑动窗口滑动窗口的本质就是在暴力(双重for循环)下面进行优化,通过维护一个有序的数据结构原创 2021-04-24 21:43:48 · 39 阅读 · 0 评论 -
leetcode 2. 两数相加
题目要求示例1输入:l1 = [2,4,3], l2 = [5,6,4]输出:[7,0,8]解释:342 + 465 = 807.示例2输入:l1 = [0], l2 = [0]输出:[0]示例3输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]输出:[8,9,9,9,0,0,0,1]代码/** * Definition for singly-linked list. * struct ListNode { * int val;原创 2021-02-27 23:15:02 · 120 阅读 · 1 评论 -
leetcode 1. 两数之和
一、题目给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 的那 两个 整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。输入:nums = [2,7,11,15], target = 9输出:[0,1]解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 二、解法解法一:直接暴力枚举,时间复杂度为O(N2)O(N^2)O(N2)解法二:用原创 2021-04-24 17:00:17 · 67 阅读 · 0 评论 -
leetcode 10. 正则表达式匹配
一、题目给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 ‘.’ 和 ‘*’ 的正则表达式匹配。‘.’ 匹配任意单个字符‘*’ 匹配零个或多个前面的那一个元素所谓匹配,是要涵盖 整个 字符串 s的,而不是部分字符串。输入:s = “aa” p = “a*”输出:true解释:因为 ‘*’ 代表可以匹配零个或多个前面的那一个元素, 在这里前面的元素就是 ‘a’。因此,字符串 “aa” 可被视为 ‘a’ 重复了一次。二、解法动态规划:dp[i][j]dp[i][j]dp[i][j原创 2021-05-26 16:07:41 · 67 阅读 · 0 评论 -
leetcode 46. 全排列
一、题目给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。输入:nums = [1,2,3]输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]二、解法思路:回溯法(本质就是dfs)全排列就是要将n个数字填入n个空格中。如果我们已知前面k个空格已经填好,现在需要填一个数,那么只需要在后面n-k个数中间选一个即可。回溯的意思是,每一次选就是简单的将后面的元素和前面的元素进行交换,然后继续进行下原创 2021-05-27 10:52:50 · 92 阅读 · 1 评论