238.product-of-array-except-self.go 765 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. func productExceptSelfLong(nums []int) []int {
  2. l := len(nums)
  3. ans := make([]int, l)
  4. zero := false
  5. zeroIdx, product := -1, 1
  6. for i := 0; i < l; i++ {
  7. if nums[i] != 0 {
  8. product *= nums[i]
  9. } else {
  10. if zero {
  11. return ans
  12. }
  13. zero = true
  14. zeroIdx = i
  15. }
  16. }
  17. if zero {
  18. ans[zeroIdx] = product
  19. return ans
  20. }
  21. for i := 0; i < l; i++ {
  22. ans[i] = product / nums[i]
  23. }
  24. return ans
  25. }
  26. func productExceptSelf(nums []int) []int {
  27. l := len(nums)
  28. ans := make([]int, l)
  29. memset(ans, 1)
  30. for i := 1; i < l; i++ {
  31. ans[i] = ans[i-1] * nums[i-1]
  32. }
  33. for i, tmp := l-2, 1; 0 <= i; i-- {
  34. tmp *= nums[i+1]
  35. ans[i] *= tmp
  36. }
  37. return ans
  38. }
  39. func memset(a []int, v int) {
  40. a[0] = v
  41. l := len(a)
  42. for bp := 1; bp < l; bp *= 2 {
  43. copy(a[bp:], a[:bp])
  44. }
  45. }