持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第25天,点击查看活动详情
快乐周六,全程起飞~~
股票价格跨度23
该题出自力扣的238题 —— 除自身以外数组的乘积【中等题】,这道题也是折磨了挺久的
审题
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请不要使用除法,且在 O(n) 时间复杂度内完成此题。
- 这道题题意并不复杂,但是因为限制了一些思路,所以会比较麻烦
- 给出一个整型数组,要求返回一个数组内的每一个值的乘积,不包含自己在内,也就是说,每一个值都需要乘积后除掉自己,最后整合成一个数组再返回
- 这道题一开始的思路挺多的,从最简单的暴力解法到优化
- 直接遍历每一个数组,遍历的同时,再双重遍历乘积,当下标到自己时跳过,直接明了,但是因为复杂度太高了,所以可以放弃
- 后续也有一个思路就是乘积,直接算出数组一共的乘积,然后再次遍历自身,拿总乘积除以当前自己即可,但是因为题目上有写明不要使用除法,所以这个思路也是夭折了
- 最后就是利用前后乘积的解法,第一次循环,获得除自己外前半部分的乘积,第二次循环,获得除自己外后半部分的乘积,两者相乘即可。巧妙记录每个元素的左右乘积,时间复杂度O(n),空间复杂度0(1)
编码
class Solution {
public int[] productExceptSelf(int[] nums) {
int n = nums.length;
int[] ans = new int[n];
int left = 1;
for(int i = 0;i < n; ++i){
ans[i] = left;
left *= nums[i];
}
int right = 1;
for(int i = n - 1;i >=0; --i){
ans[i] *= right;
right *= nums[i];
}
return ans;
}
}