首页 > 其他分享 >力扣-238-除自身以外数组的乘积

力扣-238-除自身以外数组的乘积

时间:2022-11-04 16:25:10浏览次数:52  
标签:pre 乘积 nums int next 力扣 vector 238 数组

要求时间复杂度O(N),也就是说一次遍历,然后不让用除法
也就是说不能拿总乘积挨个除
不能双重for循环
但是没限制空间复杂度
能不能比如一个数组
pre[i]表示截至截至i(包括)前i个元素的乘积和
next[i]表示从i开始到结尾的元素的乘积和
第三次遍历就可以利用上面的结果算出来了

这里的两个辅助数组必须有额外的一个长度,来保存边界情况

大概这个样子

vector<int> productExceptSelf(vector<int>& nums) {
	int n = nums.size();
	vector<int> res,pre(n+1),next(n+1);

	pre[0] = 1, next[n] =1;

	for (int i = 1; i <= n; i++) 
		pre[i] = nums[i-1] * pre[i - 1];	

	for (int i = n - 1; i >= 0; i--)
		next[i] = nums[i] * next[i + 1];

	for (int i = 0; i < n; i++)
		res.push_back(pre[i] * next[i+1]);

	return res;
}

这里直接用push_back()避免res数组长度和另外两个辅助数组不一致造成的麻烦
就是没想到空间效率这么差,用的数组多了,而且可能没必要写三个循环

vector<int> productExceptSelf(vector<int>& nums) {
	int n = nums.size();
	vector<int> res,next(n+1);

	int pre = 1;
	next[n] =1;

	for (int i = n - 1; i >= 0; i--)
		next[i] = nums[i] * next[i + 1];

	for (int i = 1; i <= n; i++) {
		res.push_back(pre * next[i]);
		pre = nums[i - 1] * pre;
	}

	return res;
}

优化了一个数组和一个循环,但是空间效率仍然不高,我觉得除非换思路不然没法优化了

标签:pre,乘积,nums,int,next,力扣,vector,238,数组
From: https://www.cnblogs.com/yaocy/p/16857909.html

相关文章

  • 力扣-279-完全平方数
    有没有可能是个数学题保证一定能通过若干个完全平方数凑整,再不济可以11111111…我想到了动态规划的斐波那契数列,但似乎并不是一个线性dp…瞄评论,瞄到了“背包”,那这里应......
  • 力扣-152-乘积最大的子数组
    对于dp[i],如果nums[i-1]>0,dp[i-1]也>0,那就是dp[i-1]*nums[i-1]如果<0,>0,那就是nums[i-1]0,<0,那就是nums[i-1]<0,<0,那就是dp[i-1]*nums[i-1]同样参考最大子数和,还需......
  • 力扣 二叉树 算法+题目 整理
    二叉树基础包括三种遍历,建树和遍历的方法。二叉树遍历力扣144,94,145二叉树前中后序遍历使用递归或者迭代空间复杂度都是o(n),而通过morris遍历则可以达到o(1),其介绍......
  • 力扣1668(java&python)-最大重复子字符串(简单)
    题目:给你一个字符串 sequence ,如果字符串word 连续重复 k 次形成的字符串是 sequence 的一个子字符串,那么单词 word的重复值为k。单词word 的最大重复值......
  • 力扣 257. 二叉树的所有路径
    257.二叉树的所有路径给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径。叶子节点是指没有子节点的节点。示例1:输入:root=[1......
  • 力扣 129. 求根节点到叶节点数字之和
    129.求根节点到叶节点数字之和给你一个二叉树的根节点 root ,树中每个节点都存放有一个 0 到 9 之间的数字。每条从根节点到叶节点的路径都代表一个数字:例......
  • 力扣-147-对链表进行插入排序
    ListNode*insertionSortList(ListNode*head){ //待排节点需要和它前面的节点比较?单链表怎么比,单链表的反向遍历? //只能从头开始找 //还要手写链表的交换? if(!he......
  • 力扣 124. 二叉树中的最大路径和 [1.0,2.0]
    124.二叉树中的最大路径和路径 被定义为一条从树中任意节点出发,沿父节点-子节点连接,达到任意节点的序列。同一个节点在一条路径序列中 至多出现一次 。该路径 ......
  • 力扣 113. 路径总和 II [dfs,bfs]
    113.路径总和II给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。叶子节点是指没有子节......
  • 力扣409(java&python)-最长回文串(简单)
    题目:给定一个包含大写字母和小写字母的字符串 s ,返回 通过这些字母构造成的最长的回文串 。在构造过程中,请注意区分大小写。比如 "Aa" 不能当做一个回文字符串......