정수 배열 nums가 주어지면, 답변[i]가 nums[i]를 제외한 nums의 모든 요소의 곱과 동일하도록 배열 답변을 반환합니다.
숫자의 접두어나 접미어의 곱은 32비트 정수에 맞도록 보장됩니다.
나누기 연산을 사용하지 않고 O(n) 시간에 실행되는 알고리즘을 작성해야 합니다.
O(1) 추가 공간 복잡성 문제를 해결할 수 있습니까? (출력 배열은 공간 복잡도 분석을 위한 추가 공간으로 계산되지 않습니다.)
이 문제를 해결하려면 나누기 연산을 사용하지 않고 현재 요소를 제외한 모든 요소의 곱을 계산해야 합니다. 이는 배열에 대해 두 개의 패스를 사용하여 수행할 수 있습니다:
두 개의 배열을 사용하여 접두사와 접미사 제품을 저장한 다음 이를 곱하여 최종 결과를 얻을 수 있습니다.
function productExceptSelf(nums: number[]): number[] { const n = nums.length; const prefixProducts = new Array(n).fill(1); const suffixProducts = new Array(n).fill(1); const result = new Array(n).fill(1); // Compute prefix products for (let i = 1; i = 0; i--) { suffixProducts[i] = suffixProducts[i 1] * nums[i 1]; } // Compute the result by multiplying prefix and suffix products for (let i = 0; i시간 복잡도 분석:
기본 솔루션은 잘 작동하지만 접두사 및 접미사 제품을 저장하기 위해 추가 공간을 사용합니다.
출력 배열을 사용하여 접두사 제품을 먼저 저장한 다음 접미사 제품을 포함하도록 내부에서 수정하여 O(1) 추가 공간을 사용하도록 솔루션을 최적화할 수 있습니다.
function productExceptSelfOptimized(nums: number[]): number[] { const n = nums.length; const result = new Array(n).fill(1); // Compute prefix products in the result array for (let i = 1; i = 0; i--) { result[i] = result[i] * suffixProduct; suffixProduct *= nums[i]; } return result; }
console.log(productExceptSelf([1,2,3,4])); // [24,12,8,6] console.log(productExceptSelf([-1,1,0,-3,3])); // [0,0,9,0,0] console.log(productExceptSelf([2,2,2,2])); // [8,8,8,8] console.log(productExceptSelf([0,0])); // [0,0] console.log(productExceptSelf([5])); // This should not be a valid input as the minimum length is 2 console.log(productExceptSelf([1,2])); // [2, 1] console.log(productExceptSelfOptimized([1,2,3,4])); // [24,12,8,6] console.log(productExceptSelfOptimized([-1,1,0,-3,3])); // [0,0,9,0,0] console.log(productExceptSelfOptimized([2,2,2,2])); // [8,8,8,8] console.log(productExceptSelfOptimized([0,0])); // [0,0] console.log(productExceptSelfOptimized([5])); // This should not be a valid input as the minimum length is 2 console.log(productExceptSelfOptimized([1,2])); // [2, 1]
접두사 합계 배열:
내부 알고리즘:
배열 조작:
이러한 문제와 전략을 연습함으로써 문제 해결 능력을 향상시키고 다양한 코딩 과제에 더 잘 대비할 수 있습니다.
부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.
Copyright© 2022 湘ICP备2022001581号-3