1. 程式人生 > 其它 >opencv計算兩陣列的乘積_LeetCode題記——238除自身以外陣列的乘積

opencv計算兩陣列的乘積_LeetCode題記——238除自身以外陣列的乘積

技術標籤:opencv計算兩陣列的乘積

200241b7f45e680e02bdd264150319f2.png

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)時間複雜度完成,常數空間複雜度,所以解決方法分兩步:

  1. 那就從左向右掃描一遍,記錄除了自己以外,自己的左邊元素構成的乘積,
  2. 再從右向左掃描一遍,記錄除了自己以外,自己的右邊元素構成的乘積,兩個結果相乘,即為最終乘積

分解圖如下:

cab0b8950d044df1f4bb955ec84f6d32.png
輸入陣列

然後從左向右開始,計算除自身以外,自己左側元素的乘積,

9ceb1031972f836f2d00a382814cf5a2.png
左側乘積

然後再從右向左遍歷,計算除自身以外,自己右側元素的乘積,

df12f6eea469ec5e1dd0d81169207bda.png
右側乘積

左側乘積和右側乘積都是在ans陣列上操作的,所以在運算過程中,是ans[i] *= tmp的形式,

得到最終結果:

f4d461338e0f9be7281b382646f10e7c.png
相同位置相同顏色的兩個數相乘,得到最終結果

程式碼如下:

 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;
    }

執行結果:

db36df7d0385a7be2942d18c803a268c.png