为有牺牲多壮志,敢教日月换新天。

[Swift]LeetCode238. 除自身以外数组的乘积 | Product of Array Except Self

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
➤微信公众号:山青咏芝(shanqingyongzhi)
➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/
➤GitHub地址:https://github.com/strengthen/LeetCode
➤原文地址:https://www.cnblogs.com/strengthen/p/10205154.html 
➤如果链接不是山青咏芝的博客园地址,则可能是爬取作者的文章。
➤原文已修改更新!强烈建议点击原文地址阅读!支持作者!支持原创!
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

热烈欢迎,请直接点击!!!

进入博主App Store主页,下载使用各个作品!!!

注:博主将坚持每月上线一个新app!!!

Given an array nums of n integers where n > 1,  return an array outputsuch that output[i] is equal to the product of all the elements of numsexcept nums[i].

Example:

Input:  [1,2,3,4]
Output: [24,12,8,6]

Note: Please solve it without division and in O(n).

Follow up:
Could you solve it with constant space complexity? (The output array does not count as extra space for the purpose of space complexity analysis.)


给定长度为 n 的整数数组 nums,其中 n > 1,返回输出数组 output ,其中 output[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积。

示例:

输入: [1,2,3,4]
输出: [24,12,8,6]

说明: 请不要使用除法,且在 O(n) 时间复杂度内完成此题。

进阶:
你可以在常数空间复杂度内完成这个题目吗?( 出于对空间复杂度分析的目的,输出数组不被视为额外空间。)


116ms

 1 class Solution {
 2     func productExceptSelf(_ nums: [Int]) -> [Int] {
 3 
 4     var result : [Int] = []
 5     var mutiplier = 1
 6 
 7     for num in nums
 8     {
 9         result.append(mutiplier)
10         mutiplier *= num
11     }
12 
13     mutiplier = 1
14     var index = nums.count - 1
15     while index>=0
16     {
17         result[index] *= mutiplier
18         mutiplier *= nums[index]
19         index -= 1
20     }
21 
22     return result
23 }
24 }

124ms

 1 class Solution {
 2     func productExceptSelf(_ nums: [Int]) -> [Int] {
 3         guard !nums.isEmpty else { return [] }
 4 
 5         var output = [Int](repeating: 1, count: nums.count)
 6         for i in nums.indices.dropFirst() {
 7             output[i] = output[i - 1] * nums[i - 1]
 8         }
 9         
10         var right = nums[nums.count - 1]
11         for i in nums.indices.dropLast().reversed() {
12             output[i] *= right
13             right *= nums[i]
14         }
15         
16         return output
17     }
18 }

124ms

 1 class Solution {
 2     func productExceptSelf(_ nums: [Int]) -> [Int] {
 3         let count = nums.count
 4         if count == 0 {
 5             return [Int]()
 6         }
 7         if count == 1 {
 8             return [1]
 9         }
10         var result = nums
11         for i in 1..<count - 1 {
12             result[i] *= result[i - 1]
13         }
14         
15         var temp = 1
16         for i in (1..<count).reversed() {
17             result[i] = temp * result[i - 1]
18             temp *= nums[i]
19         }
20         result[0] = temp
21         return result
22     }
23 }

125ms

 1 class Solution {
 2     func productExceptSelf(_ nums: [Int]) -> [Int] {
 3         let total = nums.filter({ $0 != 0 }).reduce(1, { $0 * $1 })
 4         let zero_count = nums.filter({ $0 == 0}).count
 5         return nums.map { number -> Int in
 6             if zero_count == 0 {
 7                 return total / number
 8             } else if zero_count == 1 {
 9                 return number == 0 ? total : 0
10             } else {
11                 return 0
12             }
13         }
14     }
15 }

136ms

 1 class Solution {
 2     func productExceptSelf(_ nums: [Int]) -> [Int] {
 3         guard nums.count > 1 else { return [0]}
 4         let letfProduct = nums.reduce(into:[]) { $0.append(($0.last ?? 1) * $1) }
 5         let rightProduct = Array(Array(nums.reversed().reduce(into:[]) { $0.append(($0.last ?? 1) * $1) }).reversed())
 6         var result = [Int](repeating:0, count:nums.count)
 7         for i in 0..<nums.count {
 8             if i == 0 {
 9                 result[i] = rightProduct[1]
10             } else if i == nums.count-1 {
11                 result[i] = letfProduct[nums.count-2]
12             } else {
13                 result[i] = letfProduct[i-1] * rightProduct[i+1]
14             }
15         }
16         return result
17     }
18 }

160ms

 1 class Solution {
 2     func productExceptSelf(_ nums: [Int]) -> [Int] {
 3         let n = nums.count
 4         var result = [Int](repeating: 1, count: n)
 5         guard n > 0 else { return result }
 6         //设left[i]为nums[i]左边的所有元素的乘积
 7         var left = [Int](repeating: 1, count: n) 
 8         //设right[i]为nums[i]右边的所有元素的乘积
 9         var right = [Int](repeating: 1, count: n) 
10         for i in 1 ..< n {
11             left[i] = left[i - 1] * nums[i - 1]
12         }
13         for i in (0 ..< n - 1).reversed() {
14             right[i] = right[i + 1] * nums[i + 1]
15         }
16         for i in 0 ..< n {
17             result[i] = left[i] * right[i]
18         }
19         return result
20     }
21 }

188ms

 1 class Solution {
 2     func productExceptSelf(_ nums: [Int]) -> [Int] {
 3         var res = [Int]()
 4         var leftValue = 1
 5         for i in 0 ..< nums.count {
 6             res.append(leftValue)
 7             leftValue *= nums[i]
 8         }
 9         var rightValue = 1
10         for i in stride(from: nums.count - 1, to: -1, by: -1) {
11             res[i] = res[i] * rightValue
12             rightValue *= nums[i]
13         }
14         return res
15     }
16 }

 

posted @ 2019-01-01 16:45  为敢技术  阅读(269)  评论(0编辑  收藏  举报