classSolution{publicvoidsortColors(int[] nums){//双指针,左右指针分别从数组两头出发int left =0;int right = nums.length -1;//遍历一次数组for(int i =0; i <= right; i++){while(i <= right && nums[i]==2){//遇到0与左指针位置交换,左指针右移//这里需要判断交换后当前遍历位置是否为2,是则继续交换,直到不为2swap(nums, i, right--);}//先换2再进行0的交换,有可能2换完为0if(nums[i]==0){//遇到0与左指针位置交换,左指针右移swap(nums, i, left++);}}}//交换函数privatevoidswap(int[] nums,int i,int j){int temp = nums[i];
nums[i]= nums[j];
nums[j]= temp;}}
classSolution{publicStringminWindow(String s,String t){//滑动窗口//使用StringBuilder处理字符串StringBuilder s1 =newStringBuilder(s);StringBuilder t1 =newStringBuilder(t);int leng =Integer.MAX_VALUE;String result ="";//使用哈希表存储字符串t的字符及出现次数Map<Character,Integer> map =newHashMap<>();for(int i =0; i < t1.length(); i++){if(!map.containsKey(t1.charAt(i))){
map.put(t1.charAt(i),0);}
map.put(t1.charAt(i), map.get(t1.charAt(i))+1);}//左右指针都从字符串s开头出发int left =0;int right =0;int flag =0;//右指针向右遍历,如果哈希表中有该字符,则对应次数减1for(;right < s1.length(); right++){if(map.containsKey(s1.charAt(right))){int num = map.get(s1.charAt(right))-1;
map.put(s1.charAt(right), num);//若次数减为0则一个字符满足,记录为flagif(num ==0) flag +=1;}//当哈希表中所有字符都满足时判断左指针是否向右移动缩小窗口if(flag == map.size()){//若左指针指向字符不是哈希表中字符或次数小于0则向右移动,否则不移动while(!map.containsKey(s1.charAt(left))||(map.containsKey(s1.charAt(left))&& map.get(s1.charAt(left))<0)){if(map.containsKey(s1.charAt(left))){
map.put(s1.charAt(left), map.get(s1.charAt(left))+1);}
left++;}//计算长度并更新最短长度和子串if(leng > right - left +1){
leng = right - left +1;
result = s1.substring(left, right +1);}}}return result;}}
classSolution{publicbooleanexist(char[][] board,String word){//回溯boolean[][] used =newboolean[board.length][board[0].length];//循环每个位置作为起点,不要在回溯里循环for(int i =0; i < board.length; i++){for(int j =0; j < board[i].length; j++){boolean flag =backtracking(board, used, word, i, j,0);if(flag)returntrue;}}returnfalse;}//回溯函数,输入二维数组、已使用字符、目标字符串、当前坐标、已匹配的字符个数privatebooleanbacktracking(char[][] board,boolean[][] used,String word,int x,int y,int z){//终止条件//需要先判断该位是否使用过if(used[x][y])returnfalse;if(board[x][y]!= word.charAt(z))returnfalse;if(word.length()== z +1)returntrue;//递归//当前位置匹配时
used[x][y]=true;if(x +1< board.length){//向下递归boolean down =backtracking(board, used, word, x +1, y, z +1);if(down)returntrue;//找到匹配的字符串直接返回}if(x -1>=0){//向上递归boolean up =backtracking(board, used, word, x -1, y, z +1);if(up)returntrue;}if(y -1>=0){//向左递归boolean left =backtracking(board, used, word, x, y -1, z +1);if(left)returntrue;}if(y +1< board[x].length){//向右递归boolean right =backtracking(board, used, word, x, y +1, z +1);if(right)returntrue;}
used[x][y]=false;//回溯returnfalse;}}
classSolution{publicintmaximalRectangle(char[][] matrix){//定义矩阵每个元素左边连续1的数量为left[i] [j]int m = matrix.length;if(m ==0)return0;int n = matrix[0].length;int[][] left =newint[m +2][n];//第一行和最后一行为全0,当一列递增时最后不用额外考虑for(int i =1; i < m +1; i++){for(int j =0; j < n; j++){if(matrix[i -1][j]=='1'){
left[i][j]=(j ==0?0: left[i][j -1])+1;}}}//针对每一列使用单调栈进行计算Deque<Integer> stack =newLinkedList<>();int max =0;for(int j =0; j < n; j++){
stack.push(0);//初始化为0,方便计算第一行矩阵,如输入[["1"]]for(int i =0; i < m +2; i++){if(stack.isEmpty()){
stack.push(i);}else{int top = stack.peek();if(left[top][j]< left[i][j]){//大于栈顶元素直接入栈
stack.push(i);}elseif(left[top][j]== left[i][j]){//等于栈顶元素则替换栈顶元素
stack.pop();
stack.push(i);}else{//小于栈头元素高度,则计算面积while(!stack.isEmpty()&& left[stack.peek()][j]> left[i][j]){//每弹出一个元素就计算弹出元素的最大面积//相当于找到了弹出元素左右两边第一个比其小的柱子int mid = stack.pop();if(!stack.isEmpty()){int h = left[mid][j];int w = i - stack.peek()-1;
max =Math.max(max, h * w);}}//计算结束后弹出栈头元素直到当前元素(高度递增)入栈
stack.push(i);}}}//每一列单独计算//stack.clear();}return max;}}
classSolution{TreeNode pre =null;//记录上一个节点publicbooleanisValidBST(TreeNode root){//递归if(root ==null)returntrue;//中序遍历boolean left =isValidBST(root.left);//左if(pre !=null&& pre.val >= root.val)returnfalse;//中
pre = root;boolean right =isValidBST(root.right);//右return left && right;}}
classSolution{publicbooleanisSymmetric(TreeNode root){//递归if(root ==null)returnfalse;returncompareNode(root.left, root.right);}//递归函数,输入要对比的两个节点privatebooleancompareNode(TreeNode left,TreeNode right){if(left ==null&& right ==null)returntrue;if(left ==null|| right ==null)returnfalse;if(left.val != right.val)returnfalse;//递归boolean l =compareNode(left.left, right.right);if(!l)returnfalse;boolean r =compareNode(left.right, right.left);return l && r;}}