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

Leetcode面试经典150题

汇总区间

class Solution {
public:vector<string> summaryRanges(vector<int>& nums) {int n = nums.size();if (n == 0) {return {};}vector<string> res;string str = to_string(nums[0]);int start = nums[0];int gap = 1;for (int i = 1; i < n; i++) {if (start + gap == nums[i]) {gap++;} else {if (gap > 1) {str += "->";str += to_string(start + gap - 1);}res.push_back(str);str = to_string(nums[i]);start = nums[i];gap = 1;}}// 处理最后一个数字if (gap > 1) {str += "->";str += to_string(nums[n-1]);}res.push_back(str);return res;}
};

最小栈

设计一个支持push、pop、top操作,并能在常数时间内检索到最小元素的栈。

辅助栈
在每个元素入栈时,把当前最小值m存储起来

  • 当一个元素要入栈时,取当前辅助栈的栈顶存储的最小值,与当前元素比较得最小值,将这个最小值插入到辅助栈。
  • 当一个元素要出栈时,把辅助栈的栈顶元素一并弹出。
  • 在任意一个时刻,栈内元素的最小值就存储在辅助栈的栈顶元素中。

逆波兰表达式求值

class Solution {
public:int evalRPN(vector<string>& tokens) {stack<int> stk;for(int i=0; i<tokens.size(); i++){string str = tokens[i];if(str == "+"){int val1 = stk.top();stk.pop();int val2 = stk.top();stk.pop();stk.push(val2+val1);}else if(str == "-"){int val1 = stk.top();stk.pop();int val2 = stk.top();stk.pop();stk.push(val2-val1);}else if(str == "*"){int val1 = stk.top();stk.pop();int val2 = stk.top();stk.pop();stk.push(val2*val1);}else if(str == "/"){int val1 = stk.top();stk.pop();int val2 = stk.top();stk.pop();stk.push((int)val2/val1);}else{stk.push(stoi(str));}}return stk.top();}
};

有效的数独

请判断一个9x9的数独是否有效。只需要根据以下规则,验证已经填入的数字是否有效即可。

  1. 数字1-9在每一列只能出现一次。
  2. 数字1-9在每一列只能出现一次。
  3. 数字1-9在每一个以粗实线分割的3x3宫内只能出现一次。

一次遍历
可以使用哈希表记录每一行、每一列和每一个小九宫格中,每个数字出现的次数。只需要遍历数独一次,在遍历的过程中更新哈希表中的计数,

class Solution {
public:bool isValidSudoku(vector<vector<char>>& board) {int rows[9][9];int columns[9][9];int subboxes[3][3][9];memset(rows, 0, sizeof(rows));memset(columns, 0, sizeof(columns));memset(subboxes, 0, sizeof(subboxes));for(int i=0; i<9; i++){for(int j=0; j<9; j++){char c = board[i][j];if(c != '.'){int index = c-'0'-1;rows[i][index]++;columns[j][index]++;subboxes[i/3][j/3][index]++;if(rows[i][index] > 1 || columns[j][index] > 1 || subboxes[i/3][j/3][index] > 1){return false;}}}}return true;}
};

生命游戏

给定一个包含mxn个格子的面板,每个细胞都具有一个初始状态:

  1. 活细胞
  2. 死细胞

复制原数组进行模拟
这个问题看起来简单,但有一个陷阱,如果直接根据规则更新原始数组,那么就做不到题目中所说的同步更新。

二叉搜索树迭代器

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:void preOrder(TreeNode* root, vector<int>& arr){if(!root){return;}arr.push_back(root->val);preOrder(root->left, arr);preOrder(root->right, arr);}void flatten(TreeNode* root) {vector<int> arr;preOrder(root, arr);TreeNode* temp = root;for(int i=1; i<arr.size(); i++){temp->right = new TreeNode(arr[i]);temp->left = nullptr;temp = temp->right;}// root->left = nullptr;}
};

不同路径二

动态规划
用f(i,j)来表示从坐标(0, 0)到坐标(i, j)的路径总数,u(i,j)表示坐标(i,j)是否可行,如果坐标(i,j)有障碍物,u(i,j)=0,否则u(i,j)=1。
机器人每次只能向下或者向右移动一步,所以从坐标(0,0)到坐标(i,j)路径总数的值只取决于从坐标(0,0)到坐标(i-1,j)的路径总和和从坐标(0,0)到坐标(i,j-1)的路径总数。

若u(i,j)=0,则f(i,j)=0
若u(i,j)=1,则f(i,j) = f(i-1,j) + f(i,j-1)

class Solution {
public:int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {int m = obstacleGrid.size();int n = obstacleGrid[0].size();// 障碍物为1,空位置为0vector<vector<int>> dp(m, vector<int>(n, 0));if (obstacleGrid[0][0] == 1) {return 0;}dp[0][0] = 1;for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {if (i == 0 && j == 0) {continue;}if (obstacleGrid[i][j] == 1) {dp[i][j] = 0;} else {if (i == 0) {dp[i][j] = dp[i][j - 1];} else if (j == 0) {dp[i][j] = dp[i - 1][j];} else {dp[i][j] = dp[i - 1][j] + dp[i][j - 1];}}}}return dp[m - 1][n - 1];}
};

三角形最小路径和

给定一个三角形triangle,找出自顶向下的最小路径和。
相邻结点只能是与上一层结点下标相等,或者+1。

0,0
1,0 1,1
2,0 2,1 2,2

class Solution {
public:int minimumTotal(vector<vector<int>>& triangle) {int m = triangle.size();int n = triangle[0].size();vector<vector<int>> dp(m);for(int i=0; i<m ;i++){dp[i] = vector<int>(i+1,0);}dp[0][0] = triangle[0][0];for(int i=1; i<m; i++){for(int j=0; j<=i; j++){if(j == 0){dp[i][j] = dp[i-1][j] + triangle[i][j];}else if(j == i){dp[i][j] = dp[i-1][j-1] + triangle[i][j];}else{dp[i][j] = min(dp[i-1][j-1], dp[i-1][j])+triangle[i][j];}}}return *std::min_element(dp[m-1].begin(), dp[m-1].end());}
};

最小路径和

从左上角到右下角找一个路径最小。

class Solution {
public:int minPathSum(vector<vector<int>>& grid) {int m = grid.size();int n = grid[0].size();vector<vector<int>> dp(m, vector<int>(n, 0));dp[0][0] = grid[0][0];for(int i=0; i<m; i++){for(int j=0; j<n; j++){if(i == 0 && j == 0){continue;}if(i == 0){dp[i][j] = dp[i][j-1] + grid[i][j];}else if(j == 0){dp[i][j] = dp[i-1][j] + grid[i][j];}else{dp[i][j] = min(dp[i-1][j], dp[i][j-1]) + grid[i][j];}}}return dp[m-1][n-1];}
};

最长回文子串

在这里插入图片描述
动态规划
对于一个子串而言,如果它是回文串,并且长度大于2,那么将它首尾的两个字母去除之后,它仍然是个回文串。
例如对于字符串“ababa”,如果我们已经知道“bab”是回文串,那么“ababa”一定是回文串,这是因为它的首尾两个字母都是“a”。

根据这样的思路,我们可以用动态规划的方法解决本题。
我们用P(i,j)表示字符串s的第i到j个字母组成的串是否为回文串。

最长递增子序列

动态规划
dp[i]为考虑前i个元素,以第i个数字结尾的最长上升子序列的长度,nums[i]必须被选取。

零钱兑换

动态规划
采用自下而上的方式进行思考,仍定义F(i)为组成金额i所需最少的硬币数量,假设在计算F(i)之前,已经计算出F(0)到F(i-1)的答案。

枚举所有硬币,如果有硬币面额小于等于i
dp[i] = min(dp[i], dp[i-coins[j]]+1);

爬楼梯

class Solution {
public:int climbStairs(int n) {if(n < 2){return n;}//dp[n]:到达第n阶的方法数量vector<int> dp(n+1, 0);dp[0] = 0;dp[1] = 1;dp[2] = 2;for(int i=3; i<=n; i++){dp[i] = dp[i-1] + dp[i-2];}return dp[n];}
};

使用最小花费爬楼梯

给一个整数数组cost,其中cost[i]是从楼梯第i个台阶向上爬需要支付的费用。一旦支付此费用,即可选择向上爬一个或者两个台阶。

class Solution {
public:int minCostClimbingStairs(vector<int>& cost) {//dp[i]爬到第i个楼梯所需的最小费用int n = cost.size();vector<int> dp(n+1, INT_MAX);dp[0] = 0;dp[1] = 0;for(int i=2; i<=n; i++){dp[i] = min(dp[i-1] + cost[i-1], dp[i-2]+cost[i-2]);}return dp[n];}
};

相关文章:

  • MAC M1系统编译ffmpeg-gl-transition
  • 【 ARMv8/ARMv9 硬件加速系列 3.5.1 -- SVE 谓词寄存器有多少位?】
  • 配置中心理论学习
  • 展厅设计要遵守哪些原则
  • Aptos Builder Jam 亚洲首站|议程公布,无限畅想 Aptos 生态未来
  • CAPL如何在底层模拟TCP Client端断开TCP连接
  • 【HTML】格式化文本 pre 标签
  • ADBMS1818驱动程序解析
  • Spring的启动扩展点机制详解
  • SpringBoot购物网站
  • 基于深度学习网络的USB摄像头实时视频采集与手势检测识别matlab仿真
  • 黑马苍穹外卖2 员工的增查改+异常处理+ThreadLocal
  • Python爬取与可视化-豆瓣电影数据
  • 前端根据权限生成三级路由
  • Linux | grep命令和 find命令有什么区别
  • angular学习第一篇-----环境搭建
  • eclipse(luna)创建web工程
  • Java的Interrupt与线程中断
  • JS正则表达式精简教程(JavaScript RegExp 对象)
  • Just for fun——迅速写完快速排序
  • Service Worker
  • SQL 难点解决:记录的引用
  • Vue.js 移动端适配之 vw 解决方案
  • 构建二叉树进行数值数组的去重及优化
  • 经典排序算法及其 Java 实现
  • 两列自适应布局方案整理
  • 使用parted解决大于2T的磁盘分区
  • 微信小程序:实现悬浮返回和分享按钮
  • 一些关于Rust在2019年的思考
  • # Redis 入门到精通(一)数据类型(4)
  • #[Composer学习笔记]Part1:安装composer并通过composer创建一个项目
  • #pragma预处理命令
  • #QT(智能家居界面-界面切换)
  • $.ajax()方法详解
  • (2.2w字)前端单元测试之Jest详解篇
  • (20)docke容器
  • (2024,RWKV-5/6,RNN,矩阵值注意力状态,数据依赖线性插值,LoRA,多语言分词器)Eagle 和 Finch
  • (3)医疗图像处理:MRI磁共振成像-快速采集--(杨正汉)
  • (8)STL算法之替换
  • (LNMP) How To Install Linux, nginx, MySQL, PHP
  • (vue)el-cascader级联选择器按勾选的顺序传值,摆脱层级约束
  • (一)SpringBoot3---尚硅谷总结
  • (原創) 物件導向與老子思想 (OO)
  • ... fatal error LINK1120:1个无法解析的外部命令 的解决办法
  • .net core 6 集成 elasticsearch 并 使用分词器
  • .NET 使用 JustAssembly 比较两个不同版本程序集的 API 变化
  • .NET 中各种混淆(Obfuscation)的含义、原理、实际效果和不同级别的差异(使用 SmartAssembly)
  • .NET/C# 使用反射调用含 ref 或 out 参数的方法
  • .NET/C# 在 64 位进程中读取 32 位进程重定向后的注册表
  • .net使用excel的cells对象没有value方法——学习.net的Excel工作表问题
  • /dev/sda2 is mounted; will not make a filesystem here!
  • @CacheInvalidate(name = “xxx“, key = “#results.![a+b]“,multi = true)是什么意思
  • [ C++ ] STL_stack(栈)queue(队列)使用及其重要接口模拟实现
  • [18] Opencv_CUDA应用之 基于颜色的对象检测与跟踪
  • [Android] Binder 里的 Service 和 Interface 分别是什么