IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> C语言题解——除自身以外数组的乘积(力扣 第238题) -> 正文阅读

[数据结构与算法]C语言题解——除自身以外数组的乘积(力扣 第238题)

🍓🫐🍅本文已收录至:C语言题解系列_Yohifo的博客-CSDN博客

更多题解在此专栏中!


目录

🍉前言

🍉正文

🍍空间开辟

🍌关于题目中给定的变量

🍌malloc 函数

🍌具体代码实现

🍍计算左积?

🍌获取

🍌存入

🍌变化

🍍计算右积&&计算最终值

🍌计算右积

🍌计算最终值?

🍍效果?

🍍源码

🍍关于?

🍉总结


🍉前言

? 这是力扣题库中的一个中等难题,说是存在一个整型数组,求出各元素位上除此数外其他元素的乘积,比如存在数组[1,2,3,4],按照题目应该该输出[24,12,8,6],我们的解题思想为:求出各元素的左积和右积(当然不包含自己),然后将左积与右积相乘,就可以得到目标积数,拿上面的例子来说,下标0的左积为1(默认数组外为1),右积为24,相乘得到目标积24,其他元素也是依次类推。下面来看看具体讲解吧:


🍉正文

? 前面提到过,我们需要得到左积与右积,已知第一个元素的左积为1,最后一个元素的右积也为1,随着元素的变化,积数也会发生变化,因此我们可以以此作为突破点,当然我们要先创建一个数组,这里我们用指针来代替(动态内存开辟,得到一片连续空间)。

🍍空间开辟

? 我们会用到malloc函数进行动态内存开辟,这样无论它传过来多大的数组,我们都可以得到足够的空间(因为要返回这片空间,所以我们不进行内存释放)

🍌关于题目中给定的变量

  • *nums 就是指向原数组的指针,可以通过它的偏移访问到原数组中不同的元素
  • numsSize 是原数组的长度(个数)
  • *returnSize 是我们目标数组的长度指针,因为0也会放入目标数组中,因此我们的两个数组长度都是一样的,这里直接赋值即可

🍌malloc 函数

? 这是C语言中的一个库函数,作用就是在堆区上开辟一块空间供我们使用,为了函数的普适性,malloc 的返回类型是空指针(需要我们根据需要进行转换),空间大小也是根据我们的需要进行设置,比如我们需要10个 int 类型数据的空间,也就是40字节大小,我们需要在malloc中写成sizeof(int) * 10,即4 * 10 = 40,这是官方规定的标准写法。

malloc函数的相关标准

?当然有开辟就会有释放,我们在使用完 malloc 后,一般会使用它的孪生兄弟 free 帮忙释放申请的空间,指向那块空间的指针也会被置空,防止出现内存泄漏和野指针。

free函数的相关标准

? malloc 一般和 free 搭配使用,但是因为本题是接口型,而且没有把目标数组的地址传过来,因此我们不能对空间进行释放,不然程序就会运行错误(已测试),但在日常使用中不能忘记。

🍌具体代码实现

代码没有多少,就是赋值、开辟、判断

?当然我们这里需要用块空间(因为其中包含了目标数组),所有我们不对其进行释放!

🍍计算左积?

? 前面说过,我们需要求出各元素的左积与右积,第一个元素的左积为1,最后一个元素的右积也为1。因此我们求左积的过程可以分为三步:获取、存入、变化。

🍌获取

左积,顾名思义是从最左边开始求,也就是第一个元素,我们先定义一个初始积 mul为1,把它作为第一个元素的左积。

🍌存入

既然得到了左积,我们就需要把它存入目标数组中(即前面开辟空间的 ptr),为了做到位置对应,我们会对其进行 i 大小的偏移

🍌变化

如果说第一步的获取是为了首尾元素,那么变化这一步就是服务于其他元素,因为是累乘,需要用到前一个左积值。

?好了,现在我们已经得到各元素对应的左积值了,下面进行下一步同时也是最后一步(计算左积,同时把左积和右积的乘积和再次存入目标数组中即可)

🍍计算右积&&计算最终值

? 计算左积是从最左(第一个元素)开始,那么计算右积就是从最右(最后一个元素开始),当然我们的 for 循环中的 i 要从 numsSize - 1 处开始,当得到右积后,就可以进行左右积(左右积的位置要对应上)的乘法计算了,然后把计算值存入目标数组对应位置中。

🍌计算右积

右积的计算和左积完全一致,最后一个元素的右积值也是1,因此我们要先将mul重赋值为1,也是分为获取、存入、变化三步走,不过这次是从右往左进行计算。

🍌计算最终值?

最终值的计算很简单,无非就是两次求积值相乘,为了避免产生过多的内存浪费,我们把计算最终值集成到了计算右积的步骤中,思想为:目标数组中的左积 * 计算出的右积,然后存入数组中

🍍效果?

因为是在两个数组间的重复计算,所以占用内存和消耗时间都比较少,自然空间、时间复杂度比较优秀,下面力扣网的程序运行通过截图。

🍍源码

下面是原码展示

//力扣 23.除自身以外数组的乘积
//左右互乘法
#include<stdlib.h>
int* productExceptSelf(int* nums, int numsSize, int* returnSize) {
    *returnSize = numsSize;//返回大小就是原数组大小
    int* ptr;
    ptr = (int*)malloc(sizeof(int) * numsSize);
    if (NULL == ptr)
    {
        perror("ptr == NULL!");
        return 0;
    }
    int mul = 1;
    int i = 0;
    for (i = 0; i < numsSize; i++)
    {
        ptr[i] = mul;
        mul *= nums[i];
    }
    mul = 1;
    for (i = numsSize - 1; i >= 0; i--)
    {
        ptr[i] *= mul;
        mul *= nums[i];
    }
    return ptr;
}

🍍关于?


🍉总结?

? 回顾整个题解过程,我们进行了两次循环求数,用到了动态内存管理、数值传递等思想,力扣网给的难度评级是中等,难就难在方法比较难想到,如果不用这种方法,就需要用到很多数组,进行很多计算,而且很复杂。总的来说,这种方法属于一点就通的那种,学习就是一个不断积累的过程,慢慢学嘛,如果看不懂,就多看几遍,实在看不懂可以换篇文章嘛,总会有学懂的时候。

? 当然这只是我的一种方法而已,如果你能学到知识,那么这篇文章就值了,关于这题肯定有更好的解法供大家学习,希望大家都能找到属于自己的解法!

? 如果你觉得本文写的还不错的话,期待留下一个小小的赞👍,你的支持是我分享的最大动力!

? 如果本文有不足或错误的地方,随时欢迎指出,我会在第一时间改正!

相关文章推荐

剑指Offer 第53题:数字在升序数组中出现的次数_Yohifo的博客-CSDN博客

C语言题解——倒置字符串(剑指Offer 第58题)_Yohifo的博客-CSDN博客

C语言题解——最小公倍数的三种求法(含最大公约数)_Yohifo的博客-CSDN博客

C语言初阶——数组_Yohifo的博客-CSDN博客

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-09-04 01:36:44  更:2022-09-04 01:37:18 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 21:28:45-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码