每日算法題 | 劍指offer (3) 構建乘積數組

重磅乾貨,第一時間送達程序員

每日算法題 | 劍指offer (3) 構建乘積數組

題目

構建乘積數組面試

題目要求

給定一個數組A[0,1,...,n-1],請構建一個數組B[0,1,...,n-1],
其中B中的元素B[i]=A[0]A[1]...A[i-1]A[i+1]...A[n-1]。
不能使用除法。正則表達式

解題思路

爲了方便理解題目,下面舉個例子
A=[1, 2 , 3, 4]
B=[234, 134, 124, 123]算法

若是能夠用除法的話:那就比較容易了數組

因此不能使用除法,那就只能從乘法角度來看這道題目了。微信

每日算法題 | 劍指offer (3) 構建乘積數組

如上圖所示,能夠發現:數據結構

B[i]的左半部分(紅色部分)和B[i-1]有關(將B[i]的左半部分乘積當作C[i],有C[i]=C[i-1]*A[i-1]),

B[i]的右半部分(紫色部分)與B[i+1]有關(將B[i]的右半部分乘積當作D[i],有D[i]=D[i+1]*A[i+1]

 所以咱們先從0到n-1遍歷,計算每一個B[i]的左半部分; 而後定義一個變量temp表明右半部分的乘積,從n-1到0遍歷,令B[i]=temp,而每次的temp與上次的temp關係即爲temp=A[i+1]。機器學習

代碼實現

Python :ide

class Solution:
   def multiply(self, A):
       # write code here
       B=[1]*len(A)
       for i in range(1,len(A)):
           B[i]=B[i-1]*A[i-1]

       tmp=1
       for j in range(len(A)-2,-1,-1):
           tmp *= A[j+1]
           B[j]*= tmp
       return B

C++函數

class Solution {
public:
   vector<int> multiply(const vector<int>& A) {
       vector<int> B;
       int length = A.size();
       for(int i=0;i<length;i++)
       {
           int number=1;
           for(int j = 0;j<length;j++){
                if(j==i)continue;
                number *= A[j];
           }
           B.push_back(number);
        }
       return B;
    }
};

JAVA

public class Solution {
   public int[] multiply(int[] A) {
       if(A.length <= 1)
           return A;
       int [] B = new int[A.length];
       B[0] = 1;
       for(int i = 1; i < A.length; i++){
           B[i] = B[i-1] * A[i-1];
       }
       int temp = 1;
       for(int j = A.length - 2; j>=0; j--){
           temp *= A[j+1];
           B[j] *= temp;
       }
       return B;
    }
}

後記

注:面試季來了,無論是做爲面試者仍是之後做爲面試官,瞭解算法這門程序員之間的溝通方式都是很是必要的。找過工做的朋友應該都據說過《劍指offer》,雖然書中只有六十多道題目,可是道道都是經典。

若是是單純的面試需求,劍指offer的優先級確定是在Leetcode以前,總的說它有三個優勢:

  • 1.極可能在面試中出現原題
  • 2.約66題,題量少,可是涵蓋的內容較全
  • 3.能培養一個良好的刷題習慣

它的缺點是:

  • 1.只有66題,刷着容易過擬合
  • 2.動態規劃的題比較少,所以須要在Leetcode上專項訓練。
    算法題主要分紅數據結構和具體算法部分,簡單歸類以下。基本每道題都很精彩,因此這裏就不一一洗寫了,題解能夠看看個人代碼倉庫或者討論區的內容。

數據結構類題目

  • LinkedList
  • 003-從尾到頭打印鏈表
  • 014-鏈表中倒數第k個結點
  • 015-反轉鏈表
  • 016-合併兩個或k個有序鏈表
  • 025-複雜鏈表的複製
  • 036-兩個鏈表的第一個公共結點
  • 055-鏈表中環的入口結點
  • 056-刪除鏈表中重複的結點
  • Tree
  • 004-重建二叉樹
  • 017-樹的子結構
  • 018-二叉樹的鏡像
  • 022-從上往下打印二叉樹
  • 023-二叉搜索樹的後序遍歷序列
  • 024-二叉樹中和爲某一值的路徑
  • 026-二叉搜索樹與雙向鏈表
  • 038-二叉樹的深度
  • 039-平衡二叉樹
  • 057-二叉樹的下一個結點
  • 058-對稱的二叉樹
  • 059-按之字形順序打印二叉樹
  • 060-把二叉樹打印成多行
  • 061-序列化二叉樹
  • 062-二叉搜索樹的第k個結點
  • Stack & Queue
  • 005-用兩個棧實現隊列
  • 020-包含min函數的棧
  • 021-棧的壓入、彈出序列
  • 044-翻轉單詞順序列(棧)
  • 064-滑動窗口的最大值(雙端隊列)
  • Heap
  • 029-最小的K個數
  • Hash Table
  • 034-第一個只出現一次的字符
  • 065-矩陣中的路徑(BFS)
  • 066-機器人的運動範圍(DFS)
  • 具體算法類題目
  • 斐波那契數列
  • 007-斐波拉契數列
  • 008-跳臺階
  • 009-變態跳臺階
  • 010-矩形覆蓋
  • 搜索算法
  • 001-二維數組查找
  • 006-旋轉數組的最小數字(二分查找)
  • 037-數字在排序數組中出現的次數(二分查找)
  • 全排列
  • 027-字符串的排列
  • 動態規劃
  • 030-連續子數組的最大和
  • 052-正則表達式匹配(我用的暴力)
  • 回溯
  • 065-矩陣中的路徑(BFS)
  • 066-機器人的運動範圍(DFS)
  • 排序
  • 035-數組中的逆序對(歸併排序)
  • 029-最小的K個數(堆排序)
  • 029-最小的K個數(快速排序)
  • 位運算
  • 011-二進制中1的個數
  • 012-數值的整數次方
  • 040-數組中只出現一次的數字
  • 其餘算法
  • 002-替換空格
  • 013-調整數組順序使奇數位於偶數前面
  • 028-數組中出現次數超過一半的數字
  • 031-整數中1出現的次數(從1到n整數中1出現的次數)
  • 032-把數組排成最小的數
  • 033-醜數
  • 041-和爲S的連續正數序列(滑動窗口思想)
  • 042-和爲S的兩個數字(雙指針思想)
  • 043-左旋轉字符串(矩陣翻轉)
  • 046-孩子們的遊戲-圓圈中最後剩下的數(約瑟夫環)
  • 051-構建乘積數組

劍指offer刷題交流羣

掃碼添加微信,必定要備註研究方向+地點+學校+暱稱(如機器學習+上海+上交+湯姆)
每日算法題 | 劍指offer (3) 構建乘積數組

▲長按加羣

每日算法題 | 劍指offer (3) 構建乘積數組

相關文章
相關標籤/搜索