opencv計算兩陣列的乘積_LeetCode題記——238除自身以外陣列的乘積
阿新 • • 發佈:2021-01-03
技術標籤:opencv計算兩陣列的乘積
LeetCode 238 除自身以外陣列的乘積,難度:中等,標籤:面試高頻
題意:
給你一個長度為 n 的整數陣列 nums,其中 n > 1,返回輸出陣列 output ,其中 output[i] 等於 nums 中除 nums[i] 之外其餘各元素的乘積。
示例:
輸入: [1,2,3,4]
輸出: [24,12,8,6]
提示:題目資料保證陣列之中任意元素的全部字首元素和字尾(甚至是整個陣列)的乘積都在 32 位整數範圍內。
說明: 請不要使用除法,且在 O(n) 時間複雜度內完成此題。
進階:
你可以在常數空間複雜度內完成這個題目嗎?( 出於對空間複雜度分析的目的,輸出陣列不被視為額外空間。)
思路:題目中明確指定,不能用除法,且O(N)時間複雜度完成,常數空間複雜度,所以解決方法分兩步:
- 那就從左向右掃描一遍,記錄除了自己以外,自己的左邊元素構成的乘積,
- 再從右向左掃描一遍,記錄除了自己以外,自己的右邊元素構成的乘積,兩個結果相乘,即為最終乘積
分解圖如下:
然後從左向右開始,計算除自身以外,自己左側元素的乘積,
然後再從右向左遍歷,計算除自身以外,自己右側元素的乘積,
左側乘積和右側乘積都是在ans陣列上操作的,所以在運算過程中,是ans[i] *= tmp的形式,
得到最終結果:
程式碼如下:
public static void main(String[] args) { int[] nums = {2,3,4,5}; int[] res = productExceptSelf(nums); System.out.println(Arrays.toString(res)); } public static int[] productExceptSelf(int[] nums) { int[] ans = new int[nums.length]; ans[0] = 1; int tmp = nums[0]; for(int i = 1;i < nums.length; i ++){ ans[i] = tmp; tmp *= nums[i]; } tmp = nums[nums.length - 1]; for(int i = nums.length - 2;i >= 0; i --){ ans[i] *= tmp; tmp *= nums[i]; } return ans; }
執行結果: