22. 括号生成(一般)
22. 括号生成(一般)数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
示例:输入:n = 3输出:[ "((()))", "(()())", "(())()", "()(())", "()()()" ]
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/generate-parentheses
思路1:深搜,剪枝思路,将括号匹配从”“开始,左子树添加左括号,右子树添加右括号,不满足的子树剪枝
代码1:12345678910111213141516171819202122232425262728class Solution { public List<String> generateParenthesis(int n) { //回溯,左括号n个,右括号n个 ...
21. 合并两个有序链表/面试题25. 合并两个排序的链表(简单)
21. 合并两个有序链表/面试题25. 合并两个排序的链表(简单)将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例:输入:1->2->4, 1->3->4输出:1->1->2->3->4->4
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/merge-two-sorted-lists
思路1:这里使用递归的思路,用l3做新链表接收(也可以直接用l1或者l2做新的链表),每次比较出来新的节点,将剩下的继续递归比较,直到链表结束,时间空间复杂度都为O(m+n),当然本题也可以用迭代的方法解决
思路2:迭代思路为 我们假设 l1 元素严格比 l2元素少,我们可以将 l2 中的元素逐一插入 l1 中正确的位置。
首先,我们设定一个哨兵节点 “prehead” ,这可以在最后让我们比较容易地返回合并后的链表。我们维护一个 prev 指针,我们需要做的是调整它的 next 指针。然后,我们重复以下过程,直到 l1 或者 l2 指向了 ...
20. 有效的括号(简单,但值得多看)
20. 有效的括号(简单,但值得多看)给定一个只包括 ‘(‘,’)’,’{‘,’}’,’[‘,’]’ 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。注意空字符串可被认为是有效字符串。
示例 1:输入: “()”输出: true
示例 2:输入: “()[]{}”输出: true
示例 3:输入: “(]”输出: false
示例 4:输入: “([)]”输出: false
示例 5:输入: “{[]}”输出: true
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/valid-parentheses
思路:这里判断括号合不合法,这里需要进行以下几步,这里用栈来做,没其他好办法
遇到左括号,入栈
栈空时遇到右括号,错
遇到右括号,匹配栈顶元素,如果可以匹配为同一个,则正确
当栈全空时,未报错则正确
代码:1234567891011121314151617181920212223242526272829303132333435class Solution ...
19. 删除链表的倒数第N个节点(简单)
19. 删除链表的倒数第N个节点(简单)给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例:给定一个链表: 1->2->3->4->5, 和 n = 2.
当删除了倒数第二个节点后,链表变为 1->2->3->5.
说明:给定的 n 保证是有效的。
进阶:你能尝试使用一趟扫描实现吗?
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list
思路:双指针,一个指针提前走n步,然后两个指针一起走,直到第一个指针走到最后,第二个指针对应的就是倒数第n个了
注意:返回需要有点技巧,用一个指针的next指向head,然后返回这个指针的next,直接返回head会有问题。
代码:1234567891011121314151617181920212223242526/** * Definition for singly-linked list. * public class ListNode { * in ...
15. 三数之和(一般)
15. 三数之和(一般)给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。
注意:答案中不可以包含重复的三元组。
示例:给定数组 nums = [-1, 0, 1, 2, -1, -4],
满足要求的三元组集合为:[ [-1, 0, 1], [-1, -1, 2] ]
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/3sum
思路:排序+双指针
首先对数组进行排序,排序后固定一个数 nums[i],再使用左右指针指向 nums[i]后面的两端,数字分别为 nums[L] 和 nums[R],计算三个数的和 sum 判断是否满足为 0,满足则添加进结果集
如果 nums[i]大于 0,则三数之和必然无法等于 0,结束循环
如果 nums[i] == nums[i-1],则说明该数字重复,会导致结果重复,所以应该跳过
当 sum == 0 时,nums[L] == nums[L+1] 则会导致结果重复,应该跳 ...
10. 正则表达式匹配/面试题19. 正则表达式匹配(困难)
10. 正则表达式匹配/面试题19. 正则表达式匹配(困难)给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 ‘.’ 和 ‘*’ 的正则表达式匹配。
‘.’ 匹配任意单个字符‘*’ 匹配零个或多个前面的那一个元素所谓匹配,是要涵盖 整个 字符串 s的,而不是部分字符串。
说明:s 可能为空,且只包含从 a-z 的小写字母。p 可能为空,且只包含从 a-z 的小写字母,以及字符 . 和 *。
示例 1:输入:s = "aa"p = "a"输出: false解释: “a” 无法匹配 “aa” 整个字符串。
示例 2:输入:s = "aa"p = "a*"输出: true解释: 因为 ‘*’ 代表可以匹配零个或多个前面的那一个元素, 在这里前面的元素就是 ‘a’。因此,字符串 “aa” 可被视为 ‘a’ 重复了一次。
示例 3:输入:s = "ab"p = ".*"输出: true解释: “.“ 表示可匹配零个或多个(’‘)任意字符(’.’)。
示例 4:输入:s ...
9. 回文数(简单)
9. 回文数(简单)判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
示例 1:输入: 121输出: true
示例 2:输入: -121输出: false解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
示例 3:输入: 10输出: false解释: 从右向左读, 为 01 。因此它不是一个回文数。
进阶:你能不将整数转为字符串来解决这个问题吗?
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/palindrome-number
思路:参考第七题的解题,这里官方解答有个巧妙的地方是,判断已经反转了一半的数字,直接是将反转的数字*10与没还没反转的数/10进行比较,这个判断及其精妙
代码:1234567891011121314151617181920// 执行结果:通过// 执行用时 :16 ms, 在所有 C++ 提交中击败了76.28%的用户// 内存消耗 :8.1 MB, 在所有 C++ 提交中击败了84.42%的用户class Soluti ...
7. 整数反转(简单)
7. 整数反转(简单)给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
示例 1:输入: 123输出: 321### 示例 2:输入: -123输出: -321
示例 3:输入: 120输出: 21
注意:假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231, 231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/reverse-integer
思路:数值范围为[-2147483648,2147483647],这里我们用数值计算的方法判断溢出最好,每次取一位,加到已经反转的位数的后面。判断溢出的思路:以上界为例,当最后一位还没加进来时已经超出;或者正好和最大值去一位相等,第二种情况我们需要多判断一个个位临界条件,是否大于7.
代码1:1234567891011121314151617class Solution {public: int reverse(int x) { //主要 ...
5. 最长回文子串(较难)
5. 最长回文子串(较难)给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
示例 1:输入: "babad"输出: "bab"注意: "aba" 也是一个有效答案。
示例 2:输入: "cbbd"输出: "bb"
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/longest-palindromic-substring
思路1:暴力求解,这里会超时,时间复杂度o(n^3)
说明:暴力解法时间复杂度高,但是思路清晰、编写简单。由于编写正确性的可能性很大,可以使用暴力匹配算法检验我们编写的其它算法是否正确。优化的解法在很多时候,是基于“暴力解法”,以空间换时间得到的,因此思考清楚暴力解法,分析其缺点,很多时候能为我们打开思路。
参考代码 1:Java 代码正常运行,C++ 代码超出内存限制,Python 代码超时。
作者:liweiwei1419链接:https://leetcode-cn.co ...
3. 无重复字符的最长子串/面试题48. 最长不含重复字符的子字符串(简单)
3. 无重复字符的最长子串/面试题48. 最长不含重复字符的子字符串(简单)给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:输入: “abcabcbb”输出: 3解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
示例 2:输入: “bbbbb”输出: 1解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。
示例 3:输入: “pwwkew”输出: 3解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。 请注意,你的答案必须是 子串 的长度,”pwke” 是一个子序列,不是子串。
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters
思路1动态规划思路
dp[j] 代表以字符 s[j] 为结尾的 “最长不重复子字符串” 的长度。
设字符 s[j] 左边距离最近的相同字符为 s[i] ,即 s[i] = s[j]。
当 i < 0 ,即 s[j]左边无相同字符 ...