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. 再步骤一最大的元素的之后,继续遍历,寻找差值最大的两个元素 可以得出的是,遍历 ...
随机推荐
- 使用jdbc连接oracle
1.创建一个jdbc.properties 文件 driver=oracle.jdbc.driver.OracleDriver url=jdbc:oracle:thin:@127.0.0.1:1521 ...
- JMP CALL RET
一.JMP指令(修改EIP的值)(第一个修改EIP的指令) 三种方法 :JMP 立即数 JMP 寄存器 JMP 内存 EIP 之前介绍过,EIP存放的值就是cpu下一次要执行的地址 1.之前学过要 ...
- LeetCode做题笔记之动态规划
LeetCode之动态规划 时间有限只做了下面这几道:70.338.877.96.120.95.647,后续会继续更新 70:爬楼梯 先来道简单的练练手,一道经典的动态规划题目 可以采用动态规划的备忘 ...
- POJ 1164:The Castle
The Castle Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 6677 Accepted: 3767 Descri ...
- Django——CSRF防御
关于CSRF攻击原理在上一篇博客已经有过说明,这篇主要介绍下Django关于开启CSRF及CSRF工作机理.关于开启防御有两种,一种是全局开启,另一种是局部开启. 全局: 中间件 django.mid ...
- 18 12 29 css background
background属性 属性解释 background属性是css中应用比较多,且比较重要的一个属性,它是负责给盒子设置背景图片和背景颜色的,background是一个复合属性,它可以分解成如下几个 ...
- k8认证机制
参考下面博文 http://www.mamicode.com/info-detail-2270627.html 需要补充: k8s的的认证机制场景使用 客户端证书认证 采用双向证书进行 ...
- kubele常用配置
KUBELET_OPTS="--logtostderr=true \--v=4 \--hostname-override=10.83.52.147 \--kubeconfig=/usr/lo ...
- [C/C++]'fopen': This function or variable may be unsafe
这个错误也算比较常见吧,当然这个与代码无关,是编译器的问题,主要是VS中出现的,因为微软方面认为fopen函数是不安全的,于是自己搞了一套fopen_s的函数来代替,用前面一个的话编译器是会出错的,所 ...
- Codeforces Round #599 (Div. 2) Tile Painting
题意:就是给你一个n,然后如果 n mod | i - j | == 0 并且 | i - j |>1 的话,那么i 和 j 就是同一种颜色,问你最大有多少种颜色? 思路: 比赛的时候,看到 ...