常见算法面试题目

前言

总结一些常见的算法题目,每一个题目写一行思路,方便大家复习。具体题目的来源是下面的网站。

剑指offer

剑指offe2

leetcode200题

leetcode 100题

leetcode150题

leetcode 75题

文章目录

  • 前言
  • 二叉树非递归遍历
  • 牛客
    • JZ31 栈的压入、弹出序列 (8/4)
    • JZ4 二维数组中的查找
    • JZ11 旋转数组中的最小数字
    • JZ44数字序列中某一位的数字
    • JZ42 连续子数组的最大和
  • leetcode 100题思路整理
    • 前10题
    • 10-19题
    • 20-29题
    • 30-39题
    • 40-50 题
  • leetcode 150题
    • 数组/字符串
    • 双指针/滑动窗口
    • 矩阵
    • 30-40题
  • 牛客
    • 动态规划
    • 回溯
    • 0-1背包

二叉树非递归遍历

前序遍历方法一

  • 直接右边放入栈,然后左边放入栈。
    public List<Integer> preorderTraversal(TreeNode root) {List<Integer>ans = new ArrayList<>();if (root == null) return ans;Stack<TreeNode>st = new Stack<>();st.add(root);while (!st.empty()) {TreeNode node = st.pop();ans.add(node.val);if (node.right != null) st.add(node.right);if (node.left != null) st.add(node.left);}return ans;}
// 方法二 
public List<Integer> preorderTraversal(TreeNode root) {List<Integer>ans = new ArrayList<>();Stack<TreeNode>st = new Stack<>();TreeNode node = root;while (node != null || !st.empty()) {while (node != null) {ans.add(node.val);st.add(node);node = node.left;}node = st.pop();node = node.right;}return ans;

中序遍历

  • 首先把root放进去
  • 尽可能往左走,并且入栈
  • 出栈,统计结果,往右走
    public List<Integer> inorderTraversal(TreeNode root) {List<Integer>ans = new ArrayList<>();Stack<TreeNode>st = new Stack<>();while (root != null || !st.empty()) {while (root != null) {st.add(root);root = root.left;}root = st.pop();ans.add(root.val);root = root.right;}return ans;}

后续遍历

  • 增加pre防止再重新入栈
  • 首先把root放进去
  • 尽可能往左走,并且入栈
  • 出栈,如果右边没有了或者右边已经遍历过了:输出,更新pre,root置空
  • 否则,右边入栈。
class Solution {public List<Integer> postorderTraversal(TreeNode root) {List<Integer>ans = new ArrayList<>();Stack<TreeNode>st = new Stack<>();TreeNode pre = null;while (root != null || !st.empty()) {while (root != null) {st.add(root);root = root.left;}root = st.pop();if (root.right == null || root.right == pre) {ans.add(root.val);pre = root;root = null;} else {st.add(root);root = root.right;}}return ans;}
}

牛客

JZ31 栈的压入、弹出序列 (8/4)

【2,1,0】【1,2,0】是true,但是如果使用if进行出栈,就会成false。

每次只要栈不空,并且栈顶和当前的pop一致,就应该直接出栈。

  • 先出栈
  • 后入栈
  • 最后除了循环再判断

JZ4 二维数组中的查找

  • 左上角开始

JZ11 旋转数组中的最小数字

  • 如果相等,最小的一定可以是m,所以r一定可以进行缩小
  • 需要和r进行比较

这个可以由以下三种情况总结出来

  • 如果逆序:前面的都小于,所以l一直加
  • 如果顺序: 没有大于nums[n - 1]的,所以r一直减。
  • 如果前顺,后顺

前面的最小值,大于nums[n - 1]。所以当大于,l加,当小于r减。

综合上面三种情况,可以使用二分查找。

  • 当大于的时候l加
  • 当小于的时候l减。

然后等于的时候

  • 如果是r, m在[l, r - 1]中
  • 如果不是r, 那么r就可以直接向前移动一个。因为r排除了。

JZ44数字序列中某一位的数字

  • 首先判断是几位数字
  • 然后计算是第几个数字 (n - 1) /digit
  • 最后计算第几位 (n - 1) % digit

JZ42 连续子数组的最大和

  • ans = INT_MIN
  • s = 0, minv = 0;// 这两个是对应给sun[0]的值。
  • 先更新ans,再更新minv

leetcode 100题思路整理

前10题

  • 两数之和:

    • 使用hash,需要保证两者下标不相同。使用排序处理唯一的就很简单

    • 如果需要寻找多个,那么hash还是会简单。边存,边处理。

    • 排序寻找多个的情况下,相等一定出现在中间,但是不一定就一组。所以while之后,不能break,而是i++, j–继续寻找下一组相等的

  • 两数相加:链表中创建新结点,需要使用p,并且p需要每次移动。如果创建新结点就不用了

  • 无重复字符的最长子串:双指针,java使用int[]数组更快

  • 最长回文子串

  • 正则表达式匹配:*的时候,小优化,类似于完全背包问题的优化,可以考虑直接使用dfs进行求解。只有当j不变的时候,匹配多个。

    • j - 1, i - 1表示当前字符
    • i= 0的时候s是空串
  • 盛水最多的容器:经典双指针。

  • 三数之和。排序、保证数字相等的时候continue就行了。

10-19题

  • 电话号码的字母组合:简单dfs,使用string保存映射
  • 删除链表倒数第N个结点。从nhead向前走N + 1个,然后删除下一个结点
  • 有效的阔号组合:简单stack应用
  • 合并两个有序链表,p,并且p不断移动。就算最后 = null的时候也需要移动
  • 括号生成:简单dfs。使用curl或者sum进行flag标志
  • 合并k个升序列表:Priority_Queue的排序函数重写。如果放入队列的为空指针,会报错
  • 下一个排列: Arrays.sort(nums, j + 1, n), 第一个比这个数字大的数字
    • 找到第一个可以增大的位数
    • 找到大于他的最小的数字
    • 从它后一位往后进行排序,这样就是最小的了。
  • 数字序列中某一位数字:第k位开始数字start, 第k位数字个数sum。n / k, n % k就是对应的数字和对应的位数
  • 最长有效阔号:不会空间优化。stack +dp进行解决。stack中存储下标。f:表示以i结尾的最大的值。 ans = max(f[i])
  • 搜索旋转排序数组:直接和nums[0]进行比较,小于一定是右边的

20-29题

  • 排序数组中查找元素的第一个和最后一个位置-lower_bound,upper_bound
  • 组合总数-dfs, 从本层的最后一个数字开始,也就是从i开始
  • 接雨水:ans += 左右最大的最小的-cur
  • 全排列-简单dfs
  • 旋转图像-矩形,所以旋转是(n / 2), (n + 1) / 2就行了。另外对应关系是行变列,列变行。然后数量关系是n - j - 1,另一个是i。或者两另一个是n - i - 1, 另一个是j。试一下就行了。
  • 字母异位词分组:使用cnt进行计数,使用toString()转换成字符串
  • 最大子数组和:求前缀和的最小值。更新的时候sum、ans, minv依次更新就行了
  • 跳跃游戏:空间优化cur,就行了
  • 合并区间:当前区间的第二维,应该是ans.get[ans.size() - 1]第二维和当前区间第二维的最大值。
  • 不同路径:初始化f(0, 0) = 1, 然后让f(i, j) += f(i - 1, j) + f(i, j - 1);

30-39题

  • 最小路径和:摘樱桃
  • 爬楼梯:斐波那契
  • 编辑距离:直接dfs做就行了。参照正则表达式匹配
  • 颜色分类:快慢双指针。i永远指向第一个不为0的,j找到下一个为0的,与他交换
  • 最小覆盖子串:滑动窗口,满足贪心的双指针,如果窗口中没有,就没有必要继续了。
  • 子集:二进制枚举
  • 单词搜索:
  • 柱状图中最大矩形:单调栈,找左右小于它的第一个坐标,然后就可以求宽度了。
  • 最大矩形:前缀和 + 单调栈
  • 二叉树的中序遍历:简单

40-50 题

  • 不同二叉搜索树

leetcode 150题

数组/字符串

  • 合并两个有序数组
  • 删除有序数组的重复项II。(nums[i] != nums[j - 1] || nums[i] != nums[j - 2])swap(nums[j++], nums[i])
  • 轮转数组(整体轮转,[0, k), [k, n))
  • O(1) 时间插入、删除和获取随机元素: map保存下标,删除最后一个元素
  • 左右文本对齐

双指针/滑动窗口

  • 子串。子数组。
  • 最小覆盖子串
  • h指数
  • 串联所有单词的子串

矩阵

  1. 矩阵置0,但标志法,逆序处理每一行。最后一行可以直接进行处理。
  2. 矩阵旋转:上下,然后主对角线。注意i,j的取值范围。
  3. 螺旋矩阵:最简的办法,就是直接改变当前的矩阵。但是可能会给别的函数造成问题。+ 101,然后减去101就行了。
  4. 生命游戏:当前矩阵进行编码,进行转换
  5. 数读游戏:可以三个矩阵 + hash运算进行判断。然后可以使用Space数组保存空格,然后把空格进行填充,使用bool dfs就行了。

30-40题

牛客

动态规划

  • 跳台阶扩展:最后一步可以跳1,2…i- 1。不能最后一步不跳,所以是1~n,最少跳一步。
  • 矩形覆盖:类似兔子月。f[0] = 0, f[1] = 1, f[2] = 2; 注意n <= 1的情况。让f开大一点
  • 礼物最大价值:直接简单dp。
  • 把数字翻译成字符串:特殊情况“10”, “100”。
    • 如果当前为0,不能加上f[i - 1]
    • 如果前面为0,或者组成数字大于26,不能加上f[i - 2]

回溯

  • 矩阵的路径:

    • 字符相同的时候才能继续向下寻找。
    • 回溯,需要让vis变成0。
  • JZ13 机器人的运动范围

    • 思路出错,应该是直接从(0, 0)dfs,结果想成了遍历整个矩阵了。
    • 正确的思路应该是从(0, 0)开始dfs或者bfs。

0-1背包

  • 2787. 将一个数字表示成幂的和的方案数:n

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

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

相关文章

软考网络工程师教程第五版(2018最新版)

软考网络工程师教程第五版(2018最新版) 内容简介 本书是全国计算机技术与软件专业技术资格(水平)考试指定用书。作者在前4版的基础上,根据网络工程师新版大纲的要求,针对考试的重点内容做了较大篇幅的修订,书中主要内容包括数据通信、广域通信网、局域网、城域网、因特网…

Python 创建第一个项目

打开pycharm编辑器 点击New Project创建一个新项目。 主要修改项目名和项目路径&#xff0c;其它保持默认&#xff0c;点击Create。 当编辑器创建好项目后&#xff0c;我们通过右键项目名&#xff0c;点击New&#xff0c;再点击Python File 创建一个Python文件。 写好文件名&a…

Motionface VoiceFocus使用教程

Motionface VoiceFocus使用教程 1&#xff1a;系统要求 软件运行支持32位/64位window 10/11系统, 其他要求无。 2&#xff1a;下载安装 链接&#xff1a;百度网盘 请输入提取码 提取码&#xff1a;1234 复制这段内容后打开百度网盘手机App&#xff0c;操作更方便哦 下载VoiceFo…

69.乐理基础-打拍子-大切分与变体

内容来源于&#xff1a;三分钟音乐社 前置内容&#xff1a;66.乐理基础-打拍子-小切分-CSDN博客 上一个内容&#xff1a;68.乐理基础-打拍子-大附点与变体-CSDN博客 大切分&#xff1a; 把每个小切分的每一个音符翻一倍就变成大切分了&#xff0c;小切分是两个十六分音符夹一…

08 通信协议之UART

引言&#xff1a; 从本文开始&#xff0c; 本个专题之后的几篇文章都是讲解嵌入式开发中几种常见的通信协议的&#xff0c; 比如UART, I2C&#xff0c;SPI&#xff0c; CAN总线这些我就不讲了&#xff0c; 没用到过&#xff0c; 学是学不完的&#xff0c; 等用到的时候再去学习…

什么情况下不应该使用 LockWindowUpdate ?

在之前的文章中&#xff0c;我们将了解了 LockWindowUpdate 应该在什么场景下使用&#xff0c;也就是拖动的场景。 今天&#xff0c;我们来看看 LockWindowUpdate 被误用的一些场景。 人们看到 LockWindowUpdate 的“您锁定的窗口将无法重新绘制自身”行为&#xff0c;并将其…

磁盘阵列(RAID)

1.独立硬盘冗余阵列&#xff08;RAID, Redundant Array of Independent Disks&#xff09; 旧称廉价磁盘冗余阵列&#xff08;Redundant Array of Inexpensive Disks&#xff09;&#xff0c;简称磁盘阵列 用虚拟化存储技术把多个硬盘组合起来&#xff0c;成为一个或多个硬盘阵…

Spark魔力:招聘网站数据深度分析系统

Spark魔力&#xff1a;招聘网站数据深度分析系统 简介数据集技术栈功能特点创新点 简介 在本文中&#xff0c;我们将介绍一款基于Spark的招聘网站数据分析系统&#xff0c;该系统使用爬取的前程无忧招聘数据。通过结合Flask、Pandas、PySpark、以及MySQL等技术&#xff0c;实现…

指定列名自动将Excel内的数据拆分为不同的Sheet(基于Python)

在Python中&#xff0c;可以使用pandas和openpyxl或xlsxwriter库来读取Excel文件、操作数据以及将数据写入新的Excel文件中。以下是一个简单的示例&#xff0c;说明如何读取一个Excel文件&#xff0c;将指定列的数据拆分到独立的sheet中&#xff1a; 首先&#xff0c;确保安装…

大数据机器学习GAN:生成对抗网络GAN全维度介绍与实战

文章目录 大数据机器学习GAN&#xff1a;生成对抗网络GAN全维度介绍与实战一、引言1.1 生成对抗网络简介1.2 应用领域概览1.3 GAN的重要性 二、理论基础2.1 生成对抗网络的工作原理2.1.1 生成器生成过程 2.1.2 判别器判别过程 2.1.3 训练过程训练代码示例 2.1.4 平衡与收敛 2.2…

回顾 2023,展望 2024

by zhengkai.blog.csdn.net 项目与心得 今年最大的项目和心得&#xff0c;非GCP莫属&#xff0c;作为全球顶尖的云平台&#xff0c; GCP有他的优势&#xff0c;也有很多难用的地方。但是作为当时的一个strategic solution&#xff0c;我们的印度本地化项目必须使用GCP&#xf…

uni-app js语法

锋哥原创的uni-app视频教程&#xff1a; 2023版uniapp从入门到上天视频教程(Java后端无废话版)&#xff0c;火爆更新中..._哔哩哔哩_bilibili2023版uniapp从入门到上天视频教程(Java后端无废话版)&#xff0c;火爆更新中...共计23条视频&#xff0c;包括&#xff1a;第1讲 uni…

Zookeeper实现分布式锁和注册中心

目录 分布式锁 实现方式 分布式锁场景如何选择Redis和zookeeper 用InterProcessMutex实现分布式锁 zookeeper实现注册中心 分布式锁 实现方式 数据库唯一索引Redis的setnxZookeeper创建临时节点及监听机制Zookeeper创建临时有序节点 分布式锁场景如何选择Redis和zookeepe…

App Inventor 2 接入短信服务,实现短信验证码功能

发送短信验证码功能一般都是基于短信平台提供的sdk进行调用&#xff0c;这里是基于阿里云短信平台进行的开发&#xff0c;阿里云短信平台接入步骤请点此参考。 App Inventor 2拓展提供的函数如下&#xff1a; 主要提供2个函数&#xff0c;生成随机位数的数字随机码 和 发送短信…

01.QT概述

一、QT简介 Qt是一个跨平台的应用程序开发框架&#xff0c;用于开发图形界面和嵌入式应用程序。它最初由挪威的Trolltech公司开发&#xff0c;并于1995年首次发布。Qt提供了一套丰富的工具和类库&#xff0c;用于开发桌面应用程序、移动应用程序和嵌入式系统。 二、QT特点 1.…

jsp介绍

JSP 一种编写动态网页的语言&#xff0c;可以嵌入java代码和html代码&#xff0c;其底层本质上为servlet,html部分为输出流&#xff0c;编译为java文件 例如 源jsp文件 <% page contentType"text/html; charsetutf-8" language"java" pageEncoding&…

【小白专用】winform启动界面+登录窗口 更新2024.1.1

需求场景&#xff1a;先展示启动界面&#xff0c;然后打开登录界面&#xff0c;如果登录成功就跳转到主界面 首先在程序的入口路径加载启动界面&#xff0c;使用ShowDialog显示界面&#xff0c; 然后在启动界面中添加定时器&#xff0c;来实现显示一段时间的效果&#xff0c;等…

基于斑点鬣狗算法优化的Elman神经网络数据预测 - 附代码

基于斑点鬣狗算法优化的Elman神经网络数据预测 - 附代码 文章目录 基于斑点鬣狗算法优化的Elman神经网络数据预测 - 附代码1.Elman 神经网络结构2.Elman 神经用络学习过程3.电力负荷预测概述3.1 模型建立 4.基于斑点鬣狗优化的Elman网络5.测试结果6.参考文献7.Matlab代码 摘要&…

计算机网络教案——计算机网络设备章节

第五章 计算机网络设备 一、教学目标: 1. 了解计算机网络的主要设备 2. 了解计算机网络设备的主要原理 3. 掌握计算机网络设备的基本用途 4. 掌握计算机网络设备的使用常识 二、教学重点、难点 计算机网络设备的主要原理 三、技能培训重点、难点 计算机网络设备的使用…

创建型--单例模式

1. basic 1.1 什么是单例模式 保证⼀个类仅有⼀个实例&#xff0c;并提供⼀个访问它的全局访问点。 1.2 分类 两种&#xff1a; 饿汉模式&#xff1a;饿了就饥不择⻝了&#xff0c;所以在单例类定义的时候就进⾏实例化。懒汉模式&#xff1a;顾名思义&#xff0c;不到万不…