首页 > 其他分享 >LeetCode刷题记录——day2

LeetCode刷题记录——day2

时间:2024-03-20 20:34:25浏览次数:16  
标签:遍历 nums int day2 len vector answer LeetCode 刷题

https://leetcode.cn/problems/product-of-array-except-self/description/?envType=study-plan-v2&envId=top-interview-150
问题在于不使用除法并且空间复杂度为O(1),当第一次从头开始遍历时由于不知道后续数组元素是什么,所以无法得到答案,而如果当知道一个后续数组元素后,又回去更新答案的话,无疑会提高时间复杂度。不妨这样看待,如果我们已经遍历一次数组并且能够记录下足够的信息的话,那么下次我们再次遍历数组时不就可以相对地知道后续元素的信息了吗。由此推广,为了算法简单一些,我们甚至可以遍历有限次,获得足够的信息,然后一次得到最终答案。
由这样的思路我们再看问题,对于任何一个元素,其除了自身以外的的元素的乘积由两个部分构成,一个是它的前序元素乘积,一个是后续元素乘积。前者可以通过正向的遍历得到,后者通过反向遍历也可以得到,由此答案就明了了;

class Solution {
public:
    vector<int> productExceptSelf(vector<int>& nums) {
        int len = nums.size();
        vector<int> answer(len);
        int answer_R[len],answer_L[len];
        answer_L[0]=1,answer_R[len-1]=1;
        for(int i=1;i<len;i++){
            answer_L[i]=answer_L[i-1]*nums[i-1];
        }
        for(int i=len-2;i>=0;i--){
            answer_R[i]=answer_R[i+1]*nums[i+1];
        }
        for(int i=0;i<len;i++){
            answer[i]=answer_L[i]*answer_R[i];
        }
        return answer;
    }
};

同理,其实我们不需要两个数组,只需要一个中间变量记录后续乘积的过程就可以了,这样可以减小空间复杂度;

class Solution {
public:
    vector<int> productExceptSelf(vector<int>& nums) {
        int len = nums.size();
        vector<int> answer(len);
        answer[0]=1;
        for(int i=1;i<len;i++){
            answer[i]=answer[i-1]*nums[i-1];
        }
        int temp=nums[len-1];
        for(int i=len-2;i>=0;i--){
            answer[i]=temp*answer[i];
            temp=temp*nums[i];
        }
        return answer;
    }
};

本文由博客一文多发平台 OpenWrite 发布!

标签:遍历,nums,int,day2,len,vector,answer,LeetCode,刷题
From: https://www.cnblogs.com/humanplug/p/18086016

相关文章

  • leetcode代码记录(长度最小的子数组
    目录1.题目:2.我的代码:小结:1.题目:给定一个含有n个正整数的数组和一个正整数target。找出该数组中满足其总和大于等于target的长度最小的连续子数组[numsl,numsl+1,…,numsr-1,numsr],并返回其长度。如果不存在符合条件的子数组,返回0。示例1:输......
  • 【leetcode】135_candy糖果题_贪心算法_C语言_唐完了之后是?(雾
    原题如下:(蓝字为原题链接,可跳转查看)135.分发糖果n 个孩子站成一排。给你一个整数数组 ratings 表示每个孩子的评分。你需要按照以下要求,给这些孩子分发糖果:每个孩子至少分配到 1 个糖果。相邻两个孩子评分更高的孩子会获得更多的糖果。请你给每个孩子分发糖果,计算并......
  • 代码随想录刷题记录第一天 | 数组 | 704. 二分查找,27. 移除元素
    题目链接:704.二分查找-https://leetcode.cn/problems/binary-search/description/27.移除元素-https://leetcode.cn/problems/remove-element/description/文章学习链接:https://programmercarl.com/数组理论基础.html视频学习链接:https://www.bilibili.com/video/BV1f......
  • Python修炼秘籍--Python语言基础(Day2)
    Python语言基础(Day2)一、数据与数据类型1、数据2、数值类型3、文本序列:字符串4、序列类型5、集合和字典类型二、对象与变量1、对象2、变量3、变量(标识符)命名4、关键字(保留字)三、编码与命名规范1、编码规范2、Python编码规范PEP83、命名规范一、数据与数据类型1、......
  • 软考备考复习笔记day2(校验码crc和海明码检错纠错)
    奇偶校验奇偶校验(ParityCodes)是通过在编码中增加一位校验位来使编码中1的个数为奇数(奇校验)或者为偶数(偶校验)。但该编码只能检错,但不能纠错。奇偶校验:码距为2。码距越大越容易纠错和检错仅检测出代码中奇数位数(奇数个0或1发生错误),不能发现偶数位数出错。奇数+偶数=奇数......
  • 接雨水 - LeetCode 热题 7
    大家好!我是曾续缘......
  • 【力扣刷题日记】512.游戏玩法分析II
    前言练习sql语句,所有题目来自于力扣(https://leetcode.cn/problemset/database/)的免费数据库练习题。今日题目:512.游戏玩法分析II表:Activity列名类型player_idintdevice_idintevent_datedategames_playedint(player_id,event_date)是这个表的两个主键(具有唯一值的列......
  • LeetCode 1161. Maximum Level Sum of a Binary Tree
    原题链接在这里:https://leetcode.com/problems/maximum-level-sum-of-a-binary-tree/description/题目:Giventhe root ofabinarytree,thelevelofitsrootis 1,thelevelofitschildrenis 2,andsoon.Returnthe smallest level x suchthatthesumofa......
  • 代码随想录算法训练营day28 | leetcode 93. 复原 IP 地址、78. 子集、90. 子集 II
    目录题目链接:93.复原IP地址-中等题目链接:78.子集-中等题目链接:90.子集II-中等题目链接:93.复原IP地址-中等题目描述:有效IP地址正好由四个整数(每个整数位于0到255之间组成,且不能含有前导0),整数之间用'.'分隔。例如:"0.1.2.201"和"192.168.1.1"是有效IP......
  • java数据结构与算法刷题-----LeetCode1005. K 次取反后最大化的数组和(这就不是简单题)
    java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846卷来卷去,把简单题都卷成中等题了文章目录1.排序后从小到大取负2.hash表从小到大排序,省掉排序(这就是为什......