乙個程度為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...