返回

剑指 Offer 66 难题探索:构造乘积数组,打破思维常规

闲谈

引子

算法的魅力在于其严谨性与灵活性,而LeetCode则是磨炼算法技能的绝佳平台之一。今天,我们将目光聚焦在剑指 Offer 66题——构建乘积数组。这是一个考察你对数组操作和算法思维能力的难题。准备好迎接挑战了吗?

题目概述

给你一个数组A[0,1,…,n-1],请构建一个数组 B[0,1,…,n-1],其中 B[i] 的值是数组 A 中除了下标 i 以外的元素的积。

算法流程

第一步:创建两个辅助数组 left 和 right,其中 left[i] 存储从下标 0 到 i-1 的元素乘积,而 right[i] 存储从下标 i+1 到 n-1 的元素乘积。

第二步:初始化 left[0] 为 1,right[n-1] 为 1。

第三步:使用for循环计算 left 数组中其余元素的值,即 left[i] = left[i-1] * A[i-1]。

第四步:使用另一个for循环计算 right 数组中其余元素的值,即 right[i] = right[i+1] * A[i+1]。

第五步:最后,计算数组 B 中的每个元素 B[i] = left[i] * right[i]。

实例解析

为了加深你的理解,我们来看一个例子。给定数组 A = [1, 2, 3, 4, 5]。

第一步:

创建辅助数组 left 和 right,并初始化 left[0] 和 right[n-1]。

left = [1]
right = [1]

第二步:

计算 left 数组中其余元素的值。

left[1] = left[0] * A[0] = 1 * 1 = 1
left[2] = left[1] * A[1] = 1 * 2 = 2
left[3] = left[2] * A[2] = 2 * 3 = 6
left[4] = left[3] * A[3] = 6 * 4 = 24

第三步:

计算 right 数组中其余元素的值。

right[3] = right[4] * A[4] = 1 * 5 = 5
right[2] = right[3] * A[3] = 5 * 4 = 20
right[1] = right[2] * A[2] = 20 * 3 = 60
right[0] = right[1] * A[1] = 60 * 2 = 120

第四步:

计算数组 B 中的每个元素。

B[0] = left[0] * right[0] = 1 * 120 = 120
B[1] = left[1] * right[1] = 1 * 60 = 60
B[2] = left[2] * right[2] = 2 * 20 = 40
B[3] = left[3] * right[3] = 6 * 5 = 30
B[4] = left[4] * right[4] = 24 * 1 = 24

所以,数组 B 的结果为 [120, 60, 40, 30, 24]。

总结

剑指 Offer 66题是一道考验算法思维能力和数组操作能力的题目。通过巧妙地使用辅助数组和循环,我们可以有效地构建乘积数组。希望你能够从中有所收获,在算法的道路上不断前行。