1. 程式人生 > 實用技巧 >Leetcode----<Diving Board LCCI>

Leetcode----<Diving Board LCCI>

題解如下:

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;
    }
}