【剑指Offer速刷与技巧笔记】剑指Offer重点面试刷题
刷题过程中对于一系列技巧知晓了,但是拿过来题目 却不知道用什么对了……
或者说 对应的题目看过、刷过、实现过 却……具体细节又不会了……(特别是 魔鬼细节二分搜索哇!)
再者说 有些题目的“奇技淫巧”不是那么容易在短时间内想到的,所以想到了要针对面试厂家进行速刷……并相应的梳理刷题过程中 自己知识框架/思维 中短缺、不熟练的部分再进行二刷、三刷……
另外很重要的一点: 对刷过的题目 要尝试进行分类、可以快速索引到……
以上就是本篇的核心思想和目前刷题中遇到的问题。针对加粗重点部分进行重点突破……
更新:剑指Offer需要需要进一步由重点到细节——逐渐刷完!
零、引言
当遇到一个比较复杂的问题时,可以通过画图、举例或者分解来考虑,从具体的实例中总结普遍规律。
注重效率的考量,这66道题用蛮力法解决可能都不是很难,但是我们需要考虑的是时间效率和空间效率的平衡,以空间换时间有时候是一个不错的选择。
常用数据结构和数据操作是基础,要重点掌握,如树的遍历,排序,查找,递归等操作,在题目中反复用到,要深刻理解算法思想。
算法题主要分成数据结构和具体算法部分,简单归类如下。
零.1 数据结构类题目
LinkedList
003-从尾到头打印链表
014-链表中倒数第k个结点
015-反转链表
016-合并两个或k个有序链表
025-复杂链表的复制
036-两个链表的第一个公共结点
055-链表中环的入口结点
056-删除链表中重复的结点
Tree
004-重建二叉树
017-树的子结构
018-二叉树的镜像
022-从上往下打印二叉树
023-二叉搜索树的后序遍历序列
024-二叉树中和为某一值的路径
026-二叉搜索树与双向链表
038-二叉树的深度
039-平衡二叉树
057-二叉树的下一个结点
058-对称的二叉树
059-按之字形顺序打印二叉树
060-把二叉树打印成多行
061-序列化二叉树
062-二叉搜索树的第k个结点
Stack & Queue
005-用两个栈实现队列
020-包含min函数的栈
021-栈的压入、弹出序列
044-翻转单词顺序列(栈)
064-滑动窗口的最大值(双端队列)
Heap
029-最小的K个数
Hash Table
034-第一个只出现一次的字符
图
065-矩阵中的路径(BFS)
066-机器人的运动范围(DFS)
零.2 具体算法类题目
斐波那契数列
007-斐波拉契数列
008-跳台阶
009-变态跳台阶
010-矩形覆盖
搜索算法
001-二维数组查找
006-旋转数组的最小数字(二分查找)
037-数字在排序数组中出现的次数(二分查找)
全排列
027-字符串的排列
动态规划
030-连续子数组的最大和
052-正则表达式匹配(我用的暴力)
回溯
065-矩阵中的路径(BFS)
066-机器人的运动范围(DFS)
排序
035-数组中的逆序对(归并排序)
029-最小的K个数(堆排序)
029-最小的K个数(快速排序)
位运算
011-二进制中1的个数
012-数值的整数次方
040-数组中只出现一次的数字
其他算法
002-替换空格
013-调整数组顺序使奇数位于偶数前面
028-数组中出现次数超过一半的数字
031-整数中1出现的次数(从1到n整数中1出现的次数)
032-把数组排成最小的数
033-丑数
041-和为S的连续正数序列(滑动窗口思想)
042-和为S的两个数字(双指针思想)
043-左旋转字符串(矩阵翻转)
046-孩子们的游戏-圆圈中最后剩下的数(约瑟夫环)
051-构建乘积数组
零.3 节奏与方法
我个人觉得数据结构和DP在面试中手写代码的几率比较高,因此笔者目前的刷题节奏主要是:
剑指offer->Leetcode动态规划->面试前再过一遍剑指offer
有个重要的点是:每道题做完一定要去讨论区!
讨论区有非常精简的大神级代码,你好不容易AC了一道题准备去讨论区吹(装)水(逼),点开一看,“握草,还可以这样”。
思考为什么他可以写出这么好的代码,把每道题的思路理解后用笔记本记录下来,争取刷到融会贯通,即看见有个题能自动归类到某个方面,这样有一定好处。面试最重要的是让面试官日后能愿意与你以后一起工作,因此沟通交流非常重要。比如有时候面试需要交流,看着像是一道排序的题做不出来,就可以跟面试官交流:“我有几个不成熟的想法,一排序,二动态规划,三是直接搜索算法”,面试官可能就给个提示:“你先用排序试试吧“。
一、ZJ算法TOP题目
1.1 重排链表[143]
nb的,考察基础的 快慢指针、分割游离指针、旋转链表、指针引用……
我的题解:
#define For(x,y,z) for(int x=y; x<z; x++)struct ListNode {int val;ListNode *next;ListNode() : val(0), next(nullptr) {}ListNode(int x) : val(x), next(nullptr) {}ListNode(int x, ListNode *next) : val(x), next(next) {}
};
class Solution {public:/*** @Description: 首先快慢指针 找中点。 * @param {*}* @return {*}* @notes: 一前一后往后插*/void reorderList(ListNode* head) {ListNode *slow=head, *fast=head;while(fast->next!=nullptr && fast->next->next!=nullptr){fast = fast->next->next;slow = slow->next;}ListNode *l1=head, *l2=slow->next;slow->next = nullptr; // 这个指针游离了! 就会错误!!!!insertTwoReveList(l1, l2);}// helper 后序递归插入void insertTwoReveList(ListNode* &l1, ListNode *l2){if(l2 == nullptr){return ;}insertTwoReveList(l1, l2->next);ListNode *tmp1 = l1;l1->next = l2;l2->next = tmp1;l1 = tmp1;}
};
1.2 旋转图像[48]
我的题解
#define For(x,y,z) for(int x=y; x<z; x++)
class Solution {public:/*** @Description: 技巧:先 上下翻转,然后再对角翻转即可* @param {*}* @return {*}* @notes: */void rotate(vector<vector<int>>& matrix) {int m = matrix.size(), n = matrix[0].size();For(i,0,m/2){matrix[i].swap(matrix[m-i-1]);}// 对角元素 互换For(i, 0, m){For(j, i+1, n){swap(matrix[i][j], matrix[j][i]);}}}
};
1.3 长度最小子数组[209]
题解——滑动窗口
#define For(x,y,z) for(ll x = y; x < z;++x)
typedef long long ll;class Solution {public:/*** @Description: 大于目标值 最小子数组和* @param {int} target* @return {*}* @notes: */int minSubArrayLen(int target, vector<int>& nums) {int n = nums.size();int left=0, right=0;int minArr = INT_MAX;int sum=0;while(right<n){sum+=nums[right];right++;while( target >= sum ){// 查看是否最小int len = right-left + 1;minArr = minArr>len?len:minArr;// shrink windowssum -= nums[left];left++;}}return minArr;}
};
1.4 除自身以外数组乘积[238]
解题思路
因为空间复杂度要求 O(1),不能使用 除法,因此一定需要在 乘法 过程中得到所有答案;
由于输出数组不算在空间复杂度内,那么我们可以将 L 或 R 数组用输出数组来计算。先把输出数组当作 L 数组来计算,然后再动态构造 R 数组得到结果。 让我们来看看基于这个思想的算法。
- 初始化 res 数组,对于给定索引 i,res[i] 代表的是 i 左侧所有数字的乘积。
- 构造方式与之前相同,只是我们试图节省空间,先把 res 作为方法一的
L
数组。 - 这种方法的唯一变化就是我们没有构造 R 数组。而是用一个遍历来跟踪右边元素的乘积。并更新数组
res[i]=res[i]∗R
。然后 R 更新为R=R∗nums[i]
,其中变量R
表示的就是索引右侧数字的乘积。
我的题解:
#define For(x,y,z) for(ll x = y; x < z;++x)
typedef long long ll;class Solution {public:/*** @Description: 关键是 不能用除法+还要原地或者用res 进行O(1)的算法题解。* @param {*}* @return {*}* @notes: 使用res 计算元素左侧的乘积; 再进行一次从右到左 计算元素右边的乘积,对应乘res 即可得到结果。*/vector<int> productExceptSelf(vector<int>& nums) {int n = nums.size();vector<int> res(n, 1); // 首先代表 i左侧的元素乘积For(i, 1, n){res[i] = res[i-1]*nums[i-1];}// 右边有个tmpint tmp = 1; //动态右边的累乘 除去自身for(int j = n-2; j >= 0;j--){tmp *= nums[j+1];res[j] *= tmp;}return res;}
};
1.5 乘积最大子数组[152]
我的题解
min_num 记录以 nums[i-1] 结尾的乘积最小值,max_num 记录以 nums[i-1] 结尾的乘积最大值。
#define For(x,y,z) for(ll x = y; x < z;++x)
typedef long long ll;class Solution {public:/*** @Description: 最大乘积 有负数,所以可以记录最大和最小值。* @param {*}* @return {*}* @notes: */int maxProduct(vector<int>& nums) {int min_num = 1, max_num = 1; // 代表 以 nums[i-1]为结尾的最小和最大的值int maxNow = INT_MIN;For(i, 0, nums.size()){if(nums[i] < 0) {// 最大最小互换int tmp = min_num;min_num = max_num;max_num = tmp;}min_num = min( min_num*nums[i], nums[i]);max_num = max( max_num*nums[i], nums[i]); // 要么自己开始,要么和之前一样开始。maxNow = max_num>maxNow?max_num:maxNow;}return maxNow;}
};
【剑指Offer速刷与技巧笔记】剑指Offer重点面试刷题相关推荐
- Leetcode刷题笔记——剑指offer II (六)【图】
文章目录 图 695. 岛屿的最大面积 剑指 Offer II 106. 二分图 (每条边的两个结点都来自不同的集合) 剑指 Offer II 107. 矩阵中的距离 (最短路问题,建图,BFS) 剑 ...
- Leetcode刷题笔记——剑指offer II (一)【整数、数组、字符串、链表】
目录 整数 剑指 Offer II 001. 整数除法 剑指 Offer II 002. 二进制加法 剑指 Offer II 003. 前 n 个数字二进制中 1 的个数 剑指 Offer II 00 ...
- leetcode刷题笔记——剑指offer(二)[回溯、排序、位运算、数学、字符串]
这里写目录标题 搜索与回溯 剑指 Offer 12. 矩阵中的路径 剑指 Offer 13. 机器人的运动范围 剑指 Offer 34. 二叉树中和为某一值的路径 剑指 Offer 36. 二叉搜索树 ...
- Leetcode刷题笔记——剑指offer II (五)【二分、排序、回溯】
这里写目录标题 二分查找 剑指 Offer II 069. 山峰数组的顶部 剑指 Offer II 070. 排序数组中只出现一次的数字 剑指 Offer II 071. 按权重生成随机数 剑指 Of ...
- 剑指offer有python版吗_剑指Offer算法类题目[Python版]
标签:重复 作用 coding 面试 medium mba none fas utf-8 面试题012 数值的整数次方 解题思路1 考虑所有情况,循环连乘 代码: de ...
- 剑指offer 面试32题
面试32题: 题目:从上到下打印二叉树 题:不分行从上到下打印二叉树 解题代码: # -*- coding:utf-8 -*- # class TreeNode: # def __init__(sel ...
- 《Vim实用技巧(第2版)》学习笔记:技巧12-双剑合璧,天下无敌
<Vim实用技巧(第2版)>学习笔记:技巧12-双剑合璧,天下无敌 1. 操作符 + 动作命令 = 操作 d{motion}命令可以对一个字符.一个完整单词或一整个段落进行操作,它作用的范 ...
- 本专栏所有力扣题目的目录链接, 刷算法题目的顺序(由易到难/面试频率)/注意点/技巧, 以及思维导图源文件问题(持续更新中)
这篇文章为本专栏所有力扣题目提供目录链接, 更加方便读者根据题型或面试频率进行阅读, 此外也会介绍我在刷题过程中总结的刷算法题目的顺序/注意点/技巧, 最后说下文中出现的思维导图源文件的问题 和 打卡 ...
- 计算机速录方法,速录练习技巧方法介绍
速录练习技巧方法介绍 贡献者:游客24173406 类别:简体中文 时间:2017-09-04 18:36:43 收藏数:59 评分:2 返回上页 举报此文章 请选择举报理由: 广告/谣言/欺诈 政治 ...
- ps学习技巧笔记总结
ps学习技巧笔记总结 通过控制面板可以对您的服务进行全面的管理操作. 例如:开设信箱.创建数据库.管理文件目录.检查您的站点的访问统计报告等等. 一 .photoshop 6种手段 1.使用图层的复制 ...
最新文章
- 【原创】StreamInsight查询系列(六)——基本查询操作之分组聚合
- [国家集训队]墨墨的等式
- Redis的session管理和Memcached的session管理不同
- 按15分钟取数据_【数量技术宅|金融数据分析系列分享】套利策略的价差序列计算,恐怕没有你想的那么简单...
- linux 文件系统的管理 (硬盘)
- 申万一级行业日指数_基金收评 | 指数震荡走弱,军工股成两市主线!后期行情如何?...
- 云主机安装linux发行版,用Ubuntu服务器版部署一个私有云
- 题库明细 使用java理解程序逻辑
- dedecms php5.4 无法退出后台,DedeCMS 织梦在 Windows 的 PHP5.4 环境下登录后台空白的解决办法...
- Android tv开发px,【Android】TV端项目开发挖坑总结
- 关于datetimepicker和vue v-model指令双向数据绑定失败的问题
- 图案、标签、logo
- bash的操作环境及环境设定
- 工作5年的一份总结(1)-07/09-07/11
- html位置水平居中,html元素水平居中的几种方法
- 在MT4上使用双线MACD指标源码
- 你努力工作会让老板感动吗?
- 竞价推广跑oCPC不起量怎么办?
- 【古典入门】巴洛克音乐
- Camtasia“喀秋莎”2022一款录屏神器