一. 简介

本文记录力扣网上涉及数组方面的编程题,主要以 C语言实现。

二. 力扣上C语言编程题:涉及数组

题目:除自身以外数组的乘积

给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。

题目数据 保证 数组 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 <= nums.length <= 105
    -30 <= nums[i] <= 30
    输入 保证 数组 answer[i] 在  32 位 整数范围内

进阶:你可以在 O(1) 额外空间复杂度内完成这个题目吗?( 出于对空间复杂度分析的目的,输出数组 不被视为 额外空间。)

解题思路:

分析题目:分析题目的意思,第i个元素的值为其前面所有元素(即前缀元素)的乘积与 其后面的元素(即后缀元素)的乘积。

初步思路:

(1) 遍历数组,得到每个元素的所有前缀元素的乘积;

(2) 再遍历一遍数组,得到每个元素的所有后缀元素的乘积(从数组后往前计算);

(3) 最后再遍历一次数组,将前面两次遍历获取的前缀元素的乘积与后缀元素的乘积进行乘积计算,即可得到每个元素的值。

C语言实现如下:

#include <stdio.h>/*** Note: The returned array must be malloced, assume caller calls free().*/
int* productExceptSelf(int* nums, int numsSize, int* returnSize) {if((nums == NULL) || (numsSize <= 0)) {return NULL;}int i = 0;int* prefix_ptr = (int*)malloc(numsSize * sizeof(int));int* suffix_ptr = (int*)malloc(numsSize * sizeof(int));int* ret_ptr = (int*)malloc(numsSize * sizeof(int));prefix_ptr[0] = 1;//计算第i个元素的所有前缀元素的乘积for(i = 1; i < numsSize; i++) {prefix_ptr[i] = prefix_ptr[i-1]* nums[i-1];}//计算第i个元素的所有后缀元素的乘积suffix_ptr[numsSize-1] = 1;for(i = 1; i < numsSize; i++) {suffix_ptr[numsSize-i-1] = suffix_ptr[numsSize-i] * nums[numsSize-i];}//将前面的前缀元素的乘积与 后缀元素的乘积进行乘积计算for(i = 0; i < numsSize; i++) {ret_ptr[i] = prefix_ptr[i] * suffix_ptr[i];} *returnSize = numsSize;free(prefix_ptr);prefix_ptr = NULL;free(suffix_ptr);suffix_ptr = NULL;return ret_ptr;  
}

可以看出,实现方法的时间复杂度为 O(n), 空间复杂度为 O(n)。满足基本要求。

进阶解题方法

上面基础解题方法中,因为我们开辟了三个内存空间,(由于题目说返回空间不算)那么空间复杂度是 O(n)。根据题目最后进阶要求,空间复杂度要控制在 O(1)。

接下来就要对上述代码进行优化了,降低空间复杂度,也就是说只能开辟返回的buf,其他开辟空间的操作要优化掉。

解题思路:

1. 将上面三个缓存改为使用一个缓存,也就是只申请返回数据的缓存;

2. 将上面三个步骤在一次遍历数组过程中完成;

具体实现方法:

1. 首先,申请一段numsSize大小的缓存,所有元素初始化为1(因为1与任何值的乘积都为任何值,不会产生任何影响);

2. 遍历一次数组,求前缀元素乘积,后缀元素乘积,计算前缀元素乘积与后缀元素乘积的乘积,这三步同时完成;

计算第i个元素的 所有前缀元素的乘积,然后计算其所有后缀元素的乘积;将前缀乘积值计算乘积,再将后缀乘积值计算 乘积;

C语言实现如下:

#include <stdio.h>/*** Note: The returned array must be malloced, assume caller calls free().*/
int* productExceptSelf(int* nums, int numsSize, int* returnSize) {if((nums == NULL) || (numsSize <= 0)) {return NULL;}int i = 0;int * ret_ptr = (int*)malloc(numsSize * sizeof(int));//首先将数组元素初始化为 1for(i = 0; i < numsSize; i++) {ret_ptr[i] = 1;}int prefix = 1;int suffix = 1;for(i = 1; i < numsSize; i++) {//计算第i个元素的所有前缀元素的乘积prefix *= nums[i-1];//计算第i个元素的所有后缀元素的乘积//注意:计算后缀元素乘积时需要从后往前计算suffix *= nums[numsSize-i];//每一轮循环将元素的前缀元素乘积计算ret_ptr[i] *= prefix;//每一轮循环将元素的后缀元素乘积计算ret_ptr[numsSize-i-1] *= suffix;}*returnSize = numsSize;return ret_ptr;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/87586.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/87586.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/87586.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot扩展——发送邮件!

发送邮件 在日常工作和生活中经常会用到电子邮件。例如&#xff0c;当注册一个新账户时&#xff0c;系统会自动给注册邮箱发送一封激活邮件&#xff0c;通过邮件找回密码&#xff0c;自动批量发送活动信息等。邮箱的使用基本包括这几步&#xff1a;先打开浏览器并登录邮箱&…

【html】iOS26 液态玻璃实现效果

<!DOCTYPE html> <html lang"zh"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>液体玻璃效果演示</title><style>bo…

探索算法秘境:量子随机游走算法及其在图论问题中的创新应用

目录 ​编辑 一、量子随机游走算法的起源与原理 二、量子随机游走算法在图论问题中的创新应用 三、量子随机游走算法的优势与挑战 四、结语 在算法研究的浩瀚星空中&#xff0c;总有一些领域如同遥远星系&#xff0c;闪烁着神秘而诱人的光芒。今天&#xff0c;我们将一同深…

C# 一维数组和矩形数组全解析

在编程的世界里&#xff0c;数组是一种非常重要的数据结构。今天&#xff0c;我们就来详细了解一下一维数组和矩形数组。 数组基础认知 数组实例是从 System.Array 继承类型的对象。由于它从 BCL 基类派生而来&#xff0c;所以继承了许多有用的成员&#xff1a; Rank 属性&a…

WebStorm编辑器侧边栏

目录 编辑器侧边栏行号配置行号隐藏行号 代码折叠侧边栏图标书签添加匿名书签添加助记符书签 运行和调试管理断点配置断点图标 版本控制配置Git Blame注释 编辑器侧边栏 编辑器左侧的垂直区域。当编写代码时&#xff0c;提供重要信息和操作图标。外观和行为可以根据你的喜好进…

腾讯云TCCA认证考试报名 - TDSQL数据库交付运维工程师(PostgreSQL版)

数据库交付运维工程师-腾讯云TDSQL(PostgreSQL版)认证 适合人群&#xff1a; 适合从事TDSQL(PostgreSQL版)交付、运维、售前咨询以及TDSQL(PostgreSQL版)相关项目的管理人员。 认证考试 单选*40道多选*20道 成绩查询 70分及以上通过认证&#xff0c;官网个人中心->认证考…

attn_mask 为 (1, 1) 时什么意思? 7,7又是什么意思?

在深度学习中&#xff0c;特别是在 Transformer 模型和注意力机制&#xff08;Attention Mechanism&#xff09;中&#xff0c;attn_mask&#xff08;注意力掩码&#xff09;是一个用于控制注意力计算的张量。它决定了在计算注意力分数时&#xff0c;哪些位置应该被关注&#x…

Qt联合Halcon开发二:Halcon窗口绑定Qt控件显示Hobject图像【详细图解流程】

1. 项目准备 在本项目中&#xff0c;我们将使用Qt框架与Halcon库结合&#xff0c;展示图像并进行图像处理。首先&#xff0c;确保你已经配置好Qt和Halcon的开发环境。 环境配置可查看上篇文章 2. 创建Qt界面 在Qt中&#xff0c;创建一个窗口并拖入按钮和Graphics View控件。G…

Redis 持久化机制详解:RDB、AOF 原理与面试最佳实践(AOF篇)

在上一章我们深入学习了 Redis 中重要的数据持久化机制 ——RDB&#xff08;Redis Database&#xff09;&#xff0c;了解了其通过周期性快照将数据以二进制文件形式保存到磁盘的原理&#xff0c;包括触发条件、文件结构以及优缺点等核心内容。 Redis 持久化机制详解&#xff…

【GateWay】和权限验证

【GateWay】网关详解和权限验证 一、Gateway 核心概念与架构二、路由断言&#xff08;Route Predicates&#xff09;详解三、过滤器&#xff08;Filters&#xff09;机制四、权限认证的核心理论模型五、Spring Cloud Gateway Security OAuth2 集成方案六、OAuth2.0 集成 一、…

QSqlDatabase: QSQLITE driver not loaded

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言可能的原因解决办法1. 确认 SQLite 驱动插件文件2. 拷贝插件文件到应用程序目录3. 设置插件搜索路径4. 安装 SQLite 依赖库5. 解决 QCoreApplication 实例问题 …

20250619在荣品的PRO-RK3566开发板的Android13下解决海罗光电有限公司HL070T58C-05屏在启动的时候出现白色条纹的问题【时序】

20250619在荣品的PRO-RK3566开发板的Android13下解决海罗光电有限公司HL070T58C-05屏在启动的时候出现白色条纹的问题 2025/6/19 20:39 缘起&#xff1a;荣品的PRO-RK3566开发板的Android13下&#xff0c;点亮海罗光电有限公司HL070T58C-05屏。 在启动的时候会出现花屏/白色条纹…

docker使用Volume对Nginx进行挂载

需求&#xff1a; 需要将Nginx的欢迎页面也就是index.html文件进行修改。 原始方法&#xff1a;由于docker会为每一个容器创建其对应的文件信息&#xff0c;但是创建的信息内容只有其最基础的运行信息&#xff0c;所以想要直接去访问其index.html就无法做到。 使用volume&am…

基于springboot的宠物服务预约系统

博主介绍&#xff1a;java高级开发&#xff0c;从事互联网行业六年&#xff0c;熟悉各种主流语言&#xff0c;精通java、python、php、爬虫、web开发&#xff0c;已经做了六年的毕业设计程序开发&#xff0c;开发过上千套毕业设计程序&#xff0c;没有什么华丽的语言&#xff0…

idea 2025会在用户目录创建IdeaSnapshots文件夹

推荐一个api管理测试工具 一个简单的API测试和编写文档的工具 idea 2025会在用户目录创建IdeaSnapshots文件夹 解决方案 打开 Profiler 点击 setting 参考 https://youtrack.jetbrains.com/articles/SUPPORT-A-1086/How-to-change-or-turn-off-the-IdeaSnapshots-folder-…

【Mini-F5265-OB开发板试用测评】2、PWM驱动遥控车RX2接收解码带马达驱动控制IC

手头有带转向电机和动力电机小车底盘&#xff0c;买了很久一直在吃灰。 最近查了一下小车的驱动IC是富满微的8D420L,是一款传统的RX2接收解码芯片&#xff0c;带马达驱动。 手头没有TX2发送芯片&#xff0c;所以考虑用MCU直接发送PWM直接接入RX2&#xff0c;可能可以驱动。 一…

Tcpdump网络抓包工具详解!

一、简介 tcpdump就是&#xff1a;dump the traffic on a network&#xff0c;根据使用者的定义对网络上的数据包进行截获的包分析工具。 tcpdump是一个用于截取网络分组&#xff0c;并输出分组内容的工具。凭借强大的功能和灵活的截取策略&#xff0c;使其成为类UNIX系统下用…

Spring Boot的Security安全控制——应用SpringSecurity!

应用Spring Security 前面介绍了在项目开发时为什么选择Spring Security&#xff0c;还介绍了它的原理。本节开始动手实践Spring Security的相关技术。 实战&#xff1a;Spring Security入门 现在开始搭建一个新项目&#xff0c;实践一个Spring Security的入门程序。 &…

FPGA基础 -- Verilog行为级建模之alawys语句

Verilog 中的 always 语句块&#xff0c;这是行为级建模的核心结构之一&#xff0c;在 RTL 级设计中广泛用于时序逻辑和组合逻辑的建模。 一、什么是 always 语句&#xff1f; ✅ 定义&#xff1a; always 语句用于描述可综合的硬件行为逻辑&#xff0c;表示一个**“事件驱动…

【力扣 简单 C】704. 二分查找

目录 题目 解法一&#xff1a;二分查找 题目 解法一&#xff1a;二分查找 int find(const int* nums, int size, int target) {int left 0, right size - 1;while (left < right){int mid (left right) / 2;if (nums[mid] < target)left left 1;else if (nums[m…