golang力扣leetcode 238.除自身以外数组的乘积

简介: golang力扣leetcode 238.除自身以外数组的乘积

238.除自身以外数组的乘积

238.除自身以外数组的乘积

题解

题目:给定一个数组,求除自身以外数组的乘积,并要求时间复杂度O(n),空间复杂度O(1)

思路:

1.O(n)的复杂度,说明要遍历两次
2.第一次遍历,累计左边数组的乘积,注意边界lSum[0]=1
3.第二次遍历,累计右边数组的乘积,注意边界rSum[n-1]=1
4.第三次遍历,除自身以外数组的乘积=lSum[i]*rSum[i]

优化

上面的做法,时间复杂度是满足了,但是空间复杂度不满足
1.发现左边数组的乘积,可以直接用返回的数组代替
2.而右边的乘积,我们可以边更新答案,边用一个变量去计算累计乘积
3.这个空间复杂度就O(1)了

代码

func productExceptSelf(nums []int) []int {
  n := len(nums)
  lSum, rSum := make([]int, n+1), make([]int, n+1)
  ans := make([]int, n)
  lSum[0], rSum[n-1] = 1, 1
  for i := 1; i <= n; i++ {
    lSum[i] = lSum[i-1] * nums[i-1]
  }
  for i := n - 2; i >= 0; i-- {
    rSum[i] = rSum[i+1] * nums[i+1]
  }
  for i := 0; i < n; i++ {
    ans[i] = lSum[i] * rSum[i]
  }
  return ans
}
func productExceptSelf(nums []int) []int {
  n := len(nums)
  ans := make([]int, n)
  ans[0] = 1
  for i := 1; i < n; i++ {
    ans[i] = ans[i-1] * nums[i-1]
  }
  rSum := 1
  for i := n - 1; i >= 0; i-- {
    ans[i] = ans[i] * rSum
    rSum = rSum * nums[i]
  }
  return ans
}
目录
相关文章
|
2月前
|
算法
LeetCode第53题最大子数组和
LeetCode第53题"最大子数组和"的解题方法,利用动态规划思想,通过一次遍历数组,维护到当前元素为止的最大子数组和,有效避免了复杂度更高的暴力解法。
LeetCode第53题最大子数组和
|
2月前
|
算法
LeetCode第81题搜索旋转排序数组 II
文章讲解了LeetCode第81题"搜索旋转排序数组 II"的解法,通过二分查找算法并加入去重逻辑来解决在旋转且含有重复元素的数组中搜索特定值的问题。
LeetCode第81题搜索旋转排序数组 II
|
1月前
|
Go
Golang语言之数组(array)快速入门篇
这篇文章是关于Go语言中数组的详细教程,包括数组的定义、遍历、注意事项、多维数组的使用以及相关练习题。
21 5
|
2月前
|
算法 索引
LeetCode第34题在排序数组中查找元素的第一个和最后一个位置
这篇文章介绍了LeetCode第34题"在排序数组中查找元素的第一个和最后一个位置"的解题方法,通过使用双指针法从数组两端向中间同时查找目标值,有效地找到了目标值的首次和最后一次出现的索引位置。
LeetCode第34题在排序数组中查找元素的第一个和最后一个位置
|
2月前
|
算法
LeetCode第33题搜索旋转排序数组
这篇文章介绍了LeetCode第33题"搜索旋转排序数组"的解题方法,通过使用二分查找法并根据数组的有序性质调整搜索范围,实现了时间复杂度为O(log n)的高效搜索算法。
LeetCode第33题搜索旋转排序数组
|
1月前
|
Go
Golang语言之管道channel快速入门篇
这篇文章是关于Go语言中管道(channel)的快速入门教程,涵盖了管道的基本使用、有缓冲和无缓冲管道的区别、管道的关闭、遍历、协程和管道的协同工作、单向通道的使用以及select多路复用的详细案例和解释。
53 4
Golang语言之管道channel快速入门篇
|
1月前
|
Go
Golang语言文件操作快速入门篇
这篇文章是关于Go语言文件操作快速入门的教程,涵盖了文件的读取、写入、复制操作以及使用标准库中的ioutil、bufio、os等包进行文件操作的详细案例。
46 4
Golang语言文件操作快速入门篇
|
1月前
|
Go
Golang语言之gRPC程序设计示例
这篇文章是关于Golang语言使用gRPC进行程序设计的详细教程,涵盖了RPC协议的介绍、gRPC环境的搭建、Protocol Buffers的使用、gRPC服务的编写和通信示例。
52 3
Golang语言之gRPC程序设计示例
|
1月前
|
安全 Go
Golang语言goroutine协程并发安全及锁机制
这篇文章是关于Go语言中多协程操作同一数据问题、互斥锁Mutex和读写互斥锁RWMutex的详细介绍及使用案例,涵盖了如何使用这些同步原语来解决并发访问共享资源时的数据安全问题。
43 4
|
1月前
|
Go
Golang语言错误处理机制
这篇文章是关于Golang语言错误处理机制的教程,介绍了使用defer结合recover捕获错误、基于errors.New自定义错误以及使用panic抛出自定义错误的方法。
39 3