0

0

Typescript 编码编年史:除 Self 之外的数组的乘积

PHPz

PHPz

发布时间:2024-07-12 11:43:09

|

892人浏览过

|

来源于dev.to

转载

typescript 编码编年史:除 self 之外的数组的乘积

问题陈述:

给定一个整数数组nums,返回一个数组answer,使得answer[i]等于除nums[i]之外的nums所有元素的乘积。

任何 nums 的前缀或后缀的乘积都保证适合 32 位整数。

您必须编写一个在 o(n) 时间内运行并且不使用除法运算的算法。

示例1:

  • 输入:nums = [1,2,3,4]
  • 输出:[24,12,8,6]

示例2:

  • 输入:nums = [-1,1,0,-3,3]
  • 输出:[0,0,9,0,0]

限制条件:

  • 2
  • -30
  • 任何 nums 的前缀或后缀的乘积都保证适合 32 位整数。

跟进:

你能以 o(1) 的额外空间复杂度解决这个问题吗? (输出数组不计为空间复杂度分析的额外空间。)

初步思考过程:

为了解决这个问题,我们需要计算除当前元素之外的所有元素的乘积,而不使用除法运算。这可以通过对数组使用两次传递来完成:

  1. 计算每个元素的前缀积。
  2. 计算每个元素的后缀乘积并与前缀乘积相乘。

基本解决方案:

我们可以用两个数组来存储前缀和后缀的乘积,然后相乘得到最终的结果。

代码:

function productexceptself(nums: number[]): number[] {
    const n = nums.length;
    const prefixproducts = new array(n).fill(1);
    const suffixproducts = new array(n).fill(1);
    const result = new array(n).fill(1);

    // compute prefix products
    for (let i = 1; i < n; i++) {
        prefixproducts[i] = prefixproducts[i - 1] * nums[i - 1];
    }

    // compute suffix products
    for (let i = n - 2; i >= 0; i--) {
        suffixproducts[i] = suffixproducts[i + 1] * nums[i + 1];
    }

    // compute the result by multiplying prefix and suffix products
    for (let i = 0; i < n; i++) {
        result[i] = prefixproducts[i] * suffixproducts[i];
    }

    return result;
}

时间复杂度分析:

  • 时间复杂度: o(n),其中n是数组的长度。我们迭代数组三次。
  • 空间复杂度: o(n),用于存储前缀和后缀乘积。

限制:

基本解决方案效果很好,但需要额外的空间来存储前缀和后缀产品。

AIPAI
AIPAI

AI视频创作智能体

下载

优化方案:

我们可以通过使用输出数组首先存储前缀产品,然后就地修改它以包含后缀产品来优化解决方案以使用 o(1) 额外空间。

代码:

function productexceptselfoptimized(nums: number[]): number[] {
    const n = nums.length;
    const result = new array(n).fill(1);

    // compute prefix products in the result array
    for (let i = 1; i < n; i++) {
        result[i] = result[i - 1] * nums[i - 1];
    }

    // compute suffix products and multiply with the prefix products
    let suffixproduct = 1;
    for (let i = n - 1; i >= 0; i--) {
        result[i] = result[i] * suffixproduct;
        suffixproduct *= nums[i];
    }

    return result;
}

时间复杂度分析:

  • 时间复杂度: o(n),其中n是数组的长度。我们迭代数组两次。
  • 空间复杂度: o(1),因为我们使用输出数组来存储中间结果,并且不使用任何额外的空间。

基本解决方案的改进:

  • 优化后的解决方案通过使用输出数组作为中间结果,将空间复杂度降低到 o(1)。

边缘情况和测试:

边缘情况:

  1. 数组包含零。
  2. 数组包含负数。
  3. 数组长度是最小(2)或最大(10^5)限制。

测试用例:

console.log(productExceptSelf([1,2,3,4])); // [24,12,8,6]
console.log(productExceptSelf([-1,1,0,-3,3])); // [0,0,9,0,0]
console.log(productExceptSelf([2,2,2,2])); // [8,8,8,8]
console.log(productExceptSelf([0,0])); // [0,0]
console.log(productExceptSelf([5])); // This should not be a valid input as the minimum length is 2
console.log(productExceptSelf([1,2])); // [2, 1]

console.log(productExceptSelfOptimized([1,2,3,4])); // [24,12,8,6]
console.log(productExceptSelfOptimized([-1,1,0,-3,3])); // [0,0,9,0,0]
console.log(productExceptSelfOptimized([2,2,2,2])); // [8,8,8,8]
console.log(productExceptSelfOptimized([0,0])); // [0,0]
console.log(productExceptSelfOptimized([5])); // This should not be a valid input as the minimum length is 2
console.log(productExceptSelfOptimized([1,2])); // [2, 1]

一般解决问题的策略:

  1. 理解问题:仔细阅读问题陈述,了解要求和约束。
  2. 识别关键操作:确定需要的关键操作,例如计算前缀和后缀乘积。
  3. 优化可读性: 使用清晰简洁的逻辑,确保代码易于理解。
  4. 彻底测试: 使用各种情况(包括边缘情况)测试解决方案,以确保正确性。

识别类似问题:

  1. 前缀和数组:

    • 需要计算范围查询的前缀和的问题。
    • 示例:范围求和查询。
  2. 就地算法:

    • 需要在有限的额外空间内进行操作的问题
    • 示例:将数组向右旋转 k 步。
  3. 数组操作:

    • 需要根据具体情况修改数组的问题
    • 示例:将零移至数组末尾。

结论:

  • 使用额外空间的基本方法和优化的就地方法可以有效地解决计算除 self 之外的数组的乘积的问题。
  • 理解问题并将其分解为可管理的部分至关重要。
  • 使用清晰的逻辑并优化可读性可确保解决方案易于遵循。
  • 使用各种边缘情况进行测试可确保鲁棒性。
  • 识别问题的模式可以帮助将类似的解决方案应用于其他挑战。

通过练习此类问题和策略,您可以提高解决问题的能力,并为各种编码挑战做好更好的准备。

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
length函数用法
length函数用法

length函数用于返回指定字符串的字符数或字节数。可以用于计算字符串的长度,以便在查询和处理字符串数据时进行操作和判断。 需要注意的是length函数计算的是字符串的字符数,而不是字节数。对于多字节字符集,一个字符可能由多个字节组成。因此,length函数在计算字符串长度时会将多字节字符作为一个字符来计算。更多关于length函数的用法,大家可以阅读本专题下面的文章。

928

2023.09.19

页面置换算法
页面置换算法

页面置换算法是操作系统中用来决定在内存中哪些页面应该被换出以便为新的页面提供空间的算法。本专题为大家提供页面置换算法的相关文章,大家可以免费体验。

411

2023.08.14

C++ 设计模式与软件架构
C++ 设计模式与软件架构

本专题深入讲解 C++ 中的常见设计模式与架构优化,包括单例模式、工厂模式、观察者模式、策略模式、命令模式等,结合实际案例展示如何在 C++ 项目中应用这些模式提升代码可维护性与扩展性。通过案例分析,帮助开发者掌握 如何运用设计模式构建高质量的软件架构,提升系统的灵活性与可扩展性。

8

2026.01.30

c++ 字符串格式化
c++ 字符串格式化

本专题整合了c++字符串格式化用法、输出技巧、实践等等内容,阅读专题下面的文章了解更多详细内容。

8

2026.01.30

java 字符串格式化
java 字符串格式化

本专题整合了java如何进行字符串格式化相关教程、使用解析、方法详解等等内容。阅读专题下面的文章了解更多详细教程。

6

2026.01.30

python 字符串格式化
python 字符串格式化

本专题整合了python字符串格式化教程、实践、方法、进阶等等相关内容,阅读专题下面的文章了解更多详细操作。

1

2026.01.30

java入门学习合集
java入门学习合集

本专题整合了java入门学习指南、初学者项目实战、入门到精通等等内容,阅读专题下面的文章了解更多详细学习方法。

20

2026.01.29

java配置环境变量教程合集
java配置环境变量教程合集

本专题整合了java配置环境变量设置、步骤、安装jdk、避免冲突等等相关内容,阅读专题下面的文章了解更多详细操作。

17

2026.01.29

java成品学习网站推荐大全
java成品学习网站推荐大全

本专题整合了java成品网站、在线成品网站源码、源码入口等等相关内容,阅读专题下面的文章了解更多详细推荐内容。

18

2026.01.29

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号