C语言每日一题:8.除自身以外数组的乘积。

news2024/9/24 19:20:14

题目:

请添加图片描述
题目:

思路一:

(先不考虑题目的要求循序渐进的方法)
1.动态开辟数组,初始化数组内容为全1.
2.使用双for循环去给answer赋值。
3.在相同位置不去*=对应的下标位置的数组值,而是*=1;

int* productExceptSelf(int* nums, int numsSize, int* returnSize){
            //开辟数组
            int* answer=(int*)calloc(1,sizeof(int)*numsSize);
            for(int b=0;b<numsSize;b++)
            {
                answer[b]=1;
            }
            int n=numsSize;
            //循环遍历
            for(int i=0;i<n;i++)
            {
                for(int j=0;j<n;j++)
                {
                    if(j!=i)
                    {
                        (answer[i])*=(nums[j]);
                    }
                }
            }
            *returnSize=n;
            return answer;
}

请添加图片描述

总结:时间复杂度是O(N^2)空间复杂度 O(1)(不包括开辟的数组);
那么非常明显这个算法的时间复杂度比较高在遇到非常大的测试用例的时候就超出时间的限制。

思路二:

(假设可以使用除法)
1.求nums所有元素的乘积记录下来为sum。
2.给anser赋值只需要把这个位置的nums的值除去。
3.如果nums的这个位置是0的话不是我们计算的sum.
4.在nums中存在0,和不存在0.分两个情况讨论。
5.如果存在0的话需要重新遍历数组去求乘积的值。
6.在数组中如果有1个0存在那么这个answer只有一个nums是0的这个位置不为0,其他的位置都是0.
7.如果nums中存在两个0那么answer就全部都是0.

int* productExceptSelf(int* nums, int numsSize, int* returnSize) {
    //开辟数组
    int* answer = (int*)calloc(numsSize,sizeof(int));
    //计算乘积
    int sum = 1;
    for (int i = 0; i < numsSize; i++)
    {
        sum *= nums[i];
        answer[i] = 1;
    }
    //给answer赋值
    for (int j = 0; j < numsSize; j++)
    {
        if (sum == 0)
        {
            if (nums[j] == 0)
            {
                for (int i = 0; i < numsSize; i++)
                {
                    if (i == j)
                    {
                        continue;
                    }
                    answer[j] *= nums[i];
                }
            }
            else
            {
                answer[j] = 0;
            }

        }
        else
        {
            if (nums[j] == 0)
            {
                answer[j] = sum;
                continue;
            }
            answer[j] = (sum / nums[j]);
        }
    }

    *returnSize = numsSize;
    return answer;
}
控制台

时间复杂度:
1.nums中有0的时候F(N)N^2+N== O(N^2)==
2.nums中没有0的时候F(N)=2N O(N^2)
思路一和思路二比较的话,思路二的平均复杂度是比较底的。
运行结果是可以通过的。

请添加图片描述

思路三:

思路一和二是比较好想的方法,但是这个题目不允许使用除法。
1.给anver循环赋值从左到右依次把乘等的数值赋值到answer上。
2.从右到左把缺少的项再乘等进去。
3.answer就赋值完成了。

请添加图片描述

nt* productExceptSelf(int* nums, int numsSize, int* returnSize){
            //开辟数组
            int* answer=(int*)malloc(sizeof(int)*numsSize);
            int n=numsSize;
            //循环遍历
            int i=0;

            //给answer赋从左到右,开始位置左边没有值初始化red_left==1
            int red_left=1;
            for(i=0;i<n;i++)
            {
                answer[i]=red_left;
                red_left*=nums[i];
            }
            //给answer赋从右到左,末尾位置右边没有值初始化red_right==1
            int j=0;
            int red_right=1;
            for(j=n-1;j>=0;j--)
            {
                 answer[j]*=red_right;
                 red_right*=nums[j];   
            }
            *returnSize=n;
            return answer;
}

总结:时间复杂度O(N)

对于这个题目的前面两个方法是没有按照题目要求来写的,出现时间复杂度的问题,除法的方法是可以通过的但是他的代码的复杂度是比较高的,所以在写这样有一些关于方法和复杂度的要求的题目的时候就需要效率非常高的算法,不敢不按照题目要求去写题目,对你是没有什么好处的,测试用例和题目要求是具有关联。不按照题目要求是很可能通不过测试用例的。{关于思路三我想说这样的算法需要你去好好的观察和写过非常多的题目才可以对有一些要求的题目得心应手有自己的方法而不是去暴力求解和不按照题目要求去写题目。}

希望文章可以帮助到每一个在刷题的小伙伴!!!!!!。
希望可以你在这一方面的困惑。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Linux命令200例】lsattr用于查看文件或目录的属性

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;全栈领域新星创作者✌&#xff0c;2023年6月csdn上海赛道top4。 &#x1f3c6;本文已收录于专栏&#xff1a;Linux命令大全。 &#x1f3c6;本专栏我们会通过具体的系统的命令讲解加上鲜活的实操案例对各个命令进行深入…

测试开源C#人脸识别模块ViewFaceCore(5:质量检测和眼睛状态检测)

ViewFaceCore模块中的FaceQuality支持预测人脸质量&#xff0c;最初以为是预测人体体重&#xff0c;实际测试过程中才发现是评估人脸图片质量&#xff0c;主要调用Detect函数执行图片质量检测操作&#xff0c;其函数原型如下所示&#xff1a; //// 摘要:// 人脸质量评估///…

tf卡为什么显示0字节?tf卡显示0字节怎么恢复数据

我的TF卡现在显示字节为0&#xff0c;想要打开总是会弹出要求格式化的对话框&#xff0c;里面有我重要的数据。请问如何恢复里面的数据啊&#xff1f;急&#xff01;急&#xff01;急&#xff01; ——在日常使用中&#xff0c;我们可能将重要的数据存储在TF卡中。然而&#x…

【每天40分钟,我们一起用50天刷完 (剑指Offer)】第四十天 40/50【二叉树递归】

专注 效率 记忆 预习 笔记 复习 做题 欢迎观看我的博客&#xff0c;如有问题交流&#xff0c;欢迎评论区留言&#xff0c;一定尽快回复&#xff01;&#xff08;大家可以去看我的专栏&#xff0c;是所有文章的目录&#xff09;   文章字体风格&#xff1a; 红色文字表示&#…

【雕爷学编程】Arduino动手做(175)---机智云ESP8266开发板模块3

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…

flask中的蓝图

flask中的蓝图 在 Flask 中&#xff0c;蓝图&#xff08;Blueprint&#xff09;是一种组织路由和服务的方法&#xff0c;它允许你在应用中更灵活地组织代码。蓝图可以大致理解为应用或者应用中的一部分&#xff0c;可以在蓝图中定义路由、错误处理程序以及静态文件等。然后可以…

vcruntime140_1.dll无法继续执行代码重新安装方法

cruntime140_1.dll是Windows操作系统中的一个动态链接库文件&#xff0c;它包含了一些与C运行时相关的函数和资源。在Windows系统中&#xff0c;许多应用程序和游戏都依赖于vcruntime140_1.dll文件来正常运行。当系统中缺少或损坏了vcruntime140_1.dll文件时&#xff0c;就会出…

Unity源码分享-黄金矿工游戏完整版

Unity源码分享-黄金矿工游戏完整版 项目地址&#xff1a;https://download.csdn.net/download/Highning0007/88118933

flask创建数据库连接池

flask创建数据库连接池 在Python中&#xff0c;您可以使用 Flask-SQLAlchemy 这个扩展来创建一个数据库连接池。Flask-SQLAlchemy 是一个用于 Flask 框架的 SQLAlchemy 操作封装&#xff0c;实现了 ORM(Object Relational Mapper)。ORM 主要用于将类与数据库中的表建立映射关系…

superset为何无法上传excel,csv等外部文件

superset为何无法上传excel&#xff0c;csv等外部文件 这是由于没有打开数据库的上传外部文件的权限 1.打开数据库连接设置&#xff0c;选择Allow file uploads to database 2.发现这里的上传链接都可以使用

HTML+CSS+JavaScript:实现京东官网固定导航栏

一、需求 在京东官网首页&#xff0c;只要页面滚动到京东秒杀倒计时的位置&#xff0c;顶部的导航栏就会自动出现且固定在窗口最上方&#xff0c;如下图 我们将模仿京东官网的效果&#xff0c;做一个简易的固定导航栏&#xff0c;如下图 二、代码素材 以下是缺失JS部分的代码…

你应该知道的关于PCB布线的31条建议

1、走线长度应包含过孔和封装焊盘的长度。 2、布线角度优选135角出线方式&#xff0c;任意角度出线会导致制版出现工艺问题。 图1 PCB布线的角度 3、布线避免直角或者锐角布线&#xff0c;导致转角位置线宽变化&#xff0c;阻抗变化&#xff0c;造成信号反射&#xff0c;如图2…

AVL/B-/+ Tree查找

文章目录 0 树表的查找1 二叉排序树1.1 二叉排序树的操作1.1.1 二叉排序树的存储1.1.2 二叉排序树的递归查找1.1.3 二叉排序树的插入1.1.4 二叉排序树的生成1.1.5 二叉排序树的删除 1.2 二叉排序树的查找性能分析 2 平衡二叉树&#xff08;AVL树&#xff09;2.1 失衡二叉排序树…

WEB:web2

背景知识 代码审计 题目 由上述可知&#xff0c;这段代码定义了一个函数encode&#xff0c;接受一个字符串参数$str&#xff0c;并返回对其进行加密后的结果 加密算法包括&#xff1a; 使用strrev函数将字符串进行翻转&#xff1b;对翻转后的每个字符&#xff0c;将其ASCII值…

【playbook】Ansible的脚本----playbook剧本

Ansible的脚本----playbook剧本 1.playbook剧本组成2.playbook剧本实战演练2.1 实战演练一&#xff1a;给被管理主机安装Apache服务2.2 实战演练二&#xff1a;使用sudo命令将远程主机的普通用户提权为root用户2.3 实战演练三&#xff1a;when条件判断指定的IP地址2.4 实战演练…

企业如何制定数字化管理决策方案

数字化管理决策是指通过利用数字技术和数据分析来辅助和支持管理决策的过程。它利用计算机、互联网和其他技术来收集、分析和解释大量的数据&#xff0c;从而帮助管理者做出更准确、更有效的决策。 数字化管理决策的关键 数据收集与分析&#xff1a;数字化管理决策依赖于数据…

FreeRTOS之队列

什么是队列&#xff1f; 队列又称消息队列&#xff0c;是一种常用于任务间通信的数据结构&#xff0c;队列可以在任务与任务间、中断和任 务间传递信息。 关于队列的几个名词&#xff1a; 队列项目&#xff1a;队列中的每一个数据&#xff1b; 队列长度&#xff1a;队列能够…

PHP生成动态小程序二维码自定义路径和参数

PHP生成动态小程序二维码自定义路径和参数 小程序路径src 参数params http://test.com?srcindex/index/index&paramsstore_id10<?php $src$_GET[src]; $params$_GET[params];doPageNewQr($src,$params); function doPageNewQr($src,$params){//配置APPID、APPSECRET$A…

品牌触点:特别关注消费者的关键接触点

品牌触点&#xff1a;特别关注消费者的关键接触点 有个专门岗位&#xff1a;触点经理 打造品牌是超级工程 关键触点要持久不断地努力 很受启发 趣讲大白话&#xff1a;让消费者见一次喜欢一次 【趣讲信息科技240期】 **************************** 品牌触点是品牌与消费群体接触…

2023-将jar包上传至阿里云maven私有仓库(云效制品仓库)

一、背景介绍 如果要将平时积累的代码工具jar包&#xff0c;上传至云端&#xff0c;方便团队大家一起使用&#xff0c;一般的方式就是上传到Maven中心仓库&#xff08;但是这种方式步骤多&#xff0c;麻烦&#xff0c;而且上传之后审核时间比较长&#xff0c;还不太容易通过&a…