原创 Java socket簡單聊天demo

實現效果:服務器等待客戶端的連接,然後開始聊天。(理想的效果應該是服務器做echo,客戶端和客戶端聊)。 注意事項:內部類是動態的,main函數是靜態的,不能直接在main中new一個內部類,需要實例化main所在的類。   服務器:

原创 494. Target Sum Medium

先給出一個遞歸的解法。主要思想:一組數,每個數會有 + 和 - 兩種選擇,那我們可以利用遞歸來遍歷求解所有的情況,n個數,就有2^n種情況,實際上是一個二叉樹,每個節點有兩種選擇。實現起來很簡單,但是效率比較差,畢竟有些情況明顯不可取,還

原创 523. Continuous Subarray Sum Medium

這道題雖然在動態規劃的分類裏,但沒有用到動態規劃。本質是數學題。 這裏用到了取餘的知識。從頭開始記錄sum的值,如果在一個位置,這裏的和模k取餘的值在前面某個數的相同,則這兩個數之間的和是k的倍數。 比較麻煩的是需要考慮特殊情況。比如

原创 516. Longest Palindromic Subsequence Medium

這道題是求最長迴文子序列,跟最長迴文子串相似。 用dp[ i ][ j ]表示s從 i 到 j 之間,它的最長迴文子序列的長度。最終結果就是dp[ 0 ] [ s.size() - 1 ]。狀態轉移方程是:如果s[i] == s[j],

原创 62. Unique Paths Medium

要求從左上角走到右下角的不同的路徑數。 主要思想:d[i][j]表示走到表格中(i, j)的路徑數,下標從0開始。則有d[i][j] = d[i - 1][j] + d[i][j - 1]。 class Solution { public

原创 判斷有向圖是否有環

在圖論中,如果一個有向圖從任意頂點出發無法經過若干條邊回到該點,則這個圖是一個有向無環圖(Directed Acyclic Graph,DAG). 對於一個n個節點的有向圖(節點編號從0到n-1),請判斷其是否爲有向無環圖. 圖的節點數和

原创 64. Minimum Path Sum Medium

求到達右下角的路徑,使得路徑上數的和最小。比較簡單。每一個位置你選擇從上面來更小還是左邊來更小就好。 class Solution { public: int minPathSum(vector<vector<int>>& gri

原创 617. Merge Two Binary Trees Easy

這題要求合併兩個二叉樹,相同位置的節點數值相加,如果有不存在的情況,採用存在的那個子樹。 主要思想:採用遞歸,兩個子樹同時遍歷,從某一根節點開始,先考慮根。我們直接在第一個子樹上修改。如果第二個子樹爲空,什麼都不做。如果第一個爲空,第二

原创 494. Target Sum Medium

這道題按如下推導,把它轉化成求是否存在子集的和爲特定值。跟416. Partition Equal Subset Sum一樣的做法。這裏給出一維數組的簡化版。 這題的坑在於,要判斷數組的和是否大於s,如果小於s,直接返回0,樣例中有s=1

原创 63. Unique Paths II Medium

接上一題Unique Paths,這裏增加了有障礙的情況。其實也很好理解。對於數組中不是邊界的情況,原本d[i][j]等於來自上方和左邊兩個的和,如果上面是障礙,則從上面來的路徑數爲0,左邊類似。不同的是,邊界中原本路徑數爲1,如果邊界中

原创 611. Valid Triangle Number

這道題跟之前做過的 3Sum 很相似(先排序)。O(n^3)的做法肯定超時,應該先固定一個值,然後用two pointers遍歷,這樣達到O(n^2)的複雜度。不過這裏遇到的問題是,如果你固定最小的值,當右邊的left和right構成的三

原创 374. Guess Number Higher or Lower Easy

這道題是二分查找的使用。需要注意的是,求mid不可以用(right + left)/ 2,因爲可能會越界,超過int的最大值,應該用(right - left)/ 2 + left。 // Forward declaration of g

原创 C語言指針加一的解釋

(最近讀C primer plus,做一些筆記) 直接看代碼: short a[4]; double b[4]; short * p1 = a; double * p2 = b; printf("%p %p\n", p1, p1+1);

原创 數組與指針初始化字符串的區別

(最近讀C primer plus,做一點筆記) 正文 C語言中字符串數組初始化有兩種方式:數組或者指針 char s1[] = "Hello world"; char * s2 = "Hello world"; 這裏的s1和s2都是指

原创 [排序]O(logN)空間複雜度排序(不修改原數組)

主要用選擇排序的方法,每次選擇最小值輸出,通過計最小值出現的次數來解決數組中重複值的問題。時間複雜度比較高,來換取比較低的空間複雜度(沒有申請別的空間,空間複雜度是O(1)?),並且不修改原數組,直接輸出。 public void so