77. 組合


給定兩個整數 n 和 k,返回範圍 [1, n] 中所有可能的 k 個數的組合。

你可以按 任何順序 返回答案。

 

示例 1:

輸入:n = 4, k = 2
輸出:
[
  [2,4],
  [3,4],
  [2,3],
  [1,2],
  [1,3],
  [1,4],
]

示例 2:

輸入:n = 1, k = 1
輸出:[[1]]

 

提示:

  • 1 <= n <= 20
  • 1 <= k <= n


class Solution {

    List<List<Integer>> result= new ArrayList<>();
    List<Integer> path = new LinkedList<>();

    public List<List<Integer>> combine(int n, int k) {
       
        backtrading(n, k, 1);
        return result;
    }


    public void backtrading(int n, int k, int startIndex){
        if(path.size() == k){
            result.add(new ArrayList<>(path));
            return;
        }

        for(int i = startIndex; i <= n; i++){
            path.add(i);
            backtrading(n, k, i+1);
            path.removeLast();
        }
    }
}

84. 柱狀圖中最大的矩形

給定 n 個非負整數,用來表示柱狀圖中各個柱子的高度。每個柱子彼此相鄰,且寬度為 1 。

求在該柱狀圖中,能夠勾勒出來的矩形的最大面積。

 

示例 1:

77. 組合,84. 柱狀圖中最大的矩形_出棧

輸入:heights = [2,1,5,6,2,3]
輸出:10
解釋:最大的矩形為圖中紅色區域,面積為 10

示例 2:

77. 組合,84. 柱狀圖中最大的矩形_出棧_02

輸入: heights = [2,4]
輸出: 4

 

提示:

  • 1 <= heights.length <=105
  • 0 <= heights[i] <= 104
class Solution {
    public int largestRectangleArea(int[] heights) {
        //要找比主元素更小的,所以要用單調遞增棧,那麼找到第一個最小的就能解決棧內所有元素問題
        Deque<Integer> st = new ArrayDeque<>();
        int[] res = new int[heights.length + 2];
        //給初始列表收尾添加0邊界(相當於兩個虛擬柱子,這樣可以在求面積時讓每個柱子都計算到)
        for(int i = 0;i < heights.length;i++)
            res[i+1] = heights[i];
        int maxArea = 0; 
        for(int i = 0;i < res.length;i++){
            //入棧:遍歷元素大於棧頂元素
            //出棧:當遍歷元素小於棧頂元素,棧內元素出棧
            while(!st.isEmpty() && res[i] < res[st.peek()]){ //遇到了比棧頂更小的下標i,那麼右邊界就是i
                int topIntex = st.pop(); //當前要計算面積的柱子下標(出棧的就是要處理到了)
                int h = res[topIntex]; //要處理柱子的高
                //
                int leftIndex = st.peek(); //因為單調棧是遞增的,pop之後再次peek獲取的是上一個比棧頂元素小的元素,即左邊界
                int w = i - leftIndex - 1;
                maxArea = Math.max(maxArea,h * w);
            }
            st.push(i); //遇到比棧頂元素大的就一直入棧,注意棧內存放的是元素下標
        }
        return maxArea;
    }
}