演算法 陣列連乘問題

2021-06-09 19:11:58 字數 822 閱讀 9865

乙個程度為n的陣列,現在要令

a[0] = a[1]*a[2]....a[n-1]

a[1] = a[0]*a[2]....a[n-1]

a[2] = a[0]*a[1]....a[n-1]

...a[n-1] = a[0]*a[2]...a[n-2]

條件是不能用除法,時間複雜度必須是線性。

觀察一下題目,每乙個元素 i 都被更新成了a[0]到a[n-1],除去 i 下標元素外的所有其它元素的連乘。

這題如果能用除法,則可以用以下的辦法來搞定:

1. 計算a[0]到a[n-1]的乘積m。

2. 用乘積m除以各個元素就是相應下標的解。

但是,搜狗說你們這麼搞顯得我們沒有技術含量,於是不允許用除法。

在這樣的前提下,我們觀察一下題目。不難得到這樣的結論:

每乙個下標i的乘積被分割成了兩部分

第一部分:從a[0]到a[i-1]的連乘

第二部分:從a[i+1]到a[n-1]的連乘

於是我們使用兩個同樣n元素的輔助空間來解決問題。

第乙個輔助空間b用來存放第一部分的乘積。 1;

a[0];

a[0]a[1];

...;

a[0]a[1]...a[n-2];

第二個輔助空間c存放第二部分的乘積

a[1]a[2]...a[n-1];

a[2]...a[n-1];

a[3]...a[n-1];

...;1;

最後結果a[i] = b[i]*c[i]

那麼,明顯,b的形成是陣列a正向掃瞄的結果,c的形成是a反向掃瞄的結果。

玩轉演算法 陣列問題

陣列問題 排序 選擇排序 插入排序 歸併排序 快速排序 查詢 二分查詢法 資料結構 棧 佇列 堆 如何寫出正確的程式 明確變數的含義 迴圈不變數 小資料量除錯 大資料量測試 leetcode 283.move zeros問題 給定乙個陣列nums,寫乙個函式,將函式中所有的0挪到陣列的末尾,而維持其...

演算法 陣列指標問題

88.合併兩個有序陣列 給你兩個有序整數陣列 nums1 和 nums2,請你將 nums2 合併到 nums1 中,使 nums1 成為乙個有序陣列。說明 初始化 nums1 和 nums2 的元素數量分別為 m 和 n 你可以假設 nums1 有足夠的空間 空間大小大於或等於 m n 來儲存 n...

簡單演算法 陣列

1.給定乙個排序陣列,你需要在原地刪除重複出現的元素,使得每個元素只出現一次,返回移除後陣列的新長度。param nums return var removeduplicates function nums prices return var maxprofit function prices pa...