102. 二叉树的层序遍历
递归法
核心代码模式
不断递归根节点,根据深度来判断加在哪一层上。
/*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val = val; }* TreeNode(int val, TreeNode left, TreeNode right) {* this.val = val;* this.left = left;* this.right = right;* }* }*/
class Solution {public List<List<Integer>> levelOrder(TreeNode root) {List<List<Integer>> ans=new ArrayList<>();layerselect(ans,root,0);return ans;}void layerselect(List<List<Integer>> ans,TreeNode root,int deep){if(root==null)return ;if(ans.size()==deep)ans.add(new ArrayList<>());ans.get(deep).add(root.val);layerselect(ans,root.left,deep+1);layerselect(ans,root.right,deep+1);}
}
手写输入输出
首先是构造树的节点类。
然后输入进来建树,特判一下为空的时候。这里是根据二叉树的性质,子节点下标等于父结点的2倍+1或2,不断递归建树
建好后进行层序遍历最后输出。
import java.util.*;class TreeNode
{int val;TreeNode left,right;TreeNode (){}TreeNode(int val){this.val=val;}TreeNode(String str){val=Integer.valueOf(str);}TreeNode(int val,TreeNode left,TreeNode right){this.val=val;this.right=right;this.left=left;}
}public class Javaacm
{
//输入格式
//[3,9,20,null,null,15,7]public static void main(String []args){Scanner scanner=new Scanner(System.in);String s=scanner.next();if(s.equals("[]")){System.out.print(s);return ;}String str[]=s.substring(1,s.length()-1).split(",");TreeNode root=buildTree(str,0);List<List<Integer>> ans=new ArrayList<>();layerselect(ans,root,0);System.out.print(ans);//[[3], [9, 20], [15, 7]]}static void layerselect(List<List<Integer>> ans,TreeNode root,int deep){if(root==null)return ;if(deep==ans.size())ans.add(new ArrayList<>());ans.get(deep).add(root.val);layerselect(ans,root.left,deep+1);layerselect(ans,root.right,deep+1);}private static TreeNode buildTree(String [] tree,int idx){if(idx>=tree.length||tree[idx].equals("null")){return null;}TreeNode node=new TreeNode(tree[idx]);node.left=buildTree(tree,idx*2+1);node.right=buildTree(tree,idx*2+2);return node;}
}
迭代法
核心代码模式
class Solution {public List<List<Integer>> levelOrder(TreeNode root) {List<List<Integer>> ans=new ArrayList<>();Queue<TreeNode> q=new ArrayDeque<>();if(root==null)return ans;q.offer(root);while(!q.isEmpty()){int n=q.size();List<Integer> layer=new ArrayList<>();for(int i=0;i<n;i++){TreeNode cur=q.poll();layer.add(cur.val);if(cur.left!=null)q.offer(cur.left);if(cur.right!=null)q.offer(cur.right);}ans.add(layer);}return ans;}
}
手写输入输出
import java.util.*;
class TreeNode
{int val;TreeNode left,right;TreeNode(){}TreeNode(int val){this.val=val;}TreeNode(String str){val=Integer.valueOf(str);}TreeNode(int val,TreeNode left,TreeNode right){this.val=val;this.left=left;this.right=right;}
}
public class Javaacm
{
//输入格式
//[3,9,20,null,null,15,7]public static void main(String []args){Scanner scanner=new Scanner(System.in);String s=scanner.next();if(s.equals("[]")){ System.out.print(s);return ;}String str[]=s.substring(1,s.length()-1).split(",");TreeNode root=buildTree(str,0);List<List<Integer>> ans=new ArrayList<>();Queue<TreeNode> q=new ArrayDeque<>();q.offer(root);while(!q.isEmpty()){int n=q.size();List<Integer> layer=new ArrayList<>();for(int i=0;i<n;i++){TreeNode cur=q.poll();layer.add(cur.val);if(cur.left!=null)q.offer(cur.left);if(cur.right!=null)q.offer(cur.right);}ans.add(layer);}System.out.println(ans);return ;}private static TreeNode buildTree(String [] tree,int idx){if(idx>=tree.length||tree[idx].equals("null")){return null;}TreeNode node=new TreeNode(tree[idx]);node.left=buildTree(tree,idx*2+1);node.right=buildTree(tree,idx*2+2);return node;}}
1. 两数之和
核心代码模式
哈希表,将元素,下标键值对存储进去,然后遍历查找即可。
时空复杂度都为O(n)
class Solution {public int[] twoSum(int[] nums, int target) {int len=nums.length;Map<Integer,Integer> m=new HashMap<>();for(int i=0;i<len;i++){if(m.containsKey(target-nums[i]))return new int[]{i,m.get(target-nums[i])};m.put(nums[i],i);}return null;}
}
手写输入输出
string数组转为int数组再遍历,最后输出答案
import java.util.*;public class Javaacm
{
//输入格式
//[2,7,11,15]
//9public static void main(String []args){Scanner scanner=new Scanner(System.in);String s=scanner.next();String str[]=s.substring(1,s.length()-1).split(",");int target=scanner.nextInt();int len=str.length;int nums[]=new int[len];for(int i=0;i<len;i++){nums[i]=Integer.valueOf(str[i]);}Map<Integer,Integer> m=new HashMap<>();int ans[]=null;for(int i=0;i<len;i++){if(m.containsKey(target-nums[i])){ans=new int[]{i,m.get(target-nums[i])};break;}m.put(nums[i],i);}if(ans==null)System.out.println("null");else System.out.println("["+ans[0]+","+ans[1]+"]");return ;}}
33. 搜索旋转排序数组 - 力扣(LeetCode)
核心代码模式
class Solution {public int search(int[] nums, int target) {int minidx=findmin(nums);int n=nums.length;if(target>nums[n-1])return lowerbound(nums,0,minidx,target);return lowerbound(nums,minidx,n,target);}int findmin(int []nums){int l=0,r=nums.length;int n=nums.length;while(l<r){int mid=(l+r)/2;if(nums[mid]<=nums[n-1])r=mid;else l=mid+1;}return l;}int lowerbound(int []nums,int l,int r,int target){while(l<r){int mid=(l+r)/2;if(nums[mid]>=target)r=mid;else l=mid+1;}return target!=nums[l]?-1:l;}
}
手写输入输出
import java.util.*;public class Javaacm
{
//输入格式
// [4,5,6,7,0,1,2]
// 0static int nums[];static int n;public static void main(String []args){Scanner scanner=new Scanner(System.in);String s=scanner.next();String str[]=s.substring(1,s.length()-1).split(",");int target=scanner.nextInt();n=str.length;nums=new int[n];for(int i=0;i<n;i++)nums[i]=Integer.valueOf(str[i]);int minidx=findmin(target);if(target>nums[n-1])System.out.println(lowerbound(0,minidx,target));else System.out.println(lowerbound(minidx,n,target));return ;}static int findmin(int target){int l=0,r=n;while(l<r){int mid=(l+r)/2;//mid的值<=末尾if(nums[mid]<=nums[n-1]) r=mid;else l=mid+1;}return l;}static int lowerbound(int l,int r,int target){while(l<r){int mid=(l+r)/2;if(nums[mid]>=target)r=mid;else l=mid+1;}return target!=nums[l]?-1:l;}}
200. 岛屿数量 - 力扣(LeetCode)
核心代码模式
class Solution {int dx[]=new int[]{-1,0,1,0};int dy[]=new int[]{0,1,0,-1};boolean visit[][];int n,m;public int numIslands(char[][] grid) {n=grid.length;m=grid[0].length;int ans=0;visit=new boolean[n][m];for(int i=0;i<n;i++){for(int j=0;j<m;j++){if(grid[i][j]=='1'&&visit[i][j]==false){bfs(i,j,grid);ans++;}}}return ans;}void bfs(int x,int y,char[][]grid){visit[x][y]=true;for(int i=0;i<4;i++){int xx=x+dx[i],yy=y+dy[i];if(xx<0||yy<0||xx>=n||yy>=m)continue;if(grid[xx][yy]=='1'&&!visit[xx][yy])bfs(xx,yy,grid);}}
}
手写输入输出
import java.util.*;public class Javaacm
{
//输入格式
// 2 3 行数、列数
// 001
// 100static int dx[]=new int[]{-1,0,1,0};static int dy[]=new int[]{0,1,0,-1};static int n,m;static boolean visit[][];static char grid[][];public static void main(String []args){Scanner scanner=new Scanner(System.in);n=scanner.nextInt();m=scanner.nextInt();grid=new char[n][m];visit=new boolean[n][m];for(int i=0;i<n;i++){String s=scanner.next();grid[i]=s.toCharArray();}int ans=0;for(int i=0;i<n;i++){for(int j=0;j<m;j++){if(!visit[i][j]&&grid[i][j]=='1'){dfs(i,j);ans++;}}}System.out.println(ans);return ;}static void dfs(int x,int y){visit[x][y]=true;for(int i=0;i<4;i++){int xx=x+dx[i],yy=y+dy[i];if(xx<0||yy<0||xx>=n||yy>=m)continue;if(!visit[xx][yy]&&grid[xx][yy]=='1')dfs(xx,yy);}}
}
46. 全排列 - 力扣(LeetCode)
核心代码模式
class Solution {List<List<Integer>> ans=new ArrayList<>();int []num;public List<List<Integer>> permute(int[] nums) {num=nums;Integer path[]=new Integer[nums.length];boolean visit[]=new boolean[nums.length];dfs(0,path,visit);return ans;}void dfs(int deep,Integer []path,boolean visit[]){if(deep==visit.length){ans.add(new ArrayList<>(Arrays.asList(path)));return ;}for(int i=0;i<visit.length;i++){if(visit[i])continue;visit[i]=true;path[deep]=num[i];dfs(deep+1,path,visit);visit[i]=false;}}
}
手写输入输出
import java.util.*;public class Javaacm
{
//输入格式
//[1,2,3]static List<List<Integer>> ans=new ArrayList<>();static Integer nums[];public static void main(String []args){Scanner scanner=new Scanner(System.in);String s=scanner.next();String[] str=s.substring(1,s.length()-1).split(",");int len=str.length;nums=new Integer[len];for(int i=0;i<len;i++)nums[i]=Integer.valueOf(str[i]);boolean visit[]=new boolean[len];Integer path[]=new Integer[len];dfs(0,path,visit);System.out.println(ans);return ;}static void dfs(int deep,Integer[]path,boolean visit[]){if(deep==nums.length){ans.add(new ArrayList(Arrays.asList(path)));return ;}for(int i=0;i<nums.length;i++){if(visit[i])continue;visit[i]=true;path[deep]=nums[i];dfs(deep+1,path,visit);visit[i]=false;}}
}