![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法
Meet.
这个作者很懒,什么都没留下…
展开
-
输入一个正整数n,去掉其中任意s个数字后,剩下的数字按原左右次序将组成一个新的正整数。寻找一种方案,使得剩下的数字组成的新数最小
输入一个正整数n,去掉其中任意s个数字后,剩下的数字按原左右次序将组成一个新的正整数。寻找一种方案,使得剩下的数字组成的新数最小样例输入 n=178543 s=4样例输出 13。原创 2022-12-28 16:34:07 · 1318 阅读 · 0 评论 -
求解所有最长公共子序列(c++)
已知求解最长公共子序列的状态数组,求解所有的最长公共子序列。原创 2022-12-28 16:04:53 · 246 阅读 · 0 评论 -
二叉树的遍历迭代实现(c++)
思路使用栈模拟递归前序遍历题目链接:二叉树的前序遍历顺序:中-左-右栈具有先进后出的特点,应该先将根节点加入栈,再依次加入右节点和左节点,这样出栈的顺序就是先左节点后右节点了代码vector<int> preorderTraversal(TreeNode* root) { vector<int> ans; stack<TreeNode*> stk; stk.push(root); while (stk.size()) {原创 2022-03-12 14:06:49 · 1574 阅读 · 0 评论 -
不用乘除号实现除法(C++实现)LeetCode29. 两数相除
给定两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。返回被除数 dividend 除以除数 divisor 得到的商。题目来源:LeetCode29. 两数相除链接:https://leetcode-cn.com/problems/divide-two-integers思路倍增和二进制思想举例:yx=k\frac{y}{x} = kxy=k,将kkk转换为二进制如(11010)再将二进制转换为十进制,即 y=24∗x+23∗.原创 2021-10-12 23:33:03 · 572 阅读 · 0 评论 -
查找最短路的路径,存在多条最短路长度相同的情况(c++实现)
最短路问题需要记录路径,需要找出多条长度一样的最短路径思路另外开一个数组记录从哪个点走过来的类似邻接链表的形式记录被更新的点,最后用dfs搜索代码int dijkstra() //求最短路{ memset(d, 0x3f, sizeof d); d[0] = 0; for (int i = 0; i < n + 1; i ++ ) { int t = -1; for (int j = 0; j <= n; .原创 2021-08-18 22:05:45 · 470 阅读 · 1 评论 -
含有重复元素的全排列(c++实现)
输入一个字符串(可能有重复字符),输出该字符串中所有字符的全排列。示例:输入:s = "abb"输出:["abb","bab","bba"]思路首先对给定字符串排序,使相同的字符排在一起;利用回溯法,搜索出所有可能的情况;剪枝,如果当前位置的字符和上一位置的字符相同,且上一字符已被选,此情况跳过,实现去重;本篇利用的是位运算记录字符是否被选中。代码class Solution {public: void dfs(int u, int n, vector<char&.原创 2021-06-22 11:37:57 · 1955 阅读 · 0 评论 -
线性筛法(c++)
求1~n的所有质数cnt是质数的个数,质数存储在p数组中,st数组用来标记数i是否为质数void get_prime(){ for (int i = 2; i <= n; i ++ ) { if (!st[i]) p[cnt ++ ] = i; for (int j = 0; i * p[j] <= n; j ++ ) { st[i * p[j]] = true; .原创 2021-05-17 23:03:37 · 679 阅读 · 0 评论 -
已知中序遍历和后续遍历,求层序遍历
#include <iostream>#include <unordered_map>using namespace std;const int N = 40;int n;unordered_map<int, int> mp; //存储节点在中序遍历中的位置int L[N], R[N];int inorder[N], postorder[N];int build(int il, int ir, int pl, int pr){ int r转载 2021-03-26 11:32:52 · 443 阅读 · 0 评论 -
c++计算中缀表达式
输入中缀表达式的字符串,可能存在括号,输出计算结果。除法是向0取整,仅包含加减乘除四则运算。#include <iostream>#include <stack>#include <unordered_map>using namespace std;stack<char> op; //存运算符stack<int> num; //存运算数unordered_map<char, int> pr={{'+', 1}, .转载 2021-03-23 19:40:23 · 993 阅读 · 0 评论 -
不用运算符号实现加法(c++)实现
给定两个数num1、num2,不使用运算符号,求它们的和。思路计算机内部的运算都是位运算,所以可以用位运算实现。以最简单的加法为例,可得出结论:C = A & BD = A ^ BD是两数相加的直接结果,C是进位,用一般思维进行加法运算时,都是先每一位相加,再进到下一位,在本算法中,由于加法具有交换律,可以先计算所有位数相加的结果,再与进位的结果相加,当然,进位的结果还要左移一位。当进位为0时,计算停止,直接相加的结果即为最终结果。由于进位每次会向左移动,所以经过有限次循环后,.转载 2021-03-22 20:09:20 · 690 阅读 · 0 评论 -
手写实现next_permutation(全排列)
next_permutation函数需要加头文件<algorithm>每次操作使目标数组变为它的下一个全排列该函数是按照字典序产生排列的,并且是从数组中当前的字典序开始依次增大直至到最大字典序手写实现思路以长度为n的数组w为例,其中每个元素均不相同目标:找到当前序列的下一个序列(字典序,从小到大)如果某一子序列已经是降序排列,说明该序列已经是最大字典序步骤1:从序列末端找出长度最大的降序连续子序列步骤2:在该子序列中找出刚好大于与该子序列左端相邻的元素,并交换(使序列变大的幅度原创 2021-03-01 23:09:56 · 448 阅读 · 0 评论 -
二叉树的遍历(递归实现)
给定一棵二叉树,求它的前、中、后序遍历思路:dfs代码map<int, int> l, r; //存储节点的左右儿子//求前序遍历void dfs1(int u){ preorder[k ++ ] = u; if (l.count(u)) dfs1(l[u]); if (r.count(u)) dfs1(r[u]);}//求中序遍历void dfs2(int u){ if (l.count(u)) dfs2(l[u]); ino原创 2020-11-27 20:15:47 · 179 阅读 · 0 评论 -
判断是否为二叉搜索树&&已知前(后)序遍历和中序遍历求后(前)序遍历
给定前序或后序的序列,判断该序列是否能构成一颗二叉搜索树(或镜像的二叉搜索树)假设能构成一颗二叉搜索树,那么这棵树的中序遍历必定为有序的序列此时已知前(后)序遍历和中序遍历根据二叉树的性质,已知前(后)序遍历和中序遍历可以唯一的确定一颗二叉树思路递归思想,首先找到前序遍历中的根节点(第一个节点),再找出该值对应在中序遍历序列中的位置,分界后分别对左右子树进行递归。注意:由于可能存在数值相同的节点,根据原树和镜像树的不同需要找到中序遍历中第一次出现或是最后一次出现对应的节点,具体见代码此算法.原创 2020-11-26 20:23:40 · 296 阅读 · 0 评论