Leetcode----<Diving Board LCCI>
阿新 • • 發佈:2020-07-09
題解如下:
public class DivingBoardLCCI { /** * 暴力解法,遍歷每一種可能性 時間複雜度:O(2*N) * @param shorter * @param longer * @param k * @return */ public int[] divingBoard(int shorter, int longer, int k) { if (k==0) { return new int[0]; } TreeSet<Integer> result = new TreeSet<>(); for (int i = 0; i <= k; i++) { result.add(shorter * i + longer * k - i); } int[] ints = new int[result.size()]; AtomicInteger tag = new AtomicInteger(0); result.stream().forEach(ele -> { ints[tag.get()] = ele; tag.getAndIncrement(); }); return ints; } /**優化 * 解法二:優化邏輯思維 * 理解: * 總共有k塊木板 * 1. 當shorter==longer 只會有一種情況 * 2. 當shorter!=longer 我們可以從shorter或longer長度的木板中的一個來看,他們可能被使用的情況有0、1、2、、、n 總共(n+1)種情況 * 而且這n種情況下獲得到值也不一樣,因為每種情況shorter和longer的個數都不一樣[當shorter!=longer時,shorter和longer的個數不一樣那麼最終的值也會不一樣] * @param shorter * @param longer * @param k * @return */ public int[] divingBoard2(int shorter, int longer, int k) { if (k == 0) { return new int[0]; } int len; if (shorter == longer) { len = 1; } else { len = k + 1; } int[] result = new int[len]; for (int i = 0; i < len; i++) { result[i] = shorter * (k - i) + longer * i; } return result; } }