最长公共前缀

题目

给定长度为 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腾讯精选练习之除自身以外数组的乘积(十)的更多相关文章

  1. leetcode腾讯精选练习(50 题)(持续更新)

    1.除自身以外数组的乘积 给定长度为 n 的整数数组 nums,其中 n > 1,返回输出数组 output ,其中 output[i] 等于 nums 中除 nums[i] 之外其余各元素的乘 ...

  2. LeetCode 腾讯精选50题--二叉树中的最大路径和

    二叉树中的最大路径和 题目描述 给定一个非空二叉树,返回器最大路径和,路径指一条从任意节点出发,到达任意节点的序列,该路径至少包含一个节点,且不一定经过根节点 解题思路 树这一类数据结构我还不是很熟悉 ...

  3. LeetCode 腾讯精选50题--二叉树的最大深度

    求二叉树的最大深度, 基本思路如下: 设定一个全局变量记录二叉树的深度,利用递归,没遍历一层都将临时深度变量+1,并在每一节点递归结束后判断深度大小. 具体代码如下: package algorith ...

  4. LeetCode 腾讯精选50题--2的幂

    在二进制中,2的幂的数字用二进制表示时只会有一位表示为1,其余都为0,基于这个前提,可以有两种方案: 1. 做位移操作 2. 与数值取反并与原数值做与操作,判断是否与原来的数值相同 对于方案1,我的想 ...

  5. LeetCode 腾讯精选50题--求众数

    由于众数是指数组中相同元素的个数超过数组长度的一半,所以有两种思路,一. 先排序,后取排序后的数组的中间位置的值:二. 统计,设定一个变量统计相同元素出现的次数,遍历数组,若与选定的元素相同,统计变量 ...

  6. LeetCode 腾讯精选50题--只出现一次数字

    事先说明,如果不是评论区的大牛一语点破,我可能还会陷在死胡同里出不来,这道题其实很简单,利用了任何一个学过二进制的人都了解的定理,即: 1. 异或操作满足交换律 : a ^ b ^ c 等价于 a ^ ...

  7. LeetCode 腾讯精选50题--链表排序

    解题思路:归并 先把链表拆开,分为两部分,一直拆到只剩一个元素后,进行合并,利用一个临时节点记录重排后的链表的起始位置 合并不难,困难点在于如何拆分链表,自己的大体思路是利用两个指针,一个一次移动两位 ...

  8. LeetCode 腾讯精选50题--子集

    根据题意,找到几何中的所有子集,说实话子集是没有什么头绪的,因为如果采用遍历的方法,稍有遗漏不说,代码的嵌套循环层数随着数组大小的增加而增加,想了很久没有头绪后就去看了看评论,然后就被点破了解题的关键 ...

  9. LeetCode 腾讯精选50题-- 买卖股票的最佳时机 II

    贪心算法: 具体的解题思路如下: II 的解题思路可以分为两部分, 1. 找到数组中差值较大的两个元素,计算差值. 2. 再步骤一最大的元素的之后,继续遍历,寻找差值最大的两个元素 可以得出的是,遍历 ...

随机推荐

  1. c++程序—布尔值

    #include<iostream> using namespace std; #include<string> int main() { //创建bool数据类型 bool ...

  2. hdu 3388 Coprime

    第一个容斥的题,感觉这东西好神啊.于是扒了一发题解2333 首先想对于[1,x]内有多少与n,m都互质的数,显然x是存在单调性的,所以可以二分一下. 那么互质的数的求法,就是x-存在n,m一个质因数的 ...

  3. 详解contextConfigLocation|Spring启动过程详解(转)

    原文链接:https://blog.csdn.net/qw222pzx/article/details/78191670 spring的应用初始化流程一直没有搞明白,刚刚又碰到了相关的问题.决定得好好 ...

  4. JSTL与EL表达式(为空判断)

    JSTL与EL表达式(为空判断) 一.循环遍历集合  1.在jsp中引入标准函数声明  <%@ taglib uri="http://java.sun.com/jsp/jstl/cor ...

  5. Linux环境创建交换分区

    最近在准备在移动端跑一下深度学习训练好的模型,在RK3399的板子上安装scipy时报错.网上查了一下,由于内存不足导致,做个交换分区就搞定了.那么如何做交换分区呢.话不多说,直接开撸. ------ ...

  6. Q6:ZigZag Conversion

    6. ZigZag Conversion 官方的链接:6. ZigZag Conversion Description : The string "PAYPALISHIRING"  ...

  7. EOJ Monthly 2020.1 E. 数的变幻

    题目链接:https://acm.ecnu.edu.cn/contest/247/problem/E/ 这道题是cf原题: Codeforces Round #608 (Div. 2) E. Comm ...

  8. 解决 urxvt “unknown terminal type.”

    登录到远程服务器上后,有时执行某些命令会提示unknown terminal type. 这是因为远程ssh不支持urxvt,执行 export TERM=xterm-256color 或者在远程主机 ...

  9. pandas中DataFrame重置设置索引

    在pandas中,经常对数据进行处理 而导致数据索引顺序混乱,从而影响数据读取.插入等. 小笔总结了以下几种重置索引的方法: import pandas as pd import numpy as n ...

  10. Miller_Rabin素性测试

    1. 为什么需要素性测试? 我们其实已经知道有一些判断素数的方法,比如: 遍历测试:待测试数n与2,3,...√n做除法判断余数是否为零,如果没有任何一个数可以整除n,则说明n为素数 Wilson定理 ...