# 20191211
Given a string containing just the characters '(', ')', '{', '}', '[' and ']', determine if the input string is valid.
An input string is valid if:
1. Open brackets must be closed by the same type of brackets.
2. Open brackets must be closed in the correct order.
Note that an empty string is also considered valid.
Input: "()"
Output: true
Input: "()[]{}"
Output: true
Input: "(]"
Output: false
Input: "([)]"
Output: false
Input: "{[]}"
Output: true
Input: "}{"
Output:
```
public boolean isValid(String s) {
if (s.length() == 1) return false;
Stack<Character> stack = new Stack();
char[] charArray = s.toCharArray();
for (char c : charArray) {
if (c == '(' || c == '[' || c == '{') {
stack.push(c);
} else if (!stack.isEmpty()){
char p = stack.pop();
if (c == ')' && p != '(' ) {
return false;
} else if (c == ']' && p != '[' ) {
return false;
} else if (c == '}' && p != '{' ){
return false;
}
} else {
return false;
}
}
return stack.isEmpty();
}
```
```
public boolean isValid(String s) {
Stack<Character> stack = new Stack<>();
for (char c : s.toCharArray()) {
if (c == '(' || c == '[' || c == '{') {
stack.push(c);
} else if (c == ')' && !stack.isEmpty() && stack.peak() == '(') {
stack.pop();
} else if (c == ']' && !stack.isEmpty() && stack.peak() == '[') {
stack.pop();
} else if (c == '}' && !stack.isEmpty() && stack.peak() == '{') {
stack.pop();
} else {
return false;
}
}
return stack.isEmpty();
}
```
```
Number of Islands
Given a 2d grid map of '1's (land) and '0's (water), count the number of islands. An island is surrounded by water and is formed by connecting adjacent lands horizontally or vertically. You may assume all four edges of the grid are all surrounded by water.
Example 1:
Input:
11110
11010
11000
00000
Output: 1
Example 2:
Input:
[[1,1,0,0,0],
[1,1,0,0,0],
[0,0,1,0,0],
[0,0,0,1,1]]
Output: 3
```
```
public int numIslands(char[][] grid) {
if (grid == null || grid.length == 0) {
return 0;
}
int count = 0;
int n = grid.length;
int m = grid[0].length;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (grid[i][j] == '1') {
dfs(grid, i, j, n, m);
count++;
}
}
}
return count;
}
public void dfs(char[][] grid, int i, int j, int n, int m) {
if (i >= n || j >= m || i < 0 || j < 0 || grid[i][j] == '0')
return;
grid[i][j] = '0';
dfs(grid, i + 1, j, n, m);
dfs(grid, i - 1, j, n, m);
dfs(grid, i, j + 1, n, m);
dfs(grid, i, j - 1, n, m);
}
```
```
Example:
Input: [2,1,5,6,2,3]
Output: 10
```
```
public class Solution {
public int largestRectangleArea(int[] heights) {
int maxarea = 0;
for (int i = 0; i < heights.length; i++) {
for (int j = i; j < heights.length; j++) {
int minheight = Integer.MAX_VALUE;
for (int k = i; k <= j; k++)
minheight = Math.min(minheight, heights[k]);
maxarea = Math.max(maxarea, minheight * (j - i + 1));
}
}
return maxarea;
}
}
```
```
public int largestRectangleArea(int[] heights) {
Stack<Integer> stack = new Stack<>();
stack.push(-1);
int maxarea = 0;
for (int i = 0; i < heights.length; ++i) {
while (stack.peek() != -1 && heights[stack.peek()] >= heights[i])
maxarea = Math.max(maxarea, heights[stack.pop()] * (i - stack.peek() - 1));
stack.push(i);
}
while (stack.peek() != -1)
maxarea = Math.max(maxarea, heights[stack.pop()] * (heights.length - stack.peek() -1));
return maxarea;
}
```
[1,1,1]
[1,1,0]
[1,0,1]
sr=1 sc=1 newcolor=2
```
public int[][] floodFill(int[][] image, int sr, int sc, int newColor) {
if (image[sr][sc] == newColor) return image;
dfs(image, sr, sc, newColor, image[sr][sc]);
return image;
}
private void dfs(int[][] image, int sr, int sc, int newColor, int target) {
if (sr < 0 || sr >= image.length || sc < 0 || sc >= image[0].length || image[sr][sc] != target) return;
image[sr][sc] = newColor;
dfs(image, n, m, sr + 1, sc, newColor, target);
dfs(image, n, m, sr - 1, sc, newColor, target);
dfs(image, n, m, sr, sc + 1, newColor, target);
dfs(image, n, m, sr, sc - 1, newColor, target);
}
```