【C语言】每日一题(除自身以外数组的乘积)

添加链接描述,链接奉上

方法:

暴力循环:

暴力循换真的是差生法宝,简单好懂,就是不实用,大多数的题目都会超过时间限制(无奈)

思路:

1.写一个除自身的数组乘积函数

2.利用for循环遍历数组,i作为循环变量,当遍历到i时,就求出除i以外的数组乘积

3.放入返回数组中

代码实现:

c 复制代码
static int arr[100000];
 int mul_self(int* nums, int numsSize,int i)
 //编写一个除自身的数组乘积函数
 {
    int mul=1;
    for(int j=0;j<numsSize;j++)
    {
        if(j!=i)
        mul*=nums[j];
    }
    return mul;
 }
int* productExceptSelf(int* nums, int numsSize, int* returnSize)
{
    *returnSize=numsSize;
    int n=0;
    for(int i=0;i<numsSize;i++)
    //循环遍历,求出每个除i外数组的乘积
    {
        arr[n++]=mul_self(nums,numsSize,i);
    }
    return arr;
}

但是此方法局限大,时间超出限制。

前缀积×后缀积(分组):

思路:

根据题目提示,利用前缀积×后缀积即可得到答案,那么问题就演化为求前缀积与后缀积

创建两个数组,一个用来存放前缀积,另一个存放后缀积。

最后循环,将两者相乘,得到除了nums[i]外的数组乘积

代码实现:

c 复制代码
static int ans[100000];

int* productExceptSelf(int* nums, int numsSize, int* returnSize)
{

    int lsum[numsSize];//创建数组
    int rsum[numsSize];
    lsum[0]=1;//将边界赋值为1
    rsum[numsSize-1]=1;
    for(int i = 1;i < numsSize; i++)//求前缀积
    {
        lsum[i]=lsum[i-1]*nums[i-1];
    }
    for(int i = numsSize-2;i >= 0;i--)//求后缀积
    {
        rsum[i]=rsum[i+1]*nums[i+1];
    }
    for(int i = 0;i<numsSize;i++)//求结果数组
    {
        ans[i]=lsum[i]*rsum[i];
    }
    *returnSize=numsSize;
    return ans;
   
}

欢迎纠错与讨论哦

相关推荐
yi01113 小时前
LeetCode 219:存在重复元素 II——哈希表记录“最近一次出现的位置”
数据结构·人工智能·笔记·python·算法·leetcode·哈希表
Escalating_xu15 小时前
【C 语言】数据在内存中的存储:补码、大小端、整型陷阱与 IEEE 754 全解析
java·c语言·网络
灯澜忆梦15 小时前
【面向对象编程C++】| 基础语法
java·c++·算法
小蒋观天下15 小时前
专项方案:大场景港口AI安防、多干扰环境下的算法调优与落地实操
人工智能·深度学习·算法·安全·机器学习·计算机视觉·ai大模型
Evand J16 小时前
【电机滤波例程5】渐消因子自适应扩展卡尔曼滤波(EKF),MATLAB。PMSM负载突变下的状态估计。附下载链接
算法·matlab
H.莓飛16 小时前
【数据结构】二叉树_OJ题
linux·开发语言·数据结构·算法
好想像大佬一样能够ak所有17 小时前
Leetcode35.搜索插入位置
数据结构·算法·leetcode
aqiu11111117 小时前
【C++算法打怪专栏】LeetCode 165. 比较版本号(双指针与字符串流法)
c++·算法·leetcode
黄金龙PLUS17 小时前
如何基于置换算法来设计对称加密算法
算法·网络安全·密码学·哈希算法·同态加密
不会就选b17 小时前
算法日常・每日刷题--<动态规划>14
算法