先来回顾一下上期的问题及答案:
「括号生成」(Generate Parentheses)。
题目描述:
给定一个整数 n
,生成所有由 n
对括号组成的有效括号组合。
示例:
输入:n = 3
输出:["((()))","(()())","(())()","()(())","()()()"]
提示:
使用回溯算法可以解决该问题。
回溯算法可以通过递归实现,每次递归时考虑两种选择:放置左括号或放置右括号。
在递归过程中,需要维护当前字符串的左括号数量
left
和右括号数量right
,以及生成的结果数组res
。递归结束的条件是
left
和right
都等于n
,此时得到一个有效的括号组合,将其加入结果数组中。在递归过程中,需要注意以下两个条件:
若
left
小于n
,则可以放置一个左括号,并继续递归。若
right
小于left
,则可以放置一个右括号,并继续递归。
以下是对应的 TypeScript 解答:
function generateParenthesis(n: number): string[] {
const res: string[] = [];
backtrack("", 0, 0);
return res;
function backtrack(curr: string, left: number, right: number) {
if (left === n && right === n) {
res.push(curr);
return;
}
if (left < n) {
backtrack(curr + "(", left + 1, right);
}
if (right < left) {
backtrack(curr + ")", left, right + 1);
}
}
}
解题思路:
使用回溯算法生成所有可能的有效括号组合。
在递归过程中,维护当前字符串的左括号数量
left
和右括号数量right
。递归结束的条件是
left
和right
都等于n
,此时得到一个有效的括号组合,将其加入结果数组中。在递归过程中,根据以下条件进行选择:
若
left
小于n
,则可以放置一个左括号,并继续递归。若
right
小于left
,则可以放置一个右括号,并继续递归。
时间复杂度分析:
递归的时间复杂度是 O(2^N),其中 N 是括号对数。
空间复杂度分析:
递归过程中使用的空间是 O(N),其中 N 是括号对数。
2023年6月30日
「删除有序数组中的重复项」(Remove Duplicates from Sorted Array)。
题目描述:
给你一个有序数组 nums
,请你原地删除重复出现的元素,使每个元素只出现一次,返回删除后数组的新长度。不要使用额外的数组空间,你必须在 原地 修改输入数组,并在使用 O(1) 额外空间的条件下完成。
说明:
为了符合题目要求,你需要使用「原地」修改输入数组,并在函数内部直接修改输入数组,而不是创建新的数组。
示例:
输入:nums = [1,1,2]
输出:2, nums = [1,2]
解释:函数应该返回新的长度 2,并且原数组 nums
的前两个元素被修改为 1 和 2。不需要考虑数组中超出新长度后面的元素。
提示:
数组已排序,所以重复的元素都会相邻出现。
双指针是解决此问题的有效方法。使用两个指针,一个快指针
fast
和一个慢指针slow
。初始时,快指针和慢指针都指向数组的第一个元素。
快指针每次移动一步,慢指针只在遇到不同元素时才移动一步,并将快指针指向的元素复制到慢指针的下一个位置。
遍历完整个数组后,慢指针的位置就是新数组的长度。
上面问题的答案会在第二天的公众号推文中公布,大家可以关注公众号:程序员每日三问,第一时间获得推送内容。
学习不打烊,充电加油只为遇到更好的自己,每天早上9点纯手工发布面试题(死磕自己,愉悦大家) 希望大家在这浮夸的程序员圈里保持冷静,每天坚持花20分钟来学习与思考,在千变万化,类库层出不穷的今天,不要等到找工作时才狂刷题,提倡每日学习。