每日算法(第三十二期)

先来回顾一下上期的问题及答案:

「括号生成」(Generate Parentheses)。

题目描述:

给定一个整数 n,生成所有由 n 对括号组成的有效括号组合。

示例:

输入:n = 3输出:["((()))","(()())","(())()","()(())","()()()"]

提示:

  • 使用回溯算法可以解决该问题。

  • 回溯算法可以通过递归实现,每次递归时考虑两种选择:放置左括号或放置右括号。

  • 在递归过程中,需要维护当前字符串的左括号数量 left 和右括号数量 right,以及生成的结果数组 res

  • 递归结束的条件是 leftright 都等于 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

  • 递归结束的条件是 leftright 都等于 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分钟来学习与思考,在千变万化,类库层出不穷的今天,不要等到找工作时才狂刷题,提倡每日学习。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值