2018-06-21

Q1: CommonElemPathSum
Q2: int[], max A[i] + A[j] + j - i, which j >= i
Q3: binary Tree split
Q4: k sub array
Q5: skyline
Q6: findIntegers
Q7: array hopper4
Q8: 01背包
Q9: chess cross
Q10: rounbround tourment

//public class RoundRobinTournament {
    //一個matrix上的D&C 通常都應(yīng)該傳遞startX, startY 和size
    public void fill(int[][] input, int startX, int startY, int size) {
        //
        if (size == 1) {
            return;
        }
        int middle = size / 2;
        
        input[startX + middle][startY + middle] = input[startX][startY];
        input[startX + middle][startY] = input[startX][startY] + middle;
        input[startX][startY + middle] = input[startX + middle][startY];
        
        fill(input, startX, startY, middle);
        fill(input, startX, startY + middle, middle);
        fill(input, startX + middle, startY, middle);
        fill(input, startX + middle, startY + middle, middle);
        
    }
//
    public void findCover(int[][] input, int dr, int dc, int tr, int tc, int size, IntWarper t){
        if (size == 1) {
            return; 
        }
        t.i += 1;
        int m = t.i;
        System.out.println(t);  
        int s = size / 2;
         //處理帶有特殊棋子的棋盤.tr、tc表示棋盤的入口即左上角的行列號脊另,dr八秃、dc表示特殊棋子的行列位置主届,size表示棋盤的行數(shù)或者列數(shù)  
        //左上角
        if (dr < tr + s && dc < tc + s) {
            findCover(input, dr, dc,tr, tc, s, t);
        } else {
            input[tr + s - 1][tc + s - 1] = m;
            //findCover(input, blackX, blackY,startX, startY, middle);
            findCover(input, tr + s - 1, tc + s - 1,tr, tc, s, t);
        }
        
        if (dr <= tr + s - 1 && dc >= tc + s) {
            findCover(input, dr, dc,tr,tc + s, s, t);
        } else {
            input[tr + s - 1][tc + s] = m;
            findCover(input, tr + s - 1, tc + s,tr,tc + s, s, t);
        }
        
        //左下角
        if (dr >= tr + s && dc <= tc + s - 1) {
            findCover(input, dr, dc,tr + s,tc, s, t);
        } else {
            input[tr + s][tc + s - 1] = m;
            findCover(input, tr + s, tc + s - 1,tr + s,tc, s, t);
            
        }
        
        //右上角
        
        //左下角
        if (dr >= tr + s && dc >= tc + s) {
            findCover(input, dr, dc,tr + s,tc + s, s, t);
        } else {
            input[tr + s][tc + s] = m;
            findCover(input, tr + s, tc + s,tr + s,tc + s, s, t);
        }
        int n = 4;
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                System.out.print(input[i][j] + " ");
            }
            System.out.println(" ");
            
        }
        System.out.println(" asdfas");

    }

//
    public List<Integer> findMax(int[] weight, int[] val, int maxWeight) {
        int[][] dp = new int[weight.length + 1][maxWeight + 1];//搞瘋了
        List<Integer> sol = new ArrayList<>();
        for (int i = 1; i <= weight.length; i++) {//dp[i] -> v[i - 1]
            for (int j = 1; j <= maxWeight; j++) {//i放這里了
                if (j < weight[i - 1]) {
                    dp[i][j] = dp[i - 1][j];
                
                } else {
                    int tmp = Math.max(dp[i - 1][j] , dp[i - 1][j - weight[i - 1]] + val[i - 1] );
                    dp[i][j] = tmp;
                }
            }
        }
        int weightRemain =  maxWeight;
        int curItem = weight.length;
        while(weightRemain > 0 ) {//必須單獨寫, 放里面有重復(fù)
            if (dp[curItem][weightRemain] != dp[curItem - 1][weightRemain]) {
                sol.add(weight[curItem - 1]);
                weightRemain -= weight[curItem - 1];//這兩句順序不可換
                curItem--;
            } else {
                curItem--;
            }
        }
        
        return sol;
    }

//
public int minCost(int[] stones) {
        int n = stones.length;
        int[][] dp = new int[n][n];
        // merge arr[i]..arr[j] into one pile, total cost = subarray sum
        int[] prefixSum = new int[n + 1];
        for (int i = 1; i <= n; i++) {
            prefixSum[i] = prefixSum[i - 1] + stones[i - 1];
            ;
        }
        // arr[i] + .. arr[j] = prefixSum[ j + 1] - prefixSum[i]
        // dp[i][j] : first i elements into k pile, min cost Wrong
        // dp[i][j]: i to j elements into one pile, min cost
        // = dp[i][k] + dp[k + 1][j] | k : i + 1,...j - 2 Wrong
        // k: i.. ...j
        // 填表順序出了問題呢
        // base: dp[i][i] = stones[i]
        //for (int i = 0; i < n; i++) {
        //  dp[i][i] = stones[i];
        //}

        for (int i = n - 1; i >= 0; i--) {
            for (int j = i + 1; j < n; j++) {
                int temp = Integer.MAX_VALUE;
                for (int k = i; k < j; k++) {
                    temp = Math.min(temp, dp[i][k] + dp[k + 1][j] + prefixSum[j + 1] - prefixSum[i]);
                }
                dp[i][j] = temp;
            }
        }
        return dp[0][n - 1];

    }
//
package others.question;

class Solution {
    //一旦出現(xiàn)兩個連著的1,之后就可以直接return了
    public int findIntegers(int num) {
        int[] fib = new int[32];
    fib[0] = 1;
    fib[1] = 2;
    for (int i = 2; i < 32; i++) {
        fib[i] = fib[i - 1] + fib[i - 2];
    }
    int bitIdx = 31;
    int result = 0;
    boolean hasOne = false;
    
    if (num == 1) {
        return 2;
    }
    while (bitIdx >= 0) {
        if ((num & (1 << bitIdx)) != 0) {//not == 1
          System.out.println(bitIdx);
            result += fib[bitIdx];
            if (hasOne) {
                return result;
            }
            hasOne = true;
        } else {
            hasOne = false; 
        }
        bitIdx--;
        //System.out.println(bitIdx);
    }
    return result + 1;       
}

//
public class SkyLine {

    public int getArea(Rectangle[] input) {

        List<Wall> walls = new ArrayList<>();
        getWalls(input, walls);
        PriorityQueue<Rectangle> maxHeight = new PriorityQueue<>(new Comparator<Rectangle>() {
            @Override
            public int compare(Rectangle o1, Rectangle o2) {
                return o2.height.compareTo(o1.height);
            }
        });
        maxHeight.add(input[walls.get(0).id]);
        return calArea(walls, input, maxHeight);
    }

    private int calArea(List<Wall> walls, Rectangle[] input, PriorityQueue<Rectangle> maxHeight) {
        int result = 0;
        for (int i = 0; i < walls.size() - 1; i++) {
            Wall cur = walls.get(i);
            Wall next = walls.get(i + 1);
            int diff = next.x - cur.x;
            int curHeight = maxHeight.peek().height;
            if (cur.isLeft && !next.isLeft) {
                maxHeight.remove(input[next.id]);
                result += diff * curHeight;
            }
            if (cur.isLeft && next.isLeft) {
                maxHeight.add(input[next.id]);
                result += diff * curHeight;
            }
            if (!cur.isLeft && !next.isLeft) {
                maxHeight.remove(input[cur.id]);
                result += diff * curHeight;
            }
            if (!cur.isLeft && next.isLeft) {
                maxHeight.remove(input[cur.id]);
                maxHeight.add(input[next.id]);
            }
        }
        return result;

    }

    private void getWalls(Rectangle[] input, List<Wall> walls) {
        int id = 0;
        for (Rectangle r : input) {
            walls.add(new Wall(r.left, id, true));
            walls.add(new Wall(r.right, id, false));
            ++id;
        }
        sort(walls);
    }

    public static void main(String[] args) {
        Rectangle[] data = { new Rectangle(0, 2, 2), new Rectangle(1, 3, 3), new Rectangle(-1, 4, 1), };
        SkyLine test = new SkyLine();
        System.out.println(test.getArea(data));
    }
}
class Rectangle {
    Integer left;
    Integer right;
    Integer height;

    Rectangle(int left, int right, int height) {
        this.left = left;
        this.right = right;
        this.height = height;
    }
}


class Wall implements Comparable<Wall> {
    int x;
    int id;
    boolean isLeft;

    public Wall(int x, int id, boolean isLeft) {
        this.x = x;
        this.id = id;
        this.isLeft = isLeft;
    }

    @Override
    public int compareTo(Wall e) {
        return compare(x, e.x);
    }
}

//

public class KsubArray {
    public int findMax(int[] input, int k) {
        if (input == null || input.length < k || k <= 0) {
            return Integer.MIN_VALUE;
        }
        int[][] dp = calMaxK(input, k);
        return dp[input.length][k];
    }

    private int[][] calMaxK(int[] input, int k) {
        int n = input.length;
        int[][] subMax = getSubMax(input);
        int[][] dp = new int[n + 1][k + 1];
        for (int j = 1; j <= k; j++) {
            for (int i = j; i <= n; i++) {
                int max = Integer.MIN_VALUE;
                for (int m = j - 1; m < i; m++) {
                    max = Math.max(dp[m][j - 1] + subMax[m + 1][i], max);
                }
                dp[i][j] = max;
            }
        }
        return dp;
    }

    private int[][] getSubMax(int[] input) {
        int n = input.length;
        int[][] subMax = new int[n + 1][n + 1];
        for (int i = 0; i < n; i++) {
            int curMax = input[i];
            for (int j = i + 1; j < n; j++) {
                curMax = Math.max(curMax + input[j], input[j]);
                subMax[i + 1][j + 1] = curMax;
            }
        }
        return subMax;
    }
}

//Q
//Q;
public class CommonElemPathSum {
    public Node maxPathSum(Node n1, Node n2){ 
         return calPathSum(n1, n2);
        }
    private Node calPathSum(Node n1, Node n2) {
        Node dummy = new Node(0);
        Node result = dummy;
        Node startN1 = n1;
        Node startN2 = n2;
    
        int sum1 = 0;
        int sum2 = 0;
        while ( n1 != null && n2 != null) {
            if (n1.val < n2.val) {
                sum1 +=n1.val;
                n1 = n1.next;
            } else if (n1.val > n2.val) {
                sum2 +=n2.val;
                n2 = n2.next;
            } else {
                result.next = sum1 > sum2 ? startN1 : startN2;
                while(result.next.val != n1.val) {
                    result = result.next;
                }
                sum1 = sum2 = n1.val;
                startN1 = n1;
                startN2 = n2;
                n1 = n1.next;
                n2 = n2.next;
            }
        }
        
        if (n1 == null) {
            sum2 = addRemaining(n2, sum2);  
        } else {
            sum1 = addRemaining(n1, sum1);  
        }
        result.next = sum1 > sum2 ? startN1 : startN2;
        return dummy.next;
        
    }
    
    private int addRemaining( Node n, int sum) {
        while(n != null) {
            sum += n.val;
            n = n.next;
        }
        return sum;
    }

//Q:
public class BSTSplit {
    public TreeNode[]split(TreeNode root, int target) {

        if (root == null) {
            return null;
        }
       return helper(root, new TreeNode[]{null, null}, target);

    }

    private TreeNode[] helper(TreeNode cur, TreeNode[] result, int target){
        if (cur == null) {
            return new TreeNode[]{null, null};
        }

        if (cur.val > target) {

            cur.left = helper(cur.left, result, target)[1];

            cur.right = helper(cur.right, result, target)[1];
            result[1] = cur;
        } else {
            cur.left = helper(cur.left, result, target)[0];
            cur.right = helper(cur.right, result,target)[0];
            result[0] = cur;
        }
        return result;
    }

//Q
public int cal(int[] arr) {
  int maxI = A[0];
int result = Integer.MIN_VALUE;
for (int i = 0; i < n; i++) {
    int curJ = A[j] + j;
    maxI = Math.max(maxI, A[i] - i);
    result = Math.max(curJ + maxI);
  }
  return result;
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末雇寇,一起剝皮案震驚了整個濱河市铝耻,隨后出現(xiàn)的幾起案子盖袭,更是在濱河造成了極大的恐慌,老刑警劉巖遥金,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異蒜田,居然都是意外死亡稿械,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進店門冲粤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來美莫,“玉大人,你說我怎么就攤上這事梯捕∠岷牵” “怎么了?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵傀顾,是天一觀的道長襟铭。 經(jīng)常有香客問我,道長短曾,這世上最難降的妖魔是什么寒砖? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮嫉拐,結(jié)果婚禮上哩都,老公的妹妹穿的比我還像新娘。我一直安慰自己婉徘,他們只是感情好漠嵌,可當(dāng)我...
    茶點故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著盖呼,像睡著了一般儒鹿。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上塌计,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天挺身,我揣著相機與錄音,去河邊找鬼锌仅。 笑死章钾,一個胖子當(dāng)著我的面吹牛墙贱,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播贱傀,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼惨撇,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了府寒?” 一聲冷哼從身側(cè)響起魁衙,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎株搔,沒想到半個月后剖淀,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡纤房,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年纵隔,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片炮姨。...
    茶點故事閱讀 40,675評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡捌刮,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出舒岸,到底是詐尸還是另有隱情绅作,我是刑警寧澤,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布蛾派,位于F島的核電站俄认,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏碍脏。R本人自食惡果不足惜梭依,卻給世界環(huán)境...
    茶點故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望典尾。 院中可真熱鬧,春花似錦糊探、人聲如沸钾埂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽褥紫。三九已至,卻和暖如春瞪慧,著一層夾襖步出監(jiān)牢的瞬間髓考,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工弃酌, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留氨菇,地道東北人儡炼。 一個月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像查蓉,于是被迫代替她去往敵國和親乌询。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,685評論 2 360

推薦閱讀更多精彩內(nèi)容

  • 背景 一年多以前我在知乎上答了有關(guān)LeetCode的問題, 分享了一些自己做題目的經(jīng)驗豌研。 張土汪:刷leetcod...
    土汪閱讀 12,748評論 0 33
  • 小時候的事了。每每看見老師語文課來了霜浴,就是這么興奮晶衷!又可以在課堂上見到老師,還可以在課本上學(xué)到文化文章文風(fēng)坷随!...
    蓮花蓮子閱讀 159評論 0 1
  • 答:土米建議使用壓力鍋煮房铭,它的營養(yǎng)物質(zhì)才能充分的釋放出來,利于人體吸收 更多詳細內(nèi)容 請加qq554922626 ...
    土米閱讀 256評論 0 0
  • 初見芍藥花是在一個溫哥華咖啡廳的一個角落里温眉,徹底被吸引了缸匪,可能是花瓣太薄了,陽光照下來整朵花像是半透明的紗做成的类溢。...
    qqamber閱讀 517評論 0 0