当前位置: 首页 > news >正文

面试算法刷题3(核心+acm)

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;}}
}

相关文章:

  • 【typenum】 14 测试用例(build.rs)
  • SymPy|主元、重新表示、分数、约分表达式、极限、级数、ode、获取值、输出形式
  • 焊接结构动力疲劳计算
  • 阿里云CDN刷新预热--刷新URL
  • 《具身智能机器人:自修复材料与智能结构设计的前沿探索》
  • Unity-编辑器扩展
  • 字符画生成(伟大的CSDN)
  • Linux周测(一)
  • 分治思想在算法(目标检测)中的体现
  • 工业智能网关在工业锅炉安全监控中的组网配置指南
  • 【Sentry运维】25.4.0版本安装
  • 构建AI时代的大数据基础设施-MaxCompute多模态数据处理最佳实践
  • SpringMVC04所有注解按照使用位置划分| 按照使用层级划分(业务层、视图层、控制层)
  • 【VS Code】Qt程序的调试与性能分析
  • 【Redis】哈希表结构
  • 网络学习中通信方面的相关知识、及再次解读B=2W
  • 大语言模型 14 - Manus 超强智能体 开源版本 OpenManus 上手指南
  • Kruise Rollout金丝雀发布
  • 《棒球知识百科》亚冬会有哪些国家参加·棒球1号位
  • [luogu12541] [APIO2025] Hack! - 交互 - 构造 - 数论 - BSGS
  • 海南省市监局与香港标准及检定中心签署合作协议,加快检验检测国际化
  • 连续两个交易日涨停,华夏幸福:生产经营活动正常,不存在影响股价波动的重大事宜
  • 黄仁勋:新一代计算平台GB300三季度上市,AI计算能力每十年提升100万倍
  • 抖音开展“AI起号”专项治理,整治利用AI生成低俗猎奇视频等
  • AI快速迭代带来知识焦虑,褚君浩院士提出“四维能力模型”
  • 一女游客在稻城亚丁景区因高反去世,急救两个多小时未能恢复生命体征