codetop高频(3)
二叉树的层序遍历
使用arraydeque来实现队列存放Node节点,集合的使用较为多
/*** 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<>();Queue<TreeNode> que=new ArrayDeque<>();if(root==null)return ans;que.offer(root);while(!que.isEmpty()){int n=que.size();List<Integer> layer=new ArrayList<>();for(int i=0;i<n;i++){TreeNode cur=que.poll();layer.add(cur.val);if(cur.left!=null)que.offer(cur.left);if(cur.right!=null)que.offer(cur.right);}ans.add(layer);}return ans;}
}
搜索旋转排序数组
先去找最小位置的下标,然后再判断去左右哪边进行二分查找,注意越界和不等情况。
class Solution {public int search(int[] nums, int target) {int minidx=findMin(nums);int len=nums.length;if(target<=nums[len-1])return findTarget(nums,minidx,len,target);return findTarget(nums,0,minidx,target);}int findMin(int []nums){int len=nums.length;int l=0,r=len;while(l<r){int mid=(l+r)>>1;if(nums[mid]<=nums[len-1])r=mid;else l=mid+1;}return l;}int findTarget(int []nums,int l,int r,int target){int len=nums.length;while(l<r){int mid=(l+r)>>1;if(nums[mid]>=target)r=mid;else l=mid+1;}if(l>=len||nums[l]!=target)return -1;else return l;}
}
岛屿数量
初始化4个方位的数组,一个岛屿二维数组和visit数组
遍历每一个元素,如果找到了没走过的岛屿就dfs并+1
dfs:遍历四个方位算出当前位置,如果越界就跳过,如果不是岛屿或者走过了就跳过
否则标记走过并进入。
class Solution {char[][]grid;boolean visit[][];int ans=0;int n,m;int dx[]=new int[]{-1,0,1,0};int dy[]=new int[]{0,-1,0,1};public int numIslands(char[][] grid) {this.grid=grid;n=grid.length;m=grid[0].length;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]){ dfs(i,j);ans++;}}}return ans;}void dfs(int beginx,int beginy ){for(int i=0;i<4;i++){int curx=dx[i]+beginx,cury=dy[i]+beginy;if(curx<0||cury<0||curx>=n||cury>=m)continue;if(visit[curx][cury]||grid[curx][cury]!='1')continue;visit[curx][cury]=true;dfs(curx,cury); }}
}
两数之和
使用map的containsKey函数判断一个元素是否在集合里。
在就返回,不在就放入。
class Solution {public int[] twoSum(int[] nums, int target) {int len=nums.length;Map<Integer,Integer> map=new HashMap<>();for(int i=0;i<len;i++){if(map.containsKey(target-nums[i])){return new int[]{i,map.get(target-nums[i])};}map.put(nums[i],i);}return null;}
}
全排列
一个path数组,一个visit数组(回溯算法需要path)
dfs遍历的时候注意删除判断,用size()-1进行
class Solution {List<List<Integer>> ans=new ArrayList<>();List<Integer> path=new ArrayList<>();boolean visit[];public List<List<Integer>> permute(int[] nums) {int n=nums.length;visit=new boolean[n];dfs(nums,0);return ans;}void dfs(int []nums,int deep){if(deep==nums.length){ans.add(new ArrayList<>(path));}for(int i=0;i<nums.length;i++){if(visit[i])continue;visit[i]=true;path.add(nums[i]);dfs(nums,deep+1);visit[i]=false;path.remove(path.size()-1);}}
}