739. 每日温度
单调栈
C++版本
class Solution {
public:
vector<int> dailyTemperatures(vector<int>& temperatures) {
int n = temperatures.size();
vector<int> ans(n);
stack<int>st;
for(int i = 0; i < n ; i++){
while (!st.empty() && temperatures[i] > temperatures[st.top()]) {
ans[st.top()] = i - st.top();
st.pop();
}
st.push(i);
}
return ans;
}
};
Java版本
class Solution {
public int[] dailyTemperatures(int[] temperatures) {
int n = temperatures.length, top = 0;
Deque<Integer> st = new LinkedList<>();
int[] ans = new int[n];
for(int i = 0; i < n; i++){
//while(st.isEmpty() != true && temperatures[st.getLast()] < temperatures[i]){
while(st.isEmpty() != true && temperatures[st.peekLast()] < temperatures[i]){
//int pos = st.removeLast();
int pos = st.pollLast();
ans[pos] = i - pos;
}
//st.addLast(i);
st.offerLast(i);
}
return ans;
}
}
226. 翻转二叉树
class Solution {
public TreeNode invertTree(TreeNode root) {
if(root == null) return null;
TreeNode left = invertTree(root.left), right = invertTree(root.right), newRoot = root;
newRoot.right = left;
newRoot.left = right;
return newRoot;
}
}
221. 最大正方形
dp或前缀和
dp解法,dp[i][j]表示为以(i,j)为右下角的最大正方形边长
class Solution {
public int maximalSquare(char[][] matrix) {
int n = matrix.length, m = matrix[0].length;
int[][] dp = new int[n][m];
int ans = 0;
for(int i = 0; i < n; i++){
for(int j = 0; j < m; j++){
if(matrix[i][j] == '1'){
if(i == 0 || j == 0) dp[i][j] = 1;
else dp[i][j] = Math.min(Math.min(dp[i-1][j], dp[i-1][j-1]), dp[i][j-1]) + 1;
}
ans = Math.max(ans, dp[i][j]);
}
}
return ans*ans;
}
}
前缀和解法
class Solution {
public int maximalSquare(char[][] matrix) {
int n = matrix.length, m = matrix[0].length;
int[][] matrixInt = new int[n + 1][m + 1];
for(int i = 0; i < n; i++){
for(int j = 0; j < m; j++){
if(matrix[i][j] == '1') matrixInt[i + 1][j + 1] = 1;
else matrixInt[i + 1][j + 1] = 0;
if(i == 0 || j == 0) matrixInt[i][j] = 0;
}
}
for(int i = 1; i <= n ; i++){
for(int j = 1; j <= m; j++){
matrixInt[i][j] += matrixInt[i-1][j] + matrixInt[i][j-1] - matrixInt[i-1][j-1];
}
}
for(int len = Math.min(n, m); len >= 1 ; len--){
int flag = 0;
for(int i = len; i <= n ; i++){
for(int j = len; j <= m; j++){
int num = matrixInt[i][j];
num -= matrixInt[i-len][j] + matrixInt[i][j-len] - matrixInt[i-len][j-len];
if(num == len*len){
return len*len;
}
}
}
}
return 0;
}
}
215. 数组中的第K个最大元素
快排、桶
快排解法
class Solution {
public int quickSort(int[] nums, int l, int r,int k){
if(l >= r) return nums[k];
int i = l - 1, j = r + 1, x = nums[l + r >> 1];
while(i < j){
do i++; while(nums[i] < x);
do j--; while(nums[j] > x);
if(i < j){
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
}
if(k <= j) return quickSort(nums, l, j, k);
return quickSort(nums, j+1, r, k);
};
public int findKthLargest(int[] nums, int k) {
int n = nums.length;
return quickSort(nums, 0, n-1, n-k);
}
}
208. 实现 Trie (前缀树)
class Trie {
private Trie[] children;
private boolean isEnd;
public Trie() {
children = new Trie[26];
isEnd = false;
}
public void insert(String word) {
Trie node = this;
for(int i = 0; i < word.length(); i++){
int index = word.charAt(i) - 'a';
if(node.children[index] == null) node.children[index] = new Trie();
node = node.children[index];
}
node.isEnd = true;
}
public boolean search(String word) {
Trie node = searchPrefix(word);
return node != null && node.isEnd;
}
public boolean startsWith(String prefix) {
Trie node = searchPrefix(prefix);
return node != null;
}
public Trie searchPrefix(String word){
Trie node = this;
for(int i = 0; i < word.length(); i++){
int index = word.charAt(i) - 'a';
if(node.children[index] == null) return null;
node = node.children[index];
}
return node;
}
}
/**
* Your Trie object will be instantiated and called as such:
* Trie obj = new Trie();
* obj.insert(word);
* boolean param_2 = obj.search(word);
* boolean param_3 = obj.startsWith(prefix);
*/