每日算法(第二十一期)

先来回顾一下上期的问题及答案: 「最长公共前缀」(Longest Common Prefix)。以下是题目的描述:

编写一个函数来查找字符串数组中的最长公共前缀字符串。如果不存在公共前缀,则返回空字符串 ""。

示例 1:

输入: ["flower","flow","flight"]
输出: "fl"

示例 2:

输入: ["dog","racecar","car"]
输出: ""
解释: 输入不存在公共前缀。

说明: 所有输入只包含小写字母 a-z 。

以下是对应的JavaScript解答:

function longestCommonPrefix(strs) {
  if (strs.length === 0) {
    return "";
  }

  let prefix = strs[0];

  for (let i = 1; i < strs.length; i++) {
    while (strs[i].indexOf(prefix) !== 0) {
      prefix = prefix.substring(0, prefix.length - 1);
      if (prefix === "") {
        return "";
      }
    }
  }

  return prefix;
}

解题思路:

  • 初始化前缀 prefix 为数组的第一个字符串。

  • 从第二个字符串开始遍历数组 strs

    • 在当前字符串中不断缩小前缀 prefix 的长度,直到当前字符串以 prefix 开头。

    • 如果 prefix 缩小为空字符串,则不存在公共前缀,直接返回空字符串。

  • 遍历完成后,prefix 即为最长公共前缀。

时间复杂度分析:

  • 假设数组中共有 n 个字符串,最长公共前缀的长度为 m。在最坏情况下,需要遍历所有字符串的所有字符,时间复杂度为 O(n * m)。

空间复杂度分析:

  • 只使用了常数级别的额外空间,空间复杂度为 O(1)。

2023年6月13日

「三数之和」(3Sum)。以下是题目的描述:

给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c,使得 a + b + c = 0?找出所有满足条件且不重复的三元组。

注意:答案中不可以包含重复的三元组。

示例:

输入:nums = [-1,0,1,2,-1,-4]
输出:[[-1,-1,2],[-1,0,1]]

示例说明:

  • 应该返回所有满足题意且不重复的三元组。

  • 解集不能包含重复的三元组。

解题思路:

  • 首先对数组 nums 进行排序,以便于使用双指针的方法进行查找。

  • 遍历数组 nums,使用指针 i 从左往右选取第一个数字。

  • 在每个固定的数字 nums[i] 的基础上,使用双指针 leftright 分别指向剩余数组中的左右两端。

  • 根据三个数字的和与目标值的关系进行移动指针:

    • 如果三个数字的和等于 0,将结果添加到 result 数组中,并分别移动 leftright 指针。

    • 如果三个数字的和小于 0,移动 left 指针。

    • 如果三个数字的和大于 0,移动 right 指针。

  • 在移动指针时,需要跳过重复的数字,以避免重复的解。

  • 最终返回结果数组 result

时间复杂度分析:

  • 数组排序的时间复杂度为 O(nlogn)。

  • 双指针的移动最多需要遍历整个数组,时间复杂度为 O(n)。

  • 总体时间复杂度

为 O(nlogn + n^2),简化为 O(n^2)。

空间复杂度分析:

  • 使用了一个结果数组来存储符合条件的三元组,空间复杂度取决于结果的数量,最坏情况下为 O(n)。

上面问题的答案会在第二天的公众号推文中公布,大家可以关注公众号:程序员每日三问,第一时间获得推送内容。

学习不打烊,充电加油只为遇到更好的自己,每天早上9点纯手工发布面试题(死磕自己,愉悦大家) 希望大家在这浮夸的程序员圈里保持冷静,每天坚持花20分钟来学习与思考,在千变万化,类库层出不穷的今天,不要等到找工作时才狂刷题,提倡每日学习。

你可能感兴趣的:(算法,java,开发语言)