2023年力扣高頻演算法面試題4動態規劃

2021-10-07 02:25:21 字數 3189 閱讀 5166

給定長度為 n 的整數陣列 nums,其中 n > 1,返回輸出陣列 output ,其中 output[i] 等於 nums 中除 nums[i] 之外其餘各元素的乘積。

說明: 請不要使用除法,且在 o(n) 時間複雜度內完成此題。

分析: 對於某乙個數字,如果我們知道其前面所有數字的乘積,同時也知道後面所有的數乘積,那麼二者相乘就是我們要的結果,所以我們只要分別建立出這兩個陣列即可,分別從陣列的兩個方向遍歷就可以分別建立出乘積累積陣列。

優化: 不用單獨的陣列來儲存乘積,而是直接累積到結果 res 中,我們先從前面遍歷一遍,將乘積的累積存入結果 res 中,然後從後面開始遍歷,用到乙個臨時變數 right,初始化為1,然後每次不斷累積,最終得到正確結果

class solution 

int right = 1;

for (int i = nums.size() - 1; i >= 0; --i)

return res;

}};

給定乙個未排序的陣列,判斷這個陣列中是否存在長度為 3 的遞增子串行。

數學表示式如下:

如果存在這樣的 i, j, k, 且滿足 0 ≤ i < j < k ≤ n-1,使得 arr[i] < arr[j] < arr[k] ,返回 true ; 否則返回 false 。

說明: 要求演算法的時間複雜度為 o(n),空間複雜度為 o(1) 。

分析: 遍歷陣列,如果m1大於等於當前數字,則將當前數字賦給m1;如果m1小於當前數字且m2大於等於當前數字,那麼將當前數字賦給m2,一旦m2被更新了,說明一定會有乙個數小於m2,那麼我們就成功的組成了乙個長度為2的遞增子串行,所以我們一旦遍歷到比m2還大的數,我們直接返回ture。如果我們遇到比m1小的數,還是要更新m1,有可能的話也要更新m2為更小的值,畢竟m2的值越小,能組成長度為3的遞增序列的可能性越大

class solution 

return false;

}};

給定乙個整數陣列 nums ,找出乙個序列中乘積最大的連續子串行(該序列至少包含乙個數)。

分析:

class solution 

return res;

}};

打亂乙個沒有重複元素的陣列。

c++11中,獲取隨機數的新方法default_random_engine,使用方法。

class solution 

vectorreset()

vectorshuffle()

return cur;

}};

給定乙個整數矩陣,找出最長遞增路徑的長度。

對於每個單元格,你可以往上,下,左,右四個方向移動。 你不能在對角線方向上移動或移動到邊界外(即不允許環繞)。

class solution 

int longestincreasingpath(vector>& matrix)

};

給定不同面額的硬幣 coins 和乙個總金額 amount。編寫乙個函式來計算可以湊成總金額所需的最少的硬幣個數。如果沒有任何一種硬幣組合能組成總金額,返回 -1。

分析:dp[i]表示錢數為i時的最小硬幣數

class solution 

};

給定乙個未排序的整數陣列,找出最長連續序列的長度。

要求演算法的時間複雜度為 o(n)。

class solution 

}return max;

}};

給定乙個無序的整數陣列,找到其中最長上公升子串行的長度。

class solution 

return v.size();

}};

給定正整數 n,找到若干個完全平方數(比如 1, 4, 9, 16, …)使得它們的和等於 n。你需要讓組成和的完全平方數的個數最少。

看到這個題的第一眼就知道用動態規劃做,因為貪心的話樣例就過不了,但是腦子不夠用寫不出來狀態表示式dp[i]=min(dp[i],dp[i-j*j]+1)。

class solution ;

fill(dp,dp+n+1,int_max);

dp[0]=0;

dp[1]=1;

for(int i=2;i<=n;i++)

}return dp[n];

}};

還有一種方法就是四平方和定理,第一次聽說這個定理完全是懵的。

根據四平方和定理,任意乙個正整數均可表示為4個整數的平方和,其實是可以表示為4個以內的平方數之和,那麼就是說返回結果只有 1,2,3 或4其中的乙個,首先我們將數位化簡一下,由於乙個數如果含有因子4,那麼我們可以把4都去掉,並不影響結果,比如2和8,3和12等等,返回的結果都相同,讀者可自行舉更多的栗子。還有乙個可以化簡的地方就是,如果乙個數除以8餘7的話,那麼肯定是由4個完全平方數組成,這裡就不證明了,因為我也不會證明,讀者可自行舉例驗證。那麼做完兩步後,乙個很大的數有可能就會變得很小了,大大減少了運算時間,下面我們就來嘗試的將其拆為兩個平方數之和,如果拆成功了那麼就會返回1或2,因為其中乙個平方數可能為0. (注:由於輸入的n是正整數,所以不存在兩個平方數均為0的情況)。注意下面的 !!a + !!b 這個表示式,可能很多人不太理解這個的意思,其實很簡單,感嘆號!表示邏輯取反,那麼乙個正整數邏輯取反為0,再取反為1,所以用兩個感嘆號!!的作用就是看a和b是否為正整數,都為正整數的話返回2,只有乙個是正整數的話返回1.

class solution 

}return 3;

}};

class solution 

int supereggdrop(int k, int n)

return ans;

}};

2023年力扣高頻演算法面試題9樹

給定乙個二叉搜尋樹,編寫乙個函式 kthsmallest 來查詢其中第 k個最小的元素。假設 k 總是有效的,1 k 二叉搜尋樹元素個數。高階 如果二叉搜尋樹經常被修改 插入 刪除操作 並且你需要頻繁地查詢第 k 小的值,你將如何優化 kthsmallest 函式?解題思路 利用find記錄是否找到...

2023年力扣高頻演算法面試題6鍊錶

之前在csdn寫過一篇 鍊錶與快慢指標 的筆記 判斷鍊錶是否有環 找到環的入口 反轉鍊錶 請編寫乙個函式,使其可以刪除某個鍊錶中給定的 非末尾 節點,你將只被給定要求被刪除的節點。分析 之前有同學去哈深面試也問過類似的問題。沒有給我們鍊錶的起點,只給我們了乙個要刪的節點,跟我們以前遇到的情況不太一樣...

2023年力扣高頻演算法面試題1數學 位運算

給定乙個非空整數陣列,除了某個元素只出現一次以外,其餘每個元素均出現兩次。找出那個只出現了一次的元素。要求 線性時間複雜度 不使用額外空間 解答 典型的位運算,相同的兩個數異或為0,擴充套件形式為,找出給定非空整數陣列中只出現一次的兩個整數。int singlenumber vector nums ...