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

网站开发环境 对比福建省建设注册执业管理中心网站

网站开发环境 对比,福建省建设注册执业管理中心网站,设计签名的小程序,宁夏 网站制作目录 回溯相关 topK问题 回溯相关 题目一:输入一颗二叉树的根节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点 开始往下一直到叶结点所经过的结点形成一条路径。 OJ地址 图示如下。 要解决当前的问题&#xf…

目录

回溯相关

topK问题 


回溯相关

        题目一:输入一颗二叉树的根节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点 开始往下一直到叶结点所经过的结点形成一条路径。

OJ地址

        图示如下。 

        要解决当前的问题,其实就涉及到了算法中一个思想,就是回溯的思想,这个题目也是一个经典的 DFS(深度优先遍历)+回溯法+递归 题型。

        何为回溯法?

        像二叉树的先序遍历,中序遍历,后续遍历就是很明显的回溯法。我们以中序遍历为例,我们第一个访问的节点一定是左子树中最左的节点,然后再访问当前的最左的节点的根节点,然后再去访问当前根节点的右子树,将最左的节点,最左节点的根节点,最左节点的根节点的右子树都访问完之后,当前的这个根节点可能就是上一个树的左子树或者右子树,如果是上一个树的左子树,就访问上一个树的根节点,如果是上一个树的右子树,就表示上一个树就已经访问完,然后再去判断上一个树是上一个树的左子树还是右子树,依次向上回溯,最终实现整个树的中序访问。这就是一个典型的回溯法。

        对于回溯法,我们主要分为四步。

  1. 添加待选结果,这个结果可能是最终结果,也可能不是最终结果。
  2. 判定待选结果中符合条件的结果,将符合条件的结果加入结果集。
  3. DFS,进行深度遍历。
  4. 回退,递归检测下一个待选结果。

        编码如下。

/*** struct TreeNode {*  int val;*  struct TreeNode *left;*  struct TreeNode *right;*  TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}* };*/
class Solution {public:void  FindPathHelper(TreeNode* root, int target, vector<vector<int>>& result,vector<int>& v) {if (root == nullptr) {return;}v.push_back(root->val);target -= root->val;if (target == 0 && root->left == nullptr && root->right == nullptr) {result.push_back(v);}//获取左子树的结果集FindPathHelper(root->left, target, result, v);//获取右子树的结果集FindPathHelper(root->right, target, result, v);v.pop_back();}vector<vector<int> > FindPath(TreeNode* root, int target) {vector<vector<int>> result; //结果集vector<int> v;//结果集if (root != nullptr) {FindPathHelper(root, target, result, v);}return result;}
};

        题目二: 输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出 来的所有字符串abc,acb,bac,bca,cab和cba。OJ地址

        图示如下。

        题目解析: 全排列的问题,也可以看成一个多叉树的 DFS+回溯+递归

        我们可以直接确定a,b,c 三个节点的位置,然后再去通过递归的方式去获取其它元素的排列种类数。

 

        编码如下。

class Solution {public:void swap(string& str, int start, int i) {int temp = str[start];str[start] = str[i];str[i] = temp;}void PermutationHelper(string& str, int start, unordered_set<string>& s) {if (start == str.size() - 1) {s.insert(str);return;}//for循环可以理解为是求每一个字符作为首字符时的字符组合的种类数for (int i = start; i < str.size(); i++) {swap(str, start,i); //确定第一个字符的位置,然后去求剩下的字符的组合数PermutationHelper(str, start + 1, s);swap(str, start, i);}}vector<string> Permutation(string str) {vector<string> result;//结果集//string s;//待选结果unordered_set<string> s;//对结果集中的元素进行去重if (str.size()) {PermutationHelper(str, 0, s);result.insert(result.begin(), s.begin(), s.end());sort(result.begin(), result.end());}return result;}
};

topK 问题 

        题目三:输入 n 个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4。 OJ地址

        图示如下。

        题目解析:这个题目不建议使用排序的方法解决,而是建议使用堆的思想来解决。

        回顾一下,什么是堆,堆其实就是一个完全二叉树,堆顶的元素是完全二叉树中最大的或者是最小的元素,这取决于该堆是大堆还是小堆,要解决这种问题我们可以使用建立 K 个数的大堆,为什么要建立 K 个数的大堆,大家可以去数据结构专栏查看堆那一章节的知识,这里不做过多解释。

        但是我们知道,在 stl 容器中,有一个天然是大堆的容器,就是 priority_queue 优先级队列,所以我们可以使用优先级队列查找最小的前 K 个数。

        编码如下。

#include <queue>
class Solution {public:vector<int> GetLeastNumbers_Solution(vector<int>& input, int k) {vector<int> result;if (input.size() == 0 || k == 0 || input.size() < k) {return result;}//priority_queue默认是大堆,如果要建小堆,需要自己定义仿函数priority_queue<int> q;for (int i = 0; i < input.size(); i++) {if (i < k) {q.push(input[i]);} else {if (q.top() > input[i]) {q.pop();q.push(input[i]);}}}for (int i = 0; i < k; i++) {result.push_back(q.top());q.pop();}return result;}
};

        以上便是本期的所有内容。

        本期内容到此结束^_^ 


文章转载自:

http://4ACD07SS.fLxqm.cn
http://sQOObdmu.fLxqm.cn
http://9rz0OqgR.fLxqm.cn
http://lQD1t7Wb.fLxqm.cn
http://KCdi4OWB.fLxqm.cn
http://wd0G5zLB.fLxqm.cn
http://vB6ayoIX.fLxqm.cn
http://AsD6Az9U.fLxqm.cn
http://GL8ei0rI.fLxqm.cn
http://ci5sl4k5.fLxqm.cn
http://bCp9naVK.fLxqm.cn
http://ldDNd1cM.fLxqm.cn
http://0scpt1FB.fLxqm.cn
http://9Hv7hYAk.fLxqm.cn
http://M1q5n7st.fLxqm.cn
http://te7JjuMc.fLxqm.cn
http://1CeaWXTB.fLxqm.cn
http://j11ectGc.fLxqm.cn
http://9L0HRdLW.fLxqm.cn
http://aQqkniVI.fLxqm.cn
http://tqgNbUhG.fLxqm.cn
http://LyVmvrPb.fLxqm.cn
http://w0yeKz7G.fLxqm.cn
http://ux5VNgJC.fLxqm.cn
http://TsuHtxyW.fLxqm.cn
http://iwf4I0YP.fLxqm.cn
http://LQzfECo7.fLxqm.cn
http://1XLWweec.fLxqm.cn
http://Qc9gSr5f.fLxqm.cn
http://guNEBlor.fLxqm.cn
http://www.dtcms.com/wzjs/761735.html

相关文章:

  • w网站建设如何修改asp网站
  • 移动端网站开发软件手机在线logo免费设计
  • 海南开发公司纯手工seo公司
  • php网站程序怎么安装广州市城乡和建设局网站首页
  • 现在可以做网站么深圳宝安网站建设公司
  • 北京随喜设计网站画册设计步骤
  • 成都网站优化服务项目类型和阶段内容介绍
  • 谷歌推广网站泸州市建设工程管理局网站
  • wordpress网站 添加微信凌云网站
  • python做网站wordpress微信快捷支付
  • 北京网站建设公司代理一个新的网站怎么做宣传
  • 几何背景生成网站会计事务所
  • 两个网站做响应式网站建设银行的网站用户名是什么
  • 旅游公司网站 优帮云做电脑网站宽度
  • 做购物网站的初衷重庆网站建设哪家便宜
  • 做调查的有哪些网站win10虚拟机做网站
  • 京挑客网站建设九江网站建设排行榜
  • 长春一大网站成都官网搭建公司
  • 网站备案年限查询涿州网站建设
  • 陕西交通建设集团西镇分公司网站手机网站模板网
  • 西安网站优化推广方案企业网站的设计论文
  • 网站后台修改图片集顺序wordpress 不做SEO
  • 咸阳专业网站建设wordpress 插件经验
  • 域名绑定网站高清视频网络服务器
  • 网站建设论文基础摘要微信订阅号做网站
  • 免费照片的网站模板免费下载wordpress建立php站点地图
  • 济南网站建设yigeseo怎么做外卖网站
  • 网站做以后怎么修改网站内容企业网站 单页
  • 网站开发需求表成都软件公司排名
  • 网站建设需要具备哪些知识北京专业做网站公司