面试经典150题【91-100】

文章目录

  • 面试经典150题【91-100】
    • 70.爬楼梯
    • 198.打家劫舍
    • 139.单词拆分
    • 322.零钱兑换
    • 300.递增最长子序列
    • 77.组合
    • 46.全排列
    • 39.组合总和(※)
    • 22.括号生成
    • 79.单词搜索

面试经典150题【91-100】

五道一维dp题+五道回溯题。

70.爬楼梯

在这里插入图片描述
从递归到动态规划

    public int climbStairs(int n) {if(n==0) return 1;if(n==1) return 1;if(n==2) return 2;return climbStairs(n-1) + climbStairs(n-2);}

这样会超时,然后把他放到数组里。

public int climbStairs(int n) {int[]ans = new int[n+1];ans[0]=1;ans[1]=1;for(int i=2;i<n+1;i++){ans[i]=ans[i-1] + ans[i-2];}return ans[n];}

然后你也可以将数组再简化为两个变量。因为只与前两个变量有关。

198.打家劫舍

在这里插入图片描述

class Solution {public int rob(int[] nums) {if(nums.length == 0) return 0;int N=nums.length;int[] dp=new int[N+1];dp[0]=0;dp[1]=nums[0];for(int i=2;i<N+1;i++){// 第2家 dp[2], 不偷dp[1],  偷 dp[0]+nums[1]dp[i]=Math.max(nums[i-1]+dp[i-2],dp[i-1]);}return dp[N];}
}

一维dp的子问题,基本就是与dp[i-1]和dp[i-2]有关系。

139.单词拆分

在这里插入图片描述

class Solution {public boolean wordBreak(String s, List<String> wordDict) {Set<String> wordDictSet = new HashSet(wordDict);int maxLen=0;for(String str:wordDictSet){maxLen = Math.max(maxLen,str.length());}boolean[] dp=new boolean[s.length() +1];dp[0]=true;for(int i=0;i<s.length()+1;i++){for(int j=Math.max(0,i-maxLen);j<i;j++){if(dp[j] && wordDictSet.contains(s.substring(j,i))){dp[i]=true;break;}}}return dp[s.length()];}
}

dp[i]代表从0到i这个字符串成不成。

322.零钱兑换

在这里插入图片描述
做一个长度为amount +1 的数组,每个位置代表着i能不能被硬币拼凑。
要注意初始化dp[0]=0

class Solution {public int coinChange(int[] coins, int amount) {int[] dp=new int[amount+1];Arrays.fill(dp,amount+1);dp[0]=0;for(int i=0;i<amount+1;i++){for(int j=0;j<coins.length;j++){if(i-coins[j]>=0)dp[i] = Math.min(dp[i],1+dp[i-coins[j]]);}}return dp[amount]>amount? -1:dp[amount];}
}

300.递增最长子序列

在这里插入图片描述

class Solution {public int lengthOfLIS(int[] nums) {//dp[i] 为必须包含第 i 个元素的最长递增子序列int[] dp=new int[nums.length];Arrays.fill(dp,1);for(int i=0;i<nums.length;i++){for(int j=0;j<i;j++){if(nums[i]>nums[j]){dp[i]=Math.max(dp[i],dp[j]+1);}}}int ans=0;for(int i=0;i<nums.length;i++){ans=Math.max(ans,dp[i]);}return ans;}
}

77.组合

在这里插入图片描述
画一个递归的树图
在这里插入图片描述

class Solution {public List<List<Integer>> combine(int n, int k) {List<List<Integer>> res = new ArrayList<>();if (k <= 0 || n < k) {return res;}// 从 1 开始是题目的设定Deque<Integer> path = new ArrayDeque<>();dfs(n, k, 1, path, res);return res;}private void dfs(int n, int k, int begin, Deque<Integer> path, List<List<Integer>> res) {//终止条件是path的长度等于kif(path.size() == k){res.add(new ArrayList<>(path));return ;}//以i开头,n结尾for(int i=begin;i<=n;i++){path.addLast(i);dfs(n,k,i+1,path,res);path.removeLast();}}}

或者换一个树的类型,选与不选。只修改dfs即可
在这里插入图片描述

class Solution {public List<List<Integer>> combine(int n, int k) {List<List<Integer>> res = new ArrayList<>();if (k <= 0 || n < k) {return res;}// 从 1 开始是题目的设定Deque<Integer> path = new ArrayDeque<>();dfs(n, k, 1, path, res);return res;}private void dfs(int n, int k, int begin, Deque<Integer> path, List<List<Integer>> res) {//终止条件是path的长度等于kif(path.size() == k){res.add(new ArrayList<>(path));return ;}if(begin == n+1){return ;}//不加新元素dfs(n,k,begin+1,path,res);//添加新元素path.addLast(begin);dfs(n,k,begin+1,path,res);path.removeLast();}}

要对begin也做限制。
总体的板子还是。做一个helper函数,终止条件,dfs,这一步要加的,dfs,减去这一步加的。

46.全排列

在这里插入图片描述

class Solution {public List<List<Integer>> permute(int[] nums) {int len=nums.length;List<List<Integer>> res=new ArrayList<>();if(len == 0) return res;boolean[] used=new boolean[len];List<Integer> path=new ArrayList<>();dfs(nums,len,0,path,used,res);return res;}private void dfs(int[] nums, int len, int depth,List<Integer> path, boolean[] used,List<List<Integer>> res) {if(depth == len){res.add(new ArrayList<>(path));return;}for(int i=0;i<len;i++){if(!used[i]){path.add(nums[i]);used[i]=true;dfs(nums, len, depth + 1, path, used, res);used[i]=false;path.remove(path.size()-1);}}}
}

要用一个used数组记录哪个位置被使用。

39.组合总和(※)

在这里插入图片描述
在这里插入图片描述

class Solution {public static List<List<Integer>> combinationSum(int[] candidates, int target) {int len = candidates.length;List<List<Integer>> res = new ArrayList<>();if (len == 0) {return res;}// 排序是剪枝的前提Arrays.sort(candidates);Deque<Integer> path = new ArrayDeque<>();dfs(candidates, 0, len, target, path, res);return res;}public static void dfs(int[] candidates,int begin,int len,int target,Deque<Integer>path,List<List<Integer>> res){if (target == 0) {res.add(new ArrayList<>(path));return;}for(int i=begin;i<len;i++){if(target-candidates[i] <0) break;path.addLast(candidates[i]);dfs(candidates,i,len,target-candidates[i],path,res);path.removeLast();}}
}

注意dfs中的i , 从begin到len , 并且也要传递到下一个dfs中去。

  • 排列问题,讲究顺序(即 [2, 2, 3] 与 [2, 3, 2] 视为不同列表时),需要记录哪些数字已经使用过,此时用 used 数组;

  • 组合问题,不讲究顺序(即 [2, 2, 3] 与 [2, 3, 2] 视为相同列表时),需要按照某种顺序搜索,此时使用 begin 变量。

22.括号生成

在这里插入图片描述

class Solution {public static List<String> generateParenthesis(int n) {List<String> res = new ArrayList<>();String cur = "";int left = 0, right = 0;dfs(res, cur, n, left, right);return res;}public static void dfs(List<String> res, String cur, int n, int left, int right) {if (left > n || left < right)return;if (cur.length() == 2 * n) {res.add(cur);}if (left < n)dfs(res, cur + "(", n, left + 1, right);if (right < n)dfs(res, cur + ")", n, left, right + 1);}
}

这种是直接将修改的新字符串传递给函数。

public class LC22 {public static List<String> generateParenthesis(int n) {List<String> res=new ArrayList<>();StringBuilder sb=new StringBuilder();int left=0,right=0;dfs(res,sb,n,left,right);return res;}public static void dfs(List<String> res,StringBuilder sb,int n,int left,int right){if(left >n || left<right) return;if(sb.length()== 2*n && left ==n){res.add(sb.toString());return;}if(left<n){sb.append("(");dfs(res,sb,n,left+1,right);sb.deleteCharAt(sb.length()-1);}if(right<n){sb.append(")");dfs(res,sb,n,left,right+1);sb.deleteCharAt(sb.length()-1);}}public static void main(String[] args) {System.out.println(generateParenthesis(3));}
}

这种就是很典型的回溯了,增加了再删除。

79.单词搜索

在这里插入图片描述
以每一个字母为开头进行搜索。搜索过程就是dfs的上下左右。
遍历到成功后要置为’\0’,这样可以防止第二次遍历到,结束了要改回来。
k代表遍历到word字符串的哪个变量了

public class LC79 {public boolean exist(char[][] board, String word) {char[] words = word.toCharArray();for(int i = 0; i < board.length; i++) {for(int j = 0; j < board[0].length; j++) {if (dfs(board, words, i, j, 0)) return true;}}return false;}public boolean dfs(char[][] board, char[] word, int i, int j, int k) {if (i < 0 || j < 0 || i > board.length - 1 || j > board[0].length - 1 || board[i][j] != word[k]) return false;if (k == word.length - 1) return true;board[i][j] = '\0';boolean ans = dfs(board, word, i + 1, j, k + 1) || dfs(board, word, i - 1, j, k + 1) ||dfs(board, word, i, j - 1, k + 1) || dfs(board, word, i, j + 1, k + 1);board[i][j] = word[k];return ans;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/772622.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

idea中Git项目遇到“Filename too long”错误 与 配置Git的ssh证书

一&#xff1a;“Filename too long”问题解决办法 错误信息&#xff1a; fatal: cannot create directory at xxxx: Filename too long warning: Clone succeeded, but checkout failed. You can inspect what was checked out with git status and retry with git restore …

24/03/26总结

面向对象练习题&#xff1a;&#xff08;封装&#xff0c;继承&#xff0c;多态) 封装&#xff1a;对象代表什么&#xff0c;就得封装对应的数据&#xff0c;并提供数据对应的行为,(把零散的数据和行为封装成一个整体&#xff1a;也就是我们说的对象&#xff09; 继承:当封装…

latex中的算法algorithm报错Undefined control sequence.

这里写目录标题 1. 错误原因2. 进行改正3. 爱思唯尔期刊与施普林格期刊对于算法的格式不太一样&#xff0c;不能直接套用总结 1. 错误原因 我在算法中使用\State 2. 进行改正 换成\STATE 3. 爱思唯尔期刊与施普林格期刊对于算法的格式不太一样&#xff0c;不能直接套用 总…

多线程执行一半后不往后走的坑

场景简单演示 首先演示一个简单的场景。 采用ThreadPoolExecutor提交线程的方式&#xff0c;直接在多线程中执行的某个地方抛出一个异常。 用submit方法提交的情况&#xff1a; 调用的地方&#xff1a; 发现一直卡在那&#xff0c;没有任何错误日志。 改成execute方法提交多…

优秀电源工程师需要的必备技能

随着电源市场的不断扩张,开关电源行业飞速发展,企业对电源工程师的需求日益增加,对电源工程师的技能要求也日渐提高,相信没有一位电源工程师会错过让自己变得更优秀的机会。作为一名数字电源从业者,今天就带大家细数一下优秀电源工程师具备的那些技能。 一、新手必备课程…

#GIT|Git Flow#Gitflow工作流程

Gitflow是一种使用功能分支和多个主分支的Git分支模型&#xff0c;它适用于有预定发布周期的项目&#xff0c;也适用于DevOps最佳实践中的持续交付。这个工作流程不会添加任何新的概念或命令&#xff0c;而是为不同的分支分配了非常具体的角色&#xff0c;并定义了它们应该如何…

串口通信标准RS232 RS485 RS422的区别

RS-232、RS-422、RS-485是关于串口通讯的一个机械和电气接口标准&#xff08;顶多是网络协议中的物理层&#xff09;&#xff0c;不是通讯协议&#xff0c;它们之间的几个不同点如下&#xff1a; 一、硬件管脚接口定义不同 二、工作方式不同 RS232&#xff1a; 3线全双工 RS…

干货分享之反射笔记

入门级笔记-反射 一、利用反射破泛型集合二、Student类三、获取构造器的演示和使用1.getConstructors只能获取当前运行时类的被public修饰的构造器2.getDeclaredConstructors:获取运行时类的全部修饰符的构造器3.获取指定的构造器3.1得到空构造器3.2得到两个参数的有参构造器&a…

Vue2(十一):全局事件总线、消息订阅与发布pubsub、TodoList的编辑功能、$nextTick、过渡与动画

一、全局事件总线 1、思路解析 一种组件间通信的方式&#xff0c;适用于任意组件间通信。通俗理解就是一个定义在所有组件之外的公共x&#xff0c;这个x可以有vm或vc上的同款$on、$off、$emit&#xff0c;也可以让所有组件都访问到。 第一个问题&#xff1a;那怎样添加这个x才…

自省式RAG 与 LangGraph的实践

自省式 RAG 对实现 RAG 的步骤进行逻辑分析&#xff1a;比如&#xff0c;我们需要知道什么时候进行检索&#xff08;基于问题和索引的构成&#xff09;、何时改写问题以提升检索效率&#xff0c;或者何时抛弃无关的检索结果并重新检索。因此提出了自省式 RAG&#xff0c;自省式…

[医学分割大模型系列] (3) SAM-Med3D 分割大模型详解

[医学分割大模型系列] -3- SAM-Med3D 分割大模型解析 1. 特点2. 背景3. 训练数据集3.1 数据集收集3.2 数据清洗3.3 模型微调数据集 4. 模型结构4.1 3D Image Encoder4.2 3D Prompt Encoder4.3 3D mask Decoder4.4 模型权重 5. 评估5.1 评估数据集5.2 Quantitative Evaluation5.…

【详细讲解yarn的安装和使用】

&#x1f308;个人主页:程序员不想敲代码啊&#x1f308; &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家&#x1f3c6; &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提…

面向对象【Annotation注解】

文章目录 注解概述注解与注释常见的 Annotation最基本的注解使用@Override@Override@SuppressWarnings元注解@Retention@Target@Documented@Inherited自定义注解格式定义使用注解概述 注解(Annotation)是从 JDK5.0 开始引入,以“@注解名”在代码中存在。例如: @Override @D…

Git入门(Git快速下载,安装,配置,远程仓库,本地仓库,IDEA提交代码,VScode提交代码使用方案一体)

Git快速下载 通过阿里镜像可以自由挑选版本并快速下载CNPM Binaries Mirrorhttp://npm.taobao.org/mirrors/git-for-windows/ 这里安装最新版本 下载安装文件 安装完后双击文件即可开始安装git 安装 git的安装傻瓜式Next即可 配置 打开git&#xff1a;桌面空白处右击&#…

SolidWorks教育版本的优势是什么

随着工程设计和制造技术的不断进步&#xff0c;计算机辅助设计&#xff08;CAD&#xff09;软件在教育领域的应用越来越广泛。SolidWorks教育版本作为一款专为教育机构和学生设计的三维CAD软件&#xff0c;具有许多明显的优势。本文将探讨SOLIDWORKS教育版本的主要优势&#xf…

谁再问你数据库三范式,这篇文章甩给他!!!

前几天有粉丝私信说面试被问到了数据库三范式&#xff08;面试问这种的不去也好&#xff09;&#xff0c;今天我们就来聊聊。在数据库设计的过程中&#xff0c;为了确保数据的准确性和完整性&#xff0c;我们通常遵循一定的规则和标准&#xff0c;其中最为人所熟知的便是“数据…

linux文本三剑客 --- grep、sed、awk

1、grep grep&#xff1a;使用正则表达式搜索文本&#xff0c;将匹配的行打印出来&#xff08;匹配到的标红&#xff09; 命令格式&#xff1a;grep [option] pattern file <1> 命令参数 -A<显示行数>&#xff1a;除了显示符合范本样式的那一列之外&#xff0c;并…

开源博客项目Blog .NET Core源码学习(11:App.Core项目结构分析)

开源博客项目Blog的App.Core项目主要定义数据库表对应的数据类&#xff0c;同时定义配置文件读取、日志记录、辅助缓存等辅助类。App.Core项目安装的Nuget包不多&#xff0c;仅包括SqlSugarCore和Microsoft.Extensions.DependencyInjectio两类。   App.Core项目的顶层文件夹如…

TouchGFX之Drawable

TouchGFX框架中的所有控件均为Drawable类的子类。 该类别包含控制大小和位置的一般方法。 #ifndef TOUCHGFX_DRAWABLE_HPP #define TOUCHGFX_DRAWABLE_HPP #include <touchgfx/Bitmap.hpp> #include <touchgfx/events/ClickEvent.hpp> #include <touchgfx/event…

WEB测试之兼容性测试

1. 软件兼容性测试 兼容性测试是指待测试项目在特定的硬件平台上&#xff0c;不同的应用软件之间&#xff0c;不同的操作系统平台上&#xff0c;在不同的网络等环境中能正常的运行的测试。 兼容性测试的目的&#xff1a;待测试项目在不同的操作系统平台上正常运行&#xff0c…