2021-10-29:除自身以外数组的乘积。给你一个长度为 n 的整数数组 nums,其中 n > 1,返回输出数组 output ,其中 output[i] 等于 nums 中除 nums[i] 之

2021-10-29:除自身以外数组的乘积。给你一个长度为 n 的整数数组 nums,其中 n > 1,返回输出数组 output ,其中 output[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积。示例:输入: [1,2,3,4]。输出: [24,12,8,6]。提示:题目数据保证数组之中任意元素的全部前缀元素和后缀(甚至是整个数组)的乘积都在 32 位整数范围内。说明: 请不要使用除法,且在 O(n) 时间复杂度内完成此题。进阶:你可以在常数空间复杂度内完成这个题目吗?( 出于对空间复杂度分析的目的,输出数组不被视为额外空间。)力扣238。

答案2021-10-29:

方法1:先遍历求后缀基,再遍历求前缀基。
方法2:分三种情况。
2.1.数组中无零。将所有数就乘积,然后遍历,做除法。除法改成位运算,就符合题意了。
2.2.数组中有1个零。除了值为0的位置的数是其他数的积,其他位置是0。
2.3.数组中有2个零。结果全零。
时间复杂度:O(N)。
额外空间复杂度:O(1)。

代码用golang编写。代码如下:

package main

import "fmt"

func main() {
    
    
    nums := []int{
    
    1, 2, 3, 4, 5}
    ret := productExceptSelf(nums)
    fmt.Println(ret)
}

func productExceptSelf(nums []int) []int {
    
    
    n := len(nums)
    ans := make([]int, n)
    ans[0] = nums[0]
    for i := 1; i < n; i++ {
    
    
        ans[i] = ans[i-1] * nums[i]
    }
    right := 1
    for i := n - 1; i > 0; i-- {
    
    
        ans[i] = ans[i-1] * right
        right *= nums[i]
    }
    ans[0] = right
    return ans
}

执行结果如下:

图片


左神java代码

猜你喜欢

转载自blog.csdn.net/weixin_48502062/article/details/121044456