力扣热题5-接雨水
按照leetcode刷一遍:leetcode hot
42. 接雨水
左右最高峰
class Solution {
public int trap(int[] height) {
int n = height.length;
// 当前最高峰
int[] leftMax = new int[n];
int[] rightMax = new int[n];
leftMax[0] = height[0];
rightMax[n-1] = height[n-1];
for(int i=1;i<n;i++) {
leftMax[i] = Math.max(height[i],leftMax[i-1]);
}
for(int i=n-2;i>=0;i--) {
rightMax[i] = Math.max(rightMax[i+1],height[i]);
}
int result = 0;
for(int i=1;i<n-1;i++) {
result+=Math.max(Math.min(rightMax[i+1],leftMax[i-1])-height[i],0);
}
return result;
}
}
单调队列
并没有前一个方法好理解。
class Solution {
public int trap(int[] height) {
int n = height.length;
int result = 0;
// 单调递减队列的index
Deque<Integer> deque = new LinkedList<>();
deque.addLast(0);
for(int i=1;i<n;i++) {
if(deque.isEmpty()||height[i]<height[deque.peekLast()]) {
deque.addLast(i);
} else {
int cur;
while(!deque.isEmpty()) {
cur = deque.peekLast();
if(height[cur]<=height[i]) {
deque.removeLast();
if(deque.isEmpty()) {
break;
}
result += (Math.min(height[i],height[deque.peekLast()])-height[cur])*(i-deque.peekLast()-1);
} else {
break;
}
}
deque.addLast(i);
}
}
return result;
}
}
46. 全排列
class Solution {
public List<List<Integer>> permute(int[] nums) {
List<List<Integer>> result = new ArrayList<>();
Deque<Integer> deque = new LinkedList<>();
Set<Integer> visited = new HashSet<>();
permuteHelper(nums,deque,result,visited);
return result;
}
private void permuteHelper(int[] nums,Deque<Integer> deque,List<List<Integer>> result,Set<Integer> visited) {
if(deque.size()==nums.length) {
result.add(new ArrayList(deque));
return;
}
for(int i=0;i<nums.length;i++) {
if(visited.contains(nums[i])) {
continue;
}
deque.addLast(nums[i]);
visited.add(nums[i]);
permuteHelper(nums,deque,result,visited);
deque.pollLast();
visited.remove(nums[i]);
}
}
}
48. 旋转图像
直接模拟即可。
class Solution {
public void rotate(int[][] matrix) {
int cur;
int n = matrix.length;
for(int i=0;i<n/2;i++) {
for(int j=i;j<n-1-i;j++) {
cur = matrix[i][j];
matrix[i][j] = matrix[n-1-j][i];
matrix[n-1-j][i] = matrix[n-1-i][n-1-j];
matrix[n-1-i][n-1-j] = matrix[n-1-(n-1-j)][n-1-i];
matrix[n-1-(n-1-j)][n-1-i] = cur;
}
}
}
}
49. 字母异位词分组
我用的map sorted,也可以map的键用字母出现次数的hash。
class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
Map<String,List<String>> map = new HashMap<>();
String sortedStr;
for(String str:strs) {
char[] chrs = str.toCharArray();
Arrays.sort(chrs);
sortedStr = new String(chrs);
if(!map.containsKey(sortedStr)) {
map.put(sortedStr,new ArrayList<>());
}
map.get(sortedStr).add(str);
}
List<List<String>> result = new ArrayList<>();
for(String k:map.keySet()) {
result.add(map.get(k));
}
return result;
}
}