leetcode腾讯精选练习之除自身以外数组的乘积(十)
最长公共前缀
题目
给定长度为 n 的整数数组 nums,其中 n > 1,返回输出数组 output ,其中 output[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积。
示例:
输入: [1,2,3,4]
输出: [24,12,8,6]
说明: 请不要使用除法,且在 O(n) 时间复杂度内完成此题。
思路
第一种思路O(n2):但是不符合题目要求
两层循环遍历,思路很简单不详细说了第一层遍历数组中中的每个数,第二层遍历求解除了本身之外的乘积。
第二种思路就是除法:也不符合题目要求
1.所有的数字相乘除去本身即可得到结果。
2.需要注意0的问题,如果有一个0,那么除了0那个为止之外的所有结果都是0,0位置处的结果是其他数字的乘积。如果有两个零,那么结果的所有值都是0。
第三种思路:
每个结果都是这个数左边的数字的乘积和右边的数字的乘积,然后在相乘的出来的。
所以先求出每个数字左遍的乘积,先后再求出右边的乘积,进行相乘即可得到结果。
举个例子:先列出数组[1,2,3,4]左边的数字的乘积如下所示:
1 | 2 | 3 | 4 |
---|---|---|---|
1 | 1 | 2 | 6 |
然后在列出所有数字右遍的数的乘积如下所示:
1 | 2 | 3 | 4 |
---|---|---|---|
24 | 12 | 4 | 1 |
然后将左边数字和右边数字的乘积列在一起,最后一行显示结果如果下所示:
1 | 2 | 3 | 4 |
---|---|---|---|
1 | 1 | 2 | 6 |
24 | 12 | 4 | 1 |
24 | 12 | 8 | 6 |
将左边数字的乘积和右边数字的乘积相乘即可得到最终的结果。
代码
第一种思路:
vector<int> productExceptSelf(vector<int>& nums) {
vector<int> res;
int sz = nums.size();
for (size_t i = 0; i < sz; i++)
{
int mul = 1;
for (size_t j = 0; j < sz; j++)
{
if (i == j)
{
continue;
}
mul *= nums[j];
}
res.push_back(mul);
}
}
第二种思路:
vector<int> productExceptSelf(vector<int>& nums) {
vector<int> res;
int sz = nums.size();
int mul = 1;
int zeroIndex = -1;
int zeroNum = 0;
for (size_t i = 0; i < sz; i++)
{
if (nums[i] != 0)
{
mul *= nums[i];
}
else
{
zeroNum++;
if (zeroNum > 1)
{
res.resize(sz, 0);
return res;
}
zeroIndex = i;
}
}
if (zeroNum != 0)
{
res.resize(sz, 0);
res[zeroIndex] = mul;
}
else
{
for (size_t i = 0; i < sz; i++)
{
res.push_back(mul / nums[i]);
}
}
return res;
}
第三种思路:
vector<int> productExceptSelf(vector<int>& nums) {
int sz = nums.size();
vector<int> res(sz, 0);
int tmp = 1;
for (int i = 0; i < sz; i++) {
res[i] = tmp;
tmp *= nums[i];
}
tmp = 1;
for (int i = sz - 1; i >= 0; i--) {
res[i] *= tmp;
tmp *= nums[i];
}
return res;
}
总结
这个题目总容易想到的就是前两种方法,第三种题目要求的方法还是需要多想想
leetcode腾讯精选练习之除自身以外数组的乘积(十)的更多相关文章
- leetcode腾讯精选练习(50 题)(持续更新)
1.除自身以外数组的乘积 给定长度为 n 的整数数组 nums,其中 n > 1,返回输出数组 output ,其中 output[i] 等于 nums 中除 nums[i] 之外其余各元素的乘 ...
- LeetCode 腾讯精选50题--二叉树中的最大路径和
二叉树中的最大路径和 题目描述 给定一个非空二叉树,返回器最大路径和,路径指一条从任意节点出发,到达任意节点的序列,该路径至少包含一个节点,且不一定经过根节点 解题思路 树这一类数据结构我还不是很熟悉 ...
- LeetCode 腾讯精选50题--二叉树的最大深度
求二叉树的最大深度, 基本思路如下: 设定一个全局变量记录二叉树的深度,利用递归,没遍历一层都将临时深度变量+1,并在每一节点递归结束后判断深度大小. 具体代码如下: package algorith ...
- LeetCode 腾讯精选50题--2的幂
在二进制中,2的幂的数字用二进制表示时只会有一位表示为1,其余都为0,基于这个前提,可以有两种方案: 1. 做位移操作 2. 与数值取反并与原数值做与操作,判断是否与原来的数值相同 对于方案1,我的想 ...
- LeetCode 腾讯精选50题--求众数
由于众数是指数组中相同元素的个数超过数组长度的一半,所以有两种思路,一. 先排序,后取排序后的数组的中间位置的值:二. 统计,设定一个变量统计相同元素出现的次数,遍历数组,若与选定的元素相同,统计变量 ...
- LeetCode 腾讯精选50题--只出现一次数字
事先说明,如果不是评论区的大牛一语点破,我可能还会陷在死胡同里出不来,这道题其实很简单,利用了任何一个学过二进制的人都了解的定理,即: 1. 异或操作满足交换律 : a ^ b ^ c 等价于 a ^ ...
- LeetCode 腾讯精选50题--链表排序
解题思路:归并 先把链表拆开,分为两部分,一直拆到只剩一个元素后,进行合并,利用一个临时节点记录重排后的链表的起始位置 合并不难,困难点在于如何拆分链表,自己的大体思路是利用两个指针,一个一次移动两位 ...
- LeetCode 腾讯精选50题--子集
根据题意,找到几何中的所有子集,说实话子集是没有什么头绪的,因为如果采用遍历的方法,稍有遗漏不说,代码的嵌套循环层数随着数组大小的增加而增加,想了很久没有头绪后就去看了看评论,然后就被点破了解题的关键 ...
- LeetCode 腾讯精选50题-- 买卖股票的最佳时机 II
贪心算法: 具体的解题思路如下: II 的解题思路可以分为两部分, 1. 找到数组中差值较大的两个元素,计算差值. 2. 再步骤一最大的元素的之后,继续遍历,寻找差值最大的两个元素 可以得出的是,遍历 ...
随机推荐
- c++程序—布尔值
#include<iostream> using namespace std; #include<string> int main() { //创建bool数据类型 bool ...
- hdu 3388 Coprime
第一个容斥的题,感觉这东西好神啊.于是扒了一发题解2333 首先想对于[1,x]内有多少与n,m都互质的数,显然x是存在单调性的,所以可以二分一下. 那么互质的数的求法,就是x-存在n,m一个质因数的 ...
- 详解contextConfigLocation|Spring启动过程详解(转)
原文链接:https://blog.csdn.net/qw222pzx/article/details/78191670 spring的应用初始化流程一直没有搞明白,刚刚又碰到了相关的问题.决定得好好 ...
- JSTL与EL表达式(为空判断)
JSTL与EL表达式(为空判断) 一.循环遍历集合 1.在jsp中引入标准函数声明 <%@ taglib uri="http://java.sun.com/jsp/jstl/cor ...
- Linux环境创建交换分区
最近在准备在移动端跑一下深度学习训练好的模型,在RK3399的板子上安装scipy时报错.网上查了一下,由于内存不足导致,做个交换分区就搞定了.那么如何做交换分区呢.话不多说,直接开撸. ------ ...
- Q6:ZigZag Conversion
6. ZigZag Conversion 官方的链接:6. ZigZag Conversion Description : The string "PAYPALISHIRING" ...
- EOJ Monthly 2020.1 E. 数的变幻
题目链接:https://acm.ecnu.edu.cn/contest/247/problem/E/ 这道题是cf原题: Codeforces Round #608 (Div. 2) E. Comm ...
- 解决 urxvt “unknown terminal type.”
登录到远程服务器上后,有时执行某些命令会提示unknown terminal type. 这是因为远程ssh不支持urxvt,执行 export TERM=xterm-256color 或者在远程主机 ...
- pandas中DataFrame重置设置索引
在pandas中,经常对数据进行处理 而导致数据索引顺序混乱,从而影响数据读取.插入等. 小笔总结了以下几种重置索引的方法: import pandas as pd import numpy as n ...
- Miller_Rabin素性测试
1. 为什么需要素性测试? 我们其实已经知道有一些判断素数的方法,比如: 遍历测试:待测试数n与2,3,...√n做除法判断余数是否为零,如果没有任何一个数可以整除n,则说明n为素数 Wilson定理 ...