腾讯百度阿里华为常见算法面试题TOP100(6):回溯、二分查找、二叉树

之前总结过字节跳动TOP50算法面试题:

字节跳动常见算法面试题top50整理_沉迷单车的追风少年-CSDN博客_字节算法面试题

回溯

46.全排列

class Solution {
private:vector<vector<int> > ans;void dfs(vector<int>& nums, vector<int>& temp, int index) {if (temp.size() == nums.size()) {ans.push_back(temp);return;}for (int i = 0; i < nums.size(); i++) {if (find(temp.begin(), temp.end(), nums[i]) == temp.end()) {temp.push_back(nums[i]);dfs(nums, temp, i);temp.pop_back();}}}
public:vector<vector<int>> permute(vector<int>& nums) {vector<int> temp;dfs(nums, temp, 0);return ans;}
};

78.子集

class Solution {
private:vector<vector<int> > ans;void dfs(vector<int>& nums, vector<int>& temp, int index) {if (find(ans.begin(), ans.end(), temp) == ans.end()) {ans.push_back(temp);}if (index >= nums.size()) {return;}for (int i = index; i < nums.size(); i++) {temp.push_back(nums[i]);dfs(nums, temp, i + 1);temp.pop_back();}}
public:vector<vector<int>> subsets(vector<int>& nums) {vector<int> temp;dfs(nums, temp, 0);return ans;}
};

17.电话号码的字母组合

class Solution {
private:vector<string> ans;vector<string> sList={"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"}; //字符表void backtrack(string& digits, string temp, int index) {if (index == digits.size()) {ans.push_back(temp);return;}string s = sList[digits[index] - '0'];// for循环横向遍历,递归纵向遍历for (int i = 0; i < s.size(); i++) {temp.push_back(s[i]);backtrack(digits, temp, index + 1);temp.pop_back();}}
public:vector<string> letterCombinations(string digits) {if (digits.empty()) {return {};}backtrack(digits, {}, 0);return ans;}
};

 39.组合总和

class Solution {
private:vector<vector<int> > ans;void backtrack(vector<int>& candidates, int& target, vector<int> temp, int cursum, int index) {if (cursum == target) {ans.push_back(temp);return;}for (int i = index; i < candidates.size(); i++) {// 剪枝if (cursum + candidates[i] > target) {break;}temp.push_back(candidates[i]);backtrack(candidates, target, temp, cursum + candidates[i], i);temp.pop_back();}}
public:vector<vector<int>> combinationSum(vector<int>& candidates, int target) {sort(candidates.begin(), candidates.end());backtrack(candidates, target, {}, 0, 0);return ans;}
};

22.括号生成

class Solution {
private:vector<string> ans;void backtrack(int left, int right, int n, string s) {if (left == n && right == n) {  // 左右都拼完了终止ans.push_back(s);return;}if (left < n) {     // 左边括号没拼满拼接左边backtrack(left + 1, right, n, s + '(');}if (right < left) {  // 右边括号比左边少拼接右边backtrack(left, right + 1, n, s + ')');} }
public:vector<string> generateParenthesis(int n) {// DFS+回溯// left代表左边拼了的括号数// right代表右边拼的括号数backtrack(0, 0, n, "");return ans;}
};

79.单词搜索

class Solution {
private:// 剪枝操作,当找到路径的时候终止 bool flag = false;
public:bool exist(vector<vector<char>>& board, string word) {if (board.empty() || board.size() == 0 || board[0].size() == 0)return false;// DFS+回溯+剪枝for (int i = 0; i<board.size(); i++) {for (int j = 0; j<board[0].size(); j++) {if (dfs(board, i, j, word, 0))return true;}}return false;}// 传入引用直接在原位置上进行操作,不需要新建变量与赋值,节省时间开销和空间开销bool dfs(vector<vector<char>>& board, int i, int j, const string& word, int cur) {// 先列出终止条件if (cur == word.size()) {flag = true;return true;}// 回溯中心处理环节if (i < 0 || i>=board.size() || j < 0 || j >= board[0].size() || word[cur] != board[i][j])return false;// 分别标记上下左右每次搜索是否成功bool flag1, flag2, flag3, flag4;if (!flag) {// 先将board[i][j]拿出来用board[i][j] = '.';flag1 = dfs(board, i+1, j, word, cur+1);flag2 = dfs(board, i-1, j, word, cur+1);flag3 = dfs(board, i, j+1, word, cur+1);flag4 = dfs(board, i, j-1, word, cur+1);// 再将board[i][j]放回去,还原回溯现场board[i][j] = word[cur];// 任意一个方向成功即为此处搜索成功,返回truereturn flag1 ||flag2 || flag3 || flag4;}return true;}
};

131.分割回文串 

class Solution {
public:vector<vector<string>> partition(string &s) {backtravel(s, 0, s.size()-1);return ans;}
private:vector<vector<string> > ans;vector<string> temp;void backtravel(const string &s, const int &left, const int &right) {//到字符串末尾了,将本次结果记录下来if (left > right) {ans.push_back(temp);return;}//从index为a开始截取长度为1,2,3..的子串进行验证,成功则用剩下的部分递归for (int i = 1; i <= right - left + 1; i++) {if (isHuiwen(s.substr(left, i))) {temp.push_back(s.substr(left, i));// 以上一次成功的位置为起点再次进行递归backtravel(s, left+i, right);temp.pop_back();}}}bool isHuiwen(const string &s) {int left = 0, right = s.size() - 1;while (left <= right) {if (s[left] != s[right])return false;left++;right--;}return true;}
};

51.N皇后

class Solution {
private:vector<vector<string>> ans;    // n 为输入的棋盘大小// row 是当前递归到棋盘的第几行了void backtrack(int n, int row, vector<string> chessboard) {if (row == n) {ans.push_back(chessboard);return;}for (int col = 0; col < n; col++) {if (isVaild(chessboard, row, col)) {chessboard[row][col] = 'Q';backtrack(n, row + 1, chessboard);chessboard[row][col] = '.';}}}// 判断是否合法bool isVaild(vector<string> chessboard, int row, int col) {// 同列不能用皇后for (int i = 0; i < row; i++) {if (chessboard[i][col] == 'Q') {return false;}}// 斜45不能用皇后for (int i = row - 1, j = col - 1; i >= 0 && j >= 0; i--, j--) {if (chessboard[i][j] == 'Q') {return false;}}// 斜135不能用皇后for (int i = row - 1, j = col + 1; i >= 0 && j < chessboard.size(); i--, j++) {if (chessboard[i][j] == 'Q') {return false;}}return true;}
public:vector<vector<string>> solveNQueens(int n) {vector<string> chessboard(n, string(n, '.'));backtrack(n, 0, chessboard);return ans;}
};

二分搜索

35.搜索插入位置

class Solution {
public:int searchInsert(vector<int>& nums, int target) {int left = 0;int right = nums.size() - 1;while (left <= right) {int mid = (left + right) / 2;if (nums[mid] > target) {right = mid - 1;} else if (nums[mid] < target) {left = mid + 1;} else {return mid;}}return right + 1;}
};

74.搜索二维矩阵

class Solution {
public:bool searchMatrix(vector<vector<int>>& matrix, int target) {// 选择左下角开始比较if(matrix.size()==0)return false;int i = 0; int j = matrix[0].size()-1;while (i<matrix.size()&&j>=0) {if ( matrix[i][j]>target ) {j--;}else if (matrix[i][j]<target) {i++;}else {return true;}}return false;}
};

34.在排序数组中查找元素的第一个和最后一个位置

class Solution {
public:vector<int> searchRange(vector<int>& nums, int target) {int leftBorder = getLeftBorder(nums, target);int rightBorder = getRightBorder(nums, target);// 情况一: target在数组范围的左边或者右边if (leftBorder == -2 || rightBorder == -2) {return {-1, -1};}// 情况三: target在数组范围内且存在if (rightBorder - leftBorder > 1) {return {leftBorder + 1, rightBorder - 1};}// 情况二: target在数组范围内但是不存在return {-1, -1};}
private:int getRightBorder(vector<int>& nums, int target) {int left = 0;int right = nums.size() - 1;int rightBorder = -2; // 记录一下rightBorder没有被赋值的情况while (left <= right) {int middle = left + ((right - left) / 2);if (nums[middle] > target) {right = middle - 1;} else { // 寻找右边界,nums[middle] == target的时候更新leftleft = middle + 1;rightBorder = left;}}return rightBorder;}int getLeftBorder(vector<int>& nums, int target) {int left = 0;int right = nums.size() - 1;int leftBorder = -2; // 记录一下leftBorder没有被赋值的情况while (left <= right) {int middle = left + ((right - left) / 2);if (nums[middle] >= target) { // 寻找左边界,nums[middle] == target的时候更新rightright = middle - 1;leftBorder = right;} else {left = middle + 1;}}return leftBorder;}
};

33.搜索旋转排序数组 

class Solution {
public:int search(vector<int>& nums, int target) {int ans = -1;// 二分// 将数组一分为二,其中一定有一个是有序的,另一个可能是有序,也能是部分有序。此时有序部分用二分法查找。无序部分再一分为二,其中一个一定有序,另一个可能有序,可能无序。就这样循环.int left = 0;int right = nums.size() - 1;while (left <= right) {int mid = (left + right) / 2;if (nums[mid] == target) {return mid;} else if (nums[mid] > nums[right]) {  // 无序在右半段if (target < nums[mid] && target >= nums[left]) {    // 判断target是否在有序的半段right = mid - 1;} else {left = mid + 1;}} else {    // 无序在左半段if (target > nums[mid] && target <= nums[right]) {   // 判断target是否在有序的半段left = mid + 1;} else {right = mid - 1;}}}return ans;}
};

153.寻找旋转排序数组中的最小值 

class Solution {
public:int findMin(vector<int>& nums) {int left = 0;int right = nums.size() - 1;while (left < right) {// 取中间值int mid = (right + left) / 2;// 如果中间值小于最大值,则最大值减小if (nums[mid] < nums[right]) {right = mid;} else { // 如果中间值大于最大值,则最小值变大left = mid + 1;}}return nums[left];}
};

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

数据库函数

1.字符串函数 例子&#xff1a; 2.数值函数 例子&#xff1a; 3.日期函数 例子&#xff1a; 4.流程函数 例子&#xff1a; 参考视频&#xff1a;27. 基础-函数-字符串函数_哔哩哔哩_bilibili

高级大数据开发学习路线指南

掌握大数据技术是一项系统性工程&#xff0c;涉及到广泛的技能和专业知识。为了帮助初学者构建坚实的基础&#xff0c;并逐步成长为大数据领域的专家&#xff0c;下面详细阐述了一条全面而深入的学习路线&#xff1a; 1. Java 编程基础 - 打造坚实的底层技能 关键知识点&…

Skyeye 云智能制造 v3.14.5 发布,ERP 商城

Skyeye 云智能制造&#xff0c;采用 Springboot winUI 的低代码平台、移动端采用 UNI-APP。包含 30 多个应用模块、50 多种电子流程&#xff0c;CRM、PM、ERP、MES、ADM、EHR、笔记、知识库、项目、门店、商城、财务、多班次考勤、薪资、招聘、云售后、论坛、公告、问卷、报表…

进程的通信

进程的通信方式 进程的通信方式有很多种&#xff0c;今天我就为大家介绍各种通讯方式&#xff0c;例如:管道&#xff0c;信号&#xff0c;消息队列&#xff0c;共享内存&#xff0c;信号量 1.管道 1.1 管道的简介: 管道分为无名管道与有名管道 无名管道:无名管道用于父子进…

基于SpringBoot+Vue的企业会议室预定管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于JavaSpringBootVueMySQL的…

Mac 搭建仓颉语言开发环境(Cangjie SDK)

文章目录 仓颉编程语言通用版本SDK Beta试用报名仓颉语言文档注册 GitCode登录 GitCode 下载 Cangjie SDK配置环境变量VSCode 插件VSCode 创建项目 仓颉编程语言通用版本SDK Beta试用报名 https://wj.qq.com/s2/14870499/c76f/ 仓颉语言文档 https://developer.huawei.com/c…

【笔记】2.1 半导体三极管(BJT,Bipolar Junction Transistor)

一、结构和符号 1. 三极管结构 常用的三极管的结构有硅平面管和锗合金管两种类型。各有PNP型和NPN型两种结构。 左图是NPN型硅平面三极管,右图是PNP型锗合金三极管。 从图中可见平面型三极管是先在一块大的金属板上注入杂质使之变成N型,然后再在中间注入杂质使之变成P型,…

【Java集合】TreeMap

概述 TreeMap实现了SortedMap接口&#xff0c;能够把它保存的记录根据键排序&#xff0c;默认是按键值的升序排序&#xff0c; 也可以指定排序的比较器&#xff0c;当用Iterator遍历TreeMap时&#xff0c;得到的记录是排过序的。 如果需要一个按键排序的map&#xff0c;建议使用…

Linux相关概念和重要知识点(4)(自举、vim)

1.语言和编译器的发展 &#xff08;1&#xff09;汇编语言的出现 计算机只能看懂二进制&#xff0c;但是用二进制实现一个功能就太难了&#xff0c;人们需要发明一种高效的语言。人们抽象出一套编程逻辑&#xff0c;定义了一系列操作&#xff0c;接下来就需要实现它。最初人们…

深入理解ConcurrentHashMap

HashMap为什么线程不安全 put的不安全 由于多线程对HashMap进行put操作&#xff0c;调用了HashMap的putVal()&#xff0c;具体原因&#xff1a; 假设两个线程A、B都在进行put操作&#xff0c;并且hash函数计算出的插入下标是相同的&#xff1b; 当线程A执行完第六行由于时间片…

计算机网络:概述 --- 体系结构

目录 一. 体系结构总览 1.1 OSI七层协议体系结构 1.2 TCP/IP四层(或五层)模型结构 二. 数据传输过程 2.1 同网段传输 2.2 跨网段传输 三. 体系结构相关概念 3.1 实体 3.2 协议 3.3 服务 这里我们专门来讲一下计算机网络中的体系结构。其实我们之前…

轴承表面缺陷检测系统源码分享

轴承表面缺陷检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer…

Mybatis续

步骤 爆红 点了右上角还是爆红不要着急&#xff0c;右下角正在下载 new 如果new的是package&#xff0c;用com.zhang&#xff0c;能事项分级 如果new的是文件夹&#xff0c;用com/zhang&#xff0c;就能实现分级。如果用com.zhang&#xff0c;则创建的文件夹名是com.zhang …

【Java面向对象二】static(二)修饰成员方法的应用场景

文章目录 前言一、static修饰成员方法的应用场景二、使用例子三、工具类没有创建对象的需求&#xff0c;建议将工具类的构造方法进行私有总结 前言 记录学习过程中的工具类的使用。 一、static修饰成员方法的应用场景 1、类方法的常见应用场景 类方法最常见的应用场景是做工…

初始c++:入门基础(完结)

打字不易&#xff0c;留个赞再走吧~~~ 目录 一函数重载二引用1 引⽤的概念和定义2引⽤的特性3引⽤的使⽤三inline四nullptr 一函数重载 C⽀持在同⼀作⽤域中出现同名函数&#xff0c;但是要求这些同名函数的形参不同&#xff0c;可以是参数个数不同或者 类型不同。这样C函数调⽤…

图书管理系统(面向对象的编程练习)

图书管理系统&#xff08;面向对象的编程练习&#xff09; 1.系统演示2.设计框架讲解3.代码的详细讲解3.1 多本书籍的实现3.2 不同操作人员的实现3.3 不同work操作的实现 1.系统演示 下面主要展示系统的删除图书功能和显示图书功能&#xff0c;帮助大家在开始写代码前先了解图…

centos7如何连接网络 centos7wifi连接

这段时间重新学习 Linux 知识&#xff0c;用的是笔记本&#xff0c;连接的是无良房东家的 WiFi&#xff0c;IP地址经常变动。每次都要修改 Xshell 的配置才能连上虚拟机。效率很低。 为此&#xff0c;必须要解决这个 IP 地址经常变动的事情&#xff01;这里讲解的版本是&#…

Gitlab学习(009 gitlab冲突提交)

尚硅谷2024最新Git企业实战教程&#xff0c;全方位学习git与gitlab 总时长 5:42:00 共40P 此文章包含第30p-第p34的内容 文章目录 冲突提交不同人修改不同文件不同人修改同文件的不同区域不同人修改同文件的相同区域 同时变更文件名和文件内容gitLab功能拓展code review代码复…

Web开发:ABP框架2——入门级别的增删改查Demo

目录 一、前言 二、上节回顾 ​编辑 三、新建Dto和添加映射 1.新建dto 2.添加映射规则 四、新建WebApi控制器用EFcore进行增删改查 1.新建Webapi控制器接口 2.新建Webapi控制器实现 3.跑项目测试 五、WebApi控制器调用底层代码 1.webapi控制器&#xff08;高层代码&…

Yocto - 使用Yocto开发嵌入式Linux系统_01 前言

Embedded Linux Development Using Yocto Project: Leverage the power of the Yocto Project to build efficient Linux-based products, Third Edition By: Otavio Salvador, Daiane Angolini Overview of this book Yocto 项目是开发可靠的嵌入式 Linux 项目的行业标准。与…