정수 배열 nums가 주어지면, 답변[i]가 nums[i]를 제외한 nums의 모든 요소의 곱과 동일하도록 배열 답변을 반환합니다.
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 < n; i++) { prefixProducts[i] = prefixProducts[i - 1] * nums[i - 1]; } // Compute suffix products for (let i = n - 2; 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 < n; i++) { result[i] = prefixProducts[i] * suffixProducts[i]; } return result; }
기본 솔루션은 잘 작동하지만 접두사 및 접미사 제품을 저장하기 위해 추가 공간을 사용합니다.
출력 배열을 사용하여 접두사 곱을 먼저 저장한 다음 접미사 곱을 포함하도록 내부에서 수정하여 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 < n; i++) { result[i] = result[i - 1] * nums[i - 1]; } // Compute suffix products and multiply with the prefix products let suffixProduct = 1; for (let i = n - 1; i >= 0; i--) { result[i] = result[i] * suffixProduct; suffixProduct *= nums[i]; } return result; } <h3> 시간 복잡도 분석: </h3> <ul> <li> <strong>시간 복잡도:</strong> O(n), 여기서 n은 배열의 길이입니다. 배열을 두 번 반복합니다.</li> <li> <strong>공간 복잡도:</strong> O(1), 출력 배열을 사용하여 중간 결과를 저장하고 추가 공간을 사용하지 않기 때문입니다.</li> </ul> <h3> 기본 솔루션에 비해 개선된 사항: </h3> <ul> <li>최적화된 솔루션은 중간 결과에 대한 출력 배열을 사용하여 공간 복잡도를 O(1)로 줄입니다.</li> </ul> <h2> 엣지 케이스 및 테스트: </h2> <h3> 엣지 케이스: </h3> <ol> <li>배열에 0이 포함되어 있습니다.</li> <li>배열에 음수가 포함되어 있습니다.</li> <li>배열 길이는 최소(2) 또는 최대(10^5) 제한입니다.</li> </ol> <h3> 테스트 사례: </h3> <pre class="brush:php;toolbar:false">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]
접두사 합계 배열:
내부 알고리즘:
배열 조작:
이러한 문제와 전략을 연습함으로써 문제 해결 능력을 향상시키고 다양한 코딩 과제에 더 잘 대비할 수 있습니다.
위 내용은 Typescript Coding Chronicles: 자기를 제외한 배열의 산물의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!