Charlemagne, the King of Frankie,java
請參考圖片中的說明。git
根據給出的數組肯定可以蓋多少城堡。github
我不能肯定個人思路是正確的,也歡迎你們參與討論。數組
根據給出的數組,由於有重複的值,我首先想到的是將給出的數組進行一次過濾和處理,去掉重複的值。測試
例如,給出的數組爲:int[] A = { 2, 2, 3, 4, 3, 3, 2, 2, 1, 1, 2, 5 };,那麼我但願處理爲:int[] A = { 2, 3, 4, 3, 2, 1, 2, 5 }; 去掉重複的值,由於重複的值在這裏沒有意義。ui
而後根據新的數組進行判斷,須要判斷的是 2 個端點,你須要將 2 個端點考慮爲 0。spa
那麼根據上面已經處理過的數組,你在進行遍歷的時候,針對第一個值 2 ,你須要判讀左側的值和右側的值,由於默認左側的值一直爲 0 ,那麼右側的值爲 3 的話,那麼這裏須要 v 須要 +1;debug
第 2 個值,由於第二個值的左側,3 > 2, 但右側 3 < 4。所以這個值不適合。code
第 3 個值,左側:4 > 3, 右側 4 >3 這個值是合適的。圖片
從這裏咱們找到的規律是,進行一次遍歷,找到,若是隻的左側和右側同時小於這值,或者左側和右側都同時大於這個值,那麼這個值是合適的取值。
須要注意一個狀況就是 {-3, -3},你初始化數組的時候,這個值爲 {-3},那麼這個地方是最少有一個合適的值。
源代碼和有關代碼的更新請訪問 GitHub:
測試類請參考:
代碼思路請參考:
/** * https://www.cwiki.us/display/ITCLASSIFICATION/Build+Castles */ @Test public void testBuildCastles() { // int[] A = { -3, -3 }; int[] A = { 2, 2, 3, 4, 3, 3, 2, 2, 1, 1, 2, 5 }; int h = 0; int v = 0; List<Integer> nList = new ArrayList<Integer>(); // Rebuild List nList.add(A[0]); for (int i = 0; i < A.length - 1; i++) { if (A[i] != A[i + 1]) { nList.add(A[i + 1]); } } // LOOP List to find right location for (int i = 0; i < nList.size() - 1; i++) { // COUNT 0 if (i == 0) { if (nList.get(i) < nList.get(i + 1)) { v++; } } else { if (nList.get(i) < nList.get(i - 1) && nList.get(i) < nList.get(i + 1)) { v++; } if (nList.get(i) > nList.get(i - 1) && nList.get(i) > nList.get(i + 1)) { h++; } } } if (nList.size() == 1) { h++; } else if (nList.size() > 2 && nList.get(nList.size() - 1) > nList.get(nList.size() - 2)) { h++; } // CHECK logger.debug("V - [{}]", v); logger.debug("H - [{}]", h); logger.debug("H + V - [{}]", (h + v)); }
上面程序的測試結果以下:
|