array专题9
新的一周,新的專題。array的中等難度的題目快要結束了。能感覺到進步,也依然能感覺到吃力。加油。
31 Next Permutation
思路:讀懂了題意,知道是要求下一個排列數是什么。如果已經到最后一個了,那就返回最小的那個。但是盯著那個 1,2,3;3,2,1看了兩分鐘,毫無頭緒。搜索到一篇好文章,原來樣例數據也很重要哦。把樣例數據加長就能發現規律了。下面的內容和原文章基本一樣。
例如輸入:6 5 4 8 7 5 1,應該返回什么呢?
首先肯定這個排列沒有到最大,不是返回最小的排列,因為最起碼8沒在第一位。
第二,從后面看起。5比1大,如果調換5,1排列數更小,不對。調換7,5也一樣。繼續看發現到4的位置可以換了。原來4后面的8 7 5 1 是一個遞減序列。根據遞減序列,找到要替換的元素4。
第三,4應該被5替換,也就是遞減序列中,比4大的最小元素。替換之后是 6 5 5 8 7 4 1。
第四,8 7 4 1 按照升序排列。
學習:看完別人的答案,我才知道我對6 5 4 8 7 5 1,應該返回什么,頭腦中并沒有清晰的概念。只是大概知道怎么做。樣例數據延長,有助于發現規律。
代碼
79 Word Search
思路:基本思路是回溯法。遍歷board,把每個char的位置放入map中。然后從word的第一個字符開始找。遞歸的退出條件是idx>=word.length。每一步查找的時候都只是查找固定位置相鄰的位置上的元素。這里需要注意的是,一個位置的元素被訪問過以后就不能再訪問了。我使用了雙向隊列解決這個問題。
學習:直接修改board[i][j]=*,標記已經訪問過的元素。速度更快。總結一下:標記數組是否訪問過,可以開辟新的空間做標記,可以修改原數組的值標記。修改原數組值可以修改為別的值,或者添加負號。
代碼
數字加和問題總結
兩數字加和
三數字加和
四數字加和
四數組加和II
數字加和問題有幾個細節:1 返回的是數組下標還是數值;2 數組是排序好的嗎?3 數組中有重復元素嗎?
782. Transform to Chessboard
題意:特點1:N?NN?N的矩陣;特點2:相鄰位置是指橫軸和縱軸相鄰的4個位置;特點3:元素值0的4個鄰居都是1,元素值1的4個鄰居都是0。
思路:將例題的輸入做了以下操作得到有效矩陣
如果矩陣中有相鄰的兩行或者相鄰的兩列相同就需要交換操作。
接下來思考如何判斷矩陣中相鄰兩行相同。下標從0開始。第1行與第0行比較;第2行與第1行比較。
還要思考如果找到相同的兩行,應該換到什么位置。例如第1行和第0行相同=>移動第1行;第1行與第2行不同 =>第1行和與第2行換位置。再次比較新的第2行與第3行是否相同。當找不到替換位置的時候,返回-1。
學習:上面的總結并不徹底。參考網頁
一個有效的矩陣的性質有:
1 當第一行輸入定了以后,只有兩種行數據:0110和1001,不會有形式。其中一種是另外一種的逆。對列也是一樣的。由此觀察到,矩陣上左、上右、下左、下右四個位置的值可能是4個0,也肯能是2個0和2個1,或者4個1。
2 每一行(列)有一半值是1,一半值是0。如果n=2*k,那么每行(列)有k個0,k個1;如果n=2*k+1,那么每行(列)有k個0,k+1個1或者k個1,k+1個0。
152 Maximum Product Subarray
思路:乘積最大的子數組,立馬聯想到了和最大的子數組。都用動態規劃。這里和與乘積有一個最大的區別是負數+正數<正數負數+正數<正數,而負數?正數<負數負數?正數<負數,負數?負數>負數負數?負數>負數。對于本題的狀態轉移方程就不只是和最大值之間的關系了。
dp[i]=Math.max(Math.max(dp[i-1]*nums[i],dpMin[i-1]*nums[i]),nums[i]);
dp[i-1]存儲到i-1下標最大的乘積;dpMin[i-1]存儲到i-1下標最小的乘積。
這個題目與 Subarray Sum Equals K 是有區別的。
代碼
總結
- 上一篇: webapi文档描述-swagger
- 下一篇: 深入理解闭包系列第二篇——从执行环境角度