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

面试经典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;}
}

相关文章:

面试经典150题【91-100】

文章目录 面试经典150题【91-100】70.爬楼梯198.打家劫舍139.单词拆分322.零钱兑换300.递增最长子序列77.组合46.全排列39.组合总和&#xff08;※&#xff09;22.括号生成79.单词搜索 面试经典150题【91-100】 五道一维dp题五道回溯题。 70.爬楼梯 从递归到动态规划 public …...

在 nginx 中使用 JavaScript

前些日子尝试了在 nginx 中写 JavaScript 的效果。考虑到 JavaScript 作为编程语言不是强需求&#xff0c;在nginx生态上还是 lua 独大&#xff0c;并且还有 openresty 这样一直强力输血&#xff0c;大部分应用场景都能找到参考的解决方案。 插件生态来说&#xff0c;github 上…...

【pytorch】安装合集

使用conda或者pip安装的指令 https://pytorch.org/get-started/previous-versions/ 测试pytorch_gpu是否可用的代码 # 测试pytorch是否安装成功 import torch print(torch.__version__) print(torch.cuda.is_available())...

【教程】PLSQL查看表属性乱码解决方法

一、前言 PL/SQL是Oracle数据库的编程语言&#xff0c;用于编写存储过程、触发器、函数等。 今天用plsql想查看表的属性&#xff0c;看看各个字段的注释&#xff0c;可是打开一看&#xff0c;居然是乱码的&#xff0c;如下面这样 如果在使用PL/SQL查看表属性时出现乱码&…...

新书速览|Django 5企业级Web应用开发实战:视频教学版

掌握Django框架开发技能&#xff0c;实战投票应用系统和内容管理系统 本书内容 《Django 5企业级Web应用开发实战&#xff1a;视频教学版》精选当前简单、实用和流行的Django实例代码&#xff0c;帮助读者学习和掌握Django 5框架及其相关技术栈的开发知识。本书系统全面、内容…...

excel创建和部分使用

一.excel导出是在开发中经常操作的内容,对于excel的导出也是有各种成熟的api组件 这里是最近的项目有通过ts处理,这里的内容通过ts ①引入const XlsxPopulate require("xlsx-populate"); const XLSXChart require("xlsx-chart"); 通过命令行操作, pnp…...

pycharm使用远程服务器的jupyter环境

1、确保服务器上安装了jupyter,如果没有&#xff0c;执行下面命令安装 pip install jupyter2、启动jupyter notebook服务 jupyter notebook --no-browser --port8888 --ip0.0.0.0 --allow-root表明在服务器的8888 端口上启动 Jupyter Notebook&#xff0c;并允许从任何 IP 地…...

ES6 基础

文章目录 1. 初识 ES62. let 声明变量3. const 声明常量4. 解构赋值 1. 初识 ES6 ECMAScript6.0(以下简称ES6)是JavaScript语言的下一代标准&#xff0c;已经在2015年6月正式发布了。它的目标&#xff0c;是使得」JavaScript语言可以用来编写复杂的大型应用程序&#xff0c;成为…...

【双指针】Leetcode 有效三角形的个数

题目解析 611. 有效三角形的个数 算法讲解 回顾知识&#xff1a;任意两数之和大于第三数就可以构成三角形 算法 1&#xff1a;暴力枚举 int triangleNumber(vector<int>& nums) {// 1. 排序sort(nums.begin(), nums.end());int n nums.size(), ret 0;// 2. 从…...

python项目练习——4.手写数字识别

使用Python和Scikit-learn库进行机器学习模型训练的项目——手写数字识别。 项目分析&#xff1a; 数据准备&#xff1a;使用公开数据集&#xff08;如MNIST&#xff09;作为训练和测试数据。数据预处理&#xff1a;对图像数据进行归一化、展平等操作&#xff0c;以便输入到机…...

【目标检测】NMS算法的理论讲解

将NMS就必须先讲IOU&#xff0c; IOU就是交并比&#xff0c;两个检测框的交集除以两个检测框的并集就是IOU 为什么要做NMS操作&#xff0c;因为要去除同一个物体的多的冗余检测框 那么NMS算法是如何做的呢&#xff1f; 以上是算法的流程图 下面讲解算法的流程 首先输入是预…...

3-iperf3 使用什么工具可以检测网络带宽、延迟和数据包丢失率等网络性能参数呢?

(1)iperf3简介 1.iperf3简介 2.用途&#xff08;特点&#xff09; 3.下载iperf3地址 &#xff08;2&#xff09;实战 1.iperf3参数 &#xff08;1&#xff09;通用参数&#xff08;客户端和服务器端都是适用的&#xff09; &#xff08;2&#xff09;客户端参数 实验1&…...

阳光倒灌高准直汽车抬头显示器HUD太阳光模拟器

阳光倒灌高准直汽车抬头显示器HUD太阳光模拟器是一种高级别的模拟设备&#xff0c;用于模拟太阳光的光谱、强度及照射角度&#xff0c;应用于太阳能电池板、光伏系统等领域的研究和测试。其参数包括光谱范围、光强度、光源、照射角度、均匀性和稳定性&#xff0c;可根据需求调整…...

jdk11中自定义java类在jvm是如何被查找、加载

yym带你了解jvm源码&#xff0c;openjdk11源码&#xff0c;java类jvm加载原理 jdk11中java类在jvm是如何被1查找、2加载 以下说明的是MiDept类是如何被java classloader 和 jvm加载步骤 上源代码 public static void main(String[] args) {Thread.currentThread().setName…...

单片机---独立按键

[3-1] 独立按键控制LED亮灭_哔哩哔哩_bilibili 按下的时候连接&#xff0c;松开的时候断开。 一头接GND&#xff08;电源负极&#xff09;&#xff0c;另一头接I/O口。 单片机上电时&#xff0c;所有I/O口为高电平。 按键没有按下&#xff0c;I/O口为高电平。 按键按下&…...

java分布式面试快问快答

目录 Java分布式面试宝典50题DubboRedisZookeeper分布式系统设计性能优化与监控安全实践经验 解答DubboRedisZookeeper分布式系统性能优化与监控安全 Java分布式面试宝典50题 Java分布式开发涉及到Dubbo、Redis、Zookeeper等技术&#xff0c;这些技术在实际工作中扮演着重要角…...

AI:148-开发一种智能语音助手,能够理解和执行复杂任务

AI&#xff1a;148-开发一种智能语音助手&#xff0c;能够理解和执行复杂任务 1.背景介绍 随着人工智能技术的飞速发展&#xff0c;智能语音助手已经逐渐成为人们日常生活中不可或缺的一部分。从简单的查询天气、播放音乐&#xff0c;到复杂的日程安排、智能家居控制&#xf…...

Kindling the Darkness:A Practical Low-light Image Enhancer

Abstract 在弱光条件下拍摄的图像通常会出现&#xff08;部分&#xff09;可见度较差的情况。,除了令人不满意的照明之外&#xff0c;多种类型的退化也隐藏在黑暗中&#xff0c;例如由于相机质量有限而导致的噪点和颜色失真。,换句话说&#xff0c;仅仅调高黑暗区域的亮度将不…...

图像处理与视觉感知---期末复习重点(4)

文章目录 一、图像复原与图像增强1.1 概述1.2 异同点 二、图像复原/退化模型2.1 模型图简介2.2 线性复原法 三、彩色基础四、彩色模型五、彩色图像处理 一、图像复原与图像增强 1.1 概述 1. 图像增强技术一般要利用人的视觉系统特性&#xff0c;目的是取得较好的视觉效果&…...

ABAP AMDP 示例

AMDP 是HANA开发中的一种优化模式 按SAP的官方建议&#xff0c;在可以使用Open SQL实现需要的功能或优化目标的时候&#xff0c;不建议使用AMDP。而在需要使用Open SQL不支持的特性&#xff0c;或者是大量处理流和分析导致了数据库和应用服务器之间有重复的大量数据传输的情况…...

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...

【第二十一章 SDIO接口(SDIO)】

第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...

SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现

摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序&#xff0c;以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务&#xff0c;提供稳定高效的数据处理与业务逻辑支持&#xff1b;利用 uniapp 实现跨平台前…...

Python如何给视频添加音频和字幕

在Python中&#xff0c;给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加&#xff0c;包括必要的代码示例和详细解释。 环境准备 在开始之前&#xff0c;需要安装以下Python库&#xff1a;…...

Spring AI 入门:Java 开发者的生成式 AI 实践之路

一、Spring AI 简介 在人工智能技术快速迭代的今天&#xff0c;Spring AI 作为 Spring 生态系统的新生力量&#xff0c;正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务&#xff08;如 OpenAI、Anthropic&#xff09;的无缝对接&…...

ArcGIS Pro制作水平横向图例+多级标注

今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作&#xff1a;ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等&#xff08;ArcGIS出图图例8大技巧&#xff09;&#xff0c;那这次我们看看ArcGIS Pro如何更加快捷的操作。…...

OPENCV形态学基础之二腐蚀

一.腐蚀的原理 (图1) 数学表达式&#xff1a;dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一&#xff0c;腐蚀跟膨胀属于反向操作&#xff0c;膨胀是把图像图像变大&#xff0c;而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...

招商蛇口 | 执笔CID,启幕低密生活新境

作为中国城市生长的力量&#xff0c;招商蛇口以“美好生活承载者”为使命&#xff0c;深耕全球111座城市&#xff0c;以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子&#xff0c;招商蛇口始终与城市发展同频共振&#xff0c;以建筑诠释对土地与生活的…...

uniapp 字符包含的相关方法

在uniapp中&#xff0c;如果你想检查一个字符串是否包含另一个子字符串&#xff0c;你可以使用JavaScript中的includes()方法或者indexOf()方法。这两种方法都可以达到目的&#xff0c;但它们在处理方式和返回值上有所不同。 使用includes()方法 includes()方法用于判断一个字…...

从 GreenPlum 到镜舟数据库:杭银消费金融湖仓一体转型实践

作者&#xff1a;吴岐诗&#xff0c;杭银消费金融大数据应用开发工程师 本文整理自杭银消费金融大数据应用开发工程师在StarRocks Summit Asia 2024的分享 引言&#xff1a;融合数据湖与数仓的创新之路 在数字金融时代&#xff0c;数据已成为金融机构的核心竞争力。杭银消费金…...