数据结构与算法
文章平均质量分 74
学习数据结构与算法记录的笔记
Jocelin47
这个作者很懒,什么都没留下…
展开
-
算法中数学相关知识-倍数、约数、完全数、质数、最小公倍数
1、倍数大数除以小数,能整除没有余数,那么,大数就是小数的倍数,小数就是大数的因数#include <iostream>using namespace std;int main(){ int a, b; cin >> a >> b; if (a % b == 0 || b % a == 0) cout << "是倍数" << endl; else cout <原创 2021-03-06 22:19:15 · 399 阅读 · 0 评论 -
三种形式全排列——指数型、排列型、组合型类型题目汇总
1、指数型指数型按照升序把所有中方案输出出来#include<bits/stdc++.h>using namespace std;#define N 20int n;int st[N];int a[N];void dfs(int u){ if( u == n+1 ) { for(int i = 1; i <=n; i++) //满足三个数的时候 { if(st[i]==1) //如果我们选了原创 2021-03-05 21:28:22 · 435 阅读 · 0 评论 -
【剑指offer】面试题59-Ⅱ:队列的最大值
方法一:辅助队列和上一题的思路相同我们使用一个辅助的双向队列进行保存最大值对于他原来的数据插入以及弹出都保持不变但是我们需要对于有新的数据插入或者数据弹出的话需要使用一个队列保存我们的最大值插入得时候我们需要把新插入的数与队尾一个一个比较,如果大于队尾的话,则把所有在队列中小于新插入数的数全部弹出。最后把我们新插入的数插入进去弹出的时候我们需要因为是front,我们需要把原来队列的数据进行保存然后把原来的队列的队首进行pop然后判断我们的当前原来队列的对手和我们的最大值的队首是否.原创 2020-09-26 21:33:07 · 156 阅读 · 0 评论 -
【剑指offer】面试题59-Ⅰ:滑动窗口的最大值——经典单调队列问题
方法一:滑动窗口class Solution {public: vector<int> maxSlidingWindow(vector<int>& nums, int k) { vector<int> result; if( nums.size() == 0 || k < 1 || nums.size() < k ) return result; i.原创 2020-09-25 17:22:30 · 102 阅读 · 0 评论 -
【剑指offer】面试题58-Ⅱ:左旋转字符串 ——C语言字符串的翻转
方法一: substr字符串分割从n开始的字符加上从0开始n位的字符相加。class Solution {public: string reverseLeftWords(string s, int n) { string str = s.substr(n) + s.substr( 0, n ) ; return str; }};方法二:三次翻转(原地操作)class Solution {public: string reverseL.原创 2020-09-21 22:34:58 · 162 阅读 · 0 评论 -
【剑指offer】面试题58-Ⅰ:翻转单词顺序
方法一:顺序处理字符串思路class Solution {public: string reverseWords(string s) { int i = 0; int n = s.size(); string temp,result; while( i < n ) { while( ( i < n ) && s[i] == ' ' ) .原创 2020-09-21 21:47:43 · 82 阅读 · 0 评论 -
【剑指offer】面试题57-Ⅱ:和为s的连续正数序列
方法一:双指针class Solution {public: vector<vector<int>> findContinuousSequence(int target) { vector<vector<int>> result; //连续的数那么中间的两个加起来要么等于target要么大于target 8-> 4 + 5 7 -> 3 + 4 int left = 1; .原创 2020-09-21 21:42:52 · 69 阅读 · 0 评论 -
【剑指offer】面试题57:和为s的两个数字
方法一:哈希表查找class Solution {public: vector<int> twoSum(vector<int>& nums, int target) { unordered_map<int,int> record; vector<int> result; for( int i = 0; i < nums.size(); i++ ) { .原创 2020-09-21 21:40:42 · 60 阅读 · 0 评论 -
【剑指offer】面试题56-Ⅱ:数组中数字出现的次数Ⅱ
方法一:位运算统计每一位出现的次数,时间复杂度O(n),空间复杂度只需要开辟32个空间大小的数组为O(1)哈希表需要空间O(n)我们把每一位的数值进行保存,把有三次出现的位数对3求余,去除掉次数为3的位,保留只出现一次的位class Solution {public: int singleNumber(vector<int>& nums) { int bits[32] = {0}; for( int i = 0; i < nums.原创 2020-09-20 16:53:41 · 73 阅读 · 0 评论 -
【剑指offer】面试题56-Ⅰ:数组中数字出现的次数Ⅰ
方法一:查表class Solution {public: vector<int> singleNumbers(vector<int>& nums) { map<int, int> record; vector<int> result; for(int i = 0; i < nums.size(); i++) { record[nums[i]]++原创 2020-09-19 21:04:14 · 69 阅读 · 0 评论 -
【剑指offer】面试题55 - Ⅰ/Ⅱ:二叉树的深度/平衡二叉树
剑指 Offer 55 - I. 二叉树的深度方法一:/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {public: in原创 2020-09-19 11:19:07 · 70 阅读 · 0 评论 -
【剑指offer】面试题54:二叉搜索树的第k大节点
方法一:中序遍历+索引计数返回因为题目给定的二叉搜索树所以通过中序遍历就可以按照从大到小进行遍历但是需要先遍历右子树再遍历左子树/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} .原创 2020-09-18 16:45:13 · 78 阅读 · 0 评论 -
【剑指offer】面试题53-Ⅱ:0~n-1中缺失的数字——二分查找
方法一:二分查找法class Solution {public: int missingNumber(vector<int>& nums) { int left = 0; int right = nums.size() - 1; while( left <= right ) { int mid = left + ( right - left ) / 2; i原创 2020-09-18 15:31:36 · 115 阅读 · 0 评论 -
【剑指offer】面试题53-Ⅰ:在排序数组中查找数字1 —— 二分查找的三个模版
方法一:二分查找左右边界参考labuladong的二分查找的三个模版,进行查找target的左右边界。也可以找到最左边,然后线性找后面相同的数字,但是后面是O(n)的复杂度,如果后面都是相同的元素,就没有O(logn)快。参考链接:https://mp.weixin.qq.com/s/M1KfTfNlu4OCK8i9PSAmug左闭右开以及左闭右闭的代码:class Solution {public: int search(vector<int>& nums, i.原创 2020-09-17 09:48:15 · 102 阅读 · 0 评论 -
【剑指offer】面试题52:两个链表的第一个公共节点——栈、哈希表、双指针
方法一:哈希表/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public: ListNode *getIntersectionNode(ListNode *headA, ListNode *hea原创 2020-09-15 21:56:40 · 120 阅读 · 0 评论 -
【剑指offer】面试题51:数组中的逆序对——归并排序
方法一:顺序遍历(超出时间)class Solution {public: int reversePairs(vector<int>& nums) { int result=0; for(int i = 0; i < nums.size(); i++) { for( int j = i+1 ; j < nums.size(); j++) {原创 2020-09-14 22:23:28 · 77 阅读 · 0 评论 -
【剑指offer】面试题50:第一个只出现一次的字符——哈希表查找
class Solution {public: char firstUniqChar(string s) { //unordered_map<char, int> freq; int freq[256]= {0}; for(char ele: s) freq[ele]++; for(char ele: s) if(freq[ele]== 1) .原创 2020-09-14 22:23:15 · 91 阅读 · 0 评论 -
【剑指offer】面试题49:丑数
方法一:顺序判断通过遍历从1开始的每个数字得到结果,算法效率不是很高class Solution {public: int nthUglyNumber(int n) { if( n <= 0 ) return 0; int index_number = 0; int Ugly_number = 0; while ( Ugly_number < n) { .原创 2020-09-14 21:34:20 · 67 阅读 · 0 评论 -
【剑指offer】面试题46:把数字翻译成字符串——动态规划
方法一:动态规划通过建立转移方程 f(i) = f(i-1) + g(i,i-1)*f(i-2)如果前两个数在10-25之间,则g(i,i-1)为1,否则为0class Solution {public: int translateNum(int num) { string nums = to_string(num); vector<int> dp( nums.size() + 1, 0); dp[0] = 1; .原创 2020-09-06 22:09:34 · 96 阅读 · 0 评论 -
【剑指offer】面试题45:把数组排成最小的数
1.高位的数字肯定是越小越好2.放数字的顺序肯定是先放第一位(最左边一位)最小的元素,如果第一位相等,比较第二位…,以此类推。3.我们如果把所有数字转换成字符串再排列4.对所有的字符串进行比较5.两个字符串s1,s2 如果 s1+ s2 > s2 + s1那么s1 > s2比如s1为3,s2为30,因为 s1+s2 = 330 ,s2+s1 = 303,所以s1 > s2我们因此可以自己定义字符串比较规则:static bool compare(string &s.原创 2020-09-06 11:50:34 · 94 阅读 · 0 评论 -
【剑指offer】面试题42:连续子数组的最大和——附0x80000000与INT_MIN
方法一:暴力法(超时)class Solution {public: int maxSubArray(vector<int>& nums) { int n= nums.size(); int res=-1e8; for(int i=0;i<n;i++){ int sum=0; for(int j=i;j<n;j++).原创 2020-09-01 16:36:48 · 162 阅读 · 0 评论 -
【剑指offer】面试题41:数据流中的中位数——大、小堆实现
方法一:排序取中位数(超时)class MedianFinder {public: /** initialize your data structure here. */ vector<int> record; MedianFinder() { } void addNum(int num) { record.push_back(num); } double findMedian() { .原创 2020-08-31 21:25:11 · 132 阅读 · 0 评论 -
【剑指offer】面试题40:最小的k个数——附C++priority_queue使用方法实现大、小堆
方法一:排序选取K个数class Solution {public: vector<int> getLeastNumbers(vector<int>& arr, int k) { vector<int> result; if( k > arr.size() || k <= 0) return result; sort(arr.begin(),arr.end()); .原创 2020-08-31 08:42:38 · 172 阅读 · 0 评论 -
【剑指offer】面试题39:数组中出现次数超过一半的数字
方法二:通过索引记录——摩尔投票法通过记录一个次数times,如果当前数字和下一个数字结果不相等,则times–如果相同则times++最后的保存的结果就是超过一半的数class Solution {public: int majorityElement(vector<int>& nums) { if( nums.size() == 0 ) return 0; int result = nums原创 2020-08-28 10:50:37 · 82 阅读 · 0 评论 -
【剑指offer】面试题38:字符串的排列
方法一:C++中next_permutation函数class Solution {public: vector<string> permutation(string s) { vector<string> record; sort(s.begin(), s.end()); do{ record.push_back(s); }while(next_permutation( s.beg.原创 2020-08-26 08:55:08 · 107 阅读 · 0 评论 -
【剑指offer】面试题34:二叉树中和为某一值的路径——回溯法
方法一:回溯法1、如果节点为空则return;2、每次把sum减去当前节点的值3、如果当前节点为叶节点即无法继续往下走(当前节点的左右节点为空,且sum为0),则把这是一条正确的路径,push到path中4、通过dfs对路径进行深搜5、如果当前路径搜玩没有触发上面的条件,且为叶节点则会pop路径的数据返回/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *.原创 2020-08-23 15:53:15 · 116 阅读 · 0 评论 -
【剑指offer】面试题33:二叉搜索树的后序遍历序列——递归实现
方法一:递归实现我需要知道二叉搜索树的右边所有的节点都要比根节点大左边的所有节点都比根节点小1.给的后序遍历的最后一个节点是根节点2.从左到右遍历序列,第一个比根节点大的节点后面都是右子树,前面都是左子树class Solution {public: bool verifyPostorder(vector<int>& postorder) { return helper( postorder, 0, postorder.size() - 1 ); .原创 2020-08-23 11:01:29 · 109 阅读 · 0 评论 -
【剑指offer】面试题32:从上到下打印二叉树Ⅰ、Ⅱ、Ⅲ
一、从上到下打印二叉树Ⅰ——层序遍历方法一:队列实现通过队列实现记录每一个节点的子节点,这样就可以实现每个节点的先进先出,实现层序遍历。/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {原创 2020-08-21 22:21:50 · 105 阅读 · 0 评论 -
【剑指offer】面试题31:栈的压入、弹出序列——辅助栈模拟序列
方法一:辅助栈模拟序列思路:建立一个辅助栈如果辅助栈下一个弹出的数据刚好是栈顶数组,那么直接弹出如果不是栈顶数字,则压栈原始序列中没有入栈的数据到辅助栈中class Solution {public:bool validateStackSequences(vector& pushed, vector& popped) {//0.判断两个数组长度是否相等if( pushed.size() != popped.size() )return false;stack reco.原创 2020-08-21 21:09:29 · 75 阅读 · 0 评论 -
【剑指offer】面试题30:包含min函数的栈——栈带取最小值接口
方法一:辅助栈数据栈正常记录数据的push和pop创建一个辅助栈,记录栈中最小值,把最小值放到栈顶实现过程:1、栈的push如果有数值需要push,数据栈正常push,辅助栈判断当前数据的值和辅助栈的栈顶(辅助栈栈顶是数据栈的最小值),如果插入的数据比栈顶小,则插入2、栈的pop正常弹出3、栈的最小值取出辅助栈的栈顶class MinStack {public: /** initialize your data structure here. */ stack&l.原创 2020-08-19 08:38:09 · 115 阅读 · 0 评论 -
【剑指offer】面试题28:对称的二叉树——递归实现
方法一:递归实现对输入的根节点先判断左右是否相等然后进行递归操作:递归结束条件:都为空指针则返回 true只有一个为空则返回 false两个指针当前节点值不相等 返回false递归过程:判断 A 的右子树与 B 的左子树是否对称判断 A 的左子树与 B 的右子树是否对称形式一:/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left.原创 2020-08-18 16:47:49 · 114 阅读 · 0 评论 -
【剑指offer】面试题27:二叉树的镜像——递归实现
方法一:递归实现/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */// class Solution {public: TreeNode* mirror.原创 2020-08-17 17:31:43 · 80 阅读 · 0 评论 -
【剑指offer】面试题26:树的子结构(如何判断一棵树中是否有子树)——递归实现
方法一:递归实现/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {public: bool isSubStructure(T.原创 2020-08-17 17:00:44 · 317 阅读 · 0 评论 -
【剑指offer】面试题25:合并两个排序的链表+链表排序——其实是归并排序的思想,附归并排序代码
方法一:递归实现/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public: ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) { .原创 2020-08-16 20:20:55 · 141 阅读 · 0 评论 -
【剑指offer】面试题24:反转链表——栈实现、三指针、递归反转
方法一:栈实现通过栈把链表里面的值进行保存,最后在把栈里的值取出来放进链表中/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public: ListNode* reverseList(ListN.原创 2020-08-15 11:07:05 · 135 阅读 · 0 评论 -
【剑指offer】面试题22:链表中倒数第K个节点——双指针遍历一次
方法一:双指针遍历一次/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public: ListNode* getKthFromEnd(ListNode* head, int k) { .原创 2020-08-14 22:12:12 · 122 阅读 · 0 评论 -
【剑指offer】面试题21:调整数组顺序使奇数位于偶数前面——双指针
方法一:双指针class Solution {public: vector<int> exchange(vector<int>& nums) { if(nums.size() <=1 ) return nums; int begin = 0; int end = nums.size() - 1 ; //如果左指针大于右指针则退出循环 while(begi.原创 2020-08-14 21:39:49 · 91 阅读 · 0 评论 -
【剑指offer】面试题19:正则表达式匹配
方法一:递归判断class Solution {public: bool isMatch(string s, string p) { //如果p为空,输入的s也为空返回true否则返回false if( p.empty() ) { return s.empty(); } if( p[1] == '*' ) { if( p[0] == s[0] || (.原创 2020-08-14 10:00:00 · 83 阅读 · 0 评论 -
【剑指offer】面试题18:删除链表的节点
方法一:书上图3.3的(b)/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public: ListNode* deleteNode(ListNode* head, int val) { .原创 2020-08-12 21:45:44 · 117 阅读 · 1 评论 -
【剑指offer】面试题17:打印从1到最大的n位数——字符串模拟大数
方法一:顺序打印class Solution {public: vector<int> printNumbers(int n) { vector<int> record( pow(10,n) - 1 ); for(int i = 1; i < pow(10,n) ;i++) { record[i-1] = i; } retu.原创 2020-08-11 21:52:41 · 102 阅读 · 0 评论