返回

LeetCode 力扣双周赛 65

见解分享

引言

双周赛 65 为我们带来了两道精彩的编程挑战。这些问题旨在考验你的算法思维和解决问题的能力。如果你已经摩拳擦掌,迫不及待地想要征服这些难题,那么让我们废话少说,直接开始吧!

5910. 检查两个字符串是否几乎相等

题目

给你两个长度相等的字符串 word1word2。如果可以对 word2 进行任意次替换操作,使之变成 word1,那么请你返回 true;否则,返回 false。每一次替换操作可以将 word2 中的一个字符变成 word1 中的任意字符。

示例

输入:word1 = "abcd", word2 = "bcdf"
输出:true
解释:我们可以将 'b' 替换为 'a',将 'd' 替换为 'c'
输入:word1 = "abc", word2 = "abx"
输出:false
解释:我们无法将 'x' 替换成 'c'

思路

解题的关键在于识别 word1word2 中字符的频率。我们可以使用哈希表来统计两个字符串中每个字符出现的次数。如果两个哈希表的键相同并且相应的值也相等,那么我们可以将 word2 替换成 word1

时间复杂度: O(n),其中 n 为两个字符串的长度。

5911. 找出数组中的所有子数组的和

题目

给你一个整数数组 nums。你需要返回一个数组 answer,其中 answer[i]nums 中所有子数组的和。

示例

输入:nums = [1,2,3,4]
输出:[1,3,6,10]
解释:running sum 是得到以下子数组和的总和:[1][1,2][1,2,3][1,2,3,4]
输入:nums = [1,1,1,1,1]
输出:[1,2,3,4,5]
解释:running sum 是得到以下子数组和的总和:[1][1,1][1,1,1][1,1,1,1][1,1,1,1,1]

思路

解决这个问题最直接的方法是使用循环遍历数组,并对每个子数组求和。对于长度为 n 的数组,共有 n * (n + 1) / 2 个子数组。因此,使用这种方法的时间复杂度为 O(n^2)。

我们可以利用前缀和数组来优化解法。前缀和数组的前缀和[i] 表示数组 nums 的前 i 个元素的总和。我们可以利用以下公式计算子数组的和:

子数组[i, j] 的和 = 前缀和[j] - 前缀和[i - 1]

使用前缀和数组,我们可以将时间复杂度从 O(n^2) 优化到 O(n)。

时间复杂度: O(n),其中 n 为数组 nums 的长度。

总结

LeetCode 力扣双周赛 65 是一次展示算法技能和解决问题能力的绝佳机会。通过分析和解决这些难题,我们可以加深对数据结构和算法的理解。希望本文的解析能助你顺利通过比赛,在编程的道路上再创佳绩!