知识点
鑫鑫6947
来自吉林大学计算机的一枚热爱编程的程序猿
展开
-
剑指offer 数值的整数次方
本题的时间复杂度为o(logn),采用的是快速幂的方法,比如求4^5,如果暴力求解,时间复杂度就是o(n), 4 ^ 5可以拆成 4 ^ 1 * 4 ^ 4,注意1和4的由来,5的二进制表示是101,低位的1对应2的0次方,那么就是1,高位的1对应2的2次方,那么就是4,所以任何一个数的任何次幂都可以拆成这样的形式,因为二进制可以表示任何一个数,所以整个代码就相当于求n的二进制,在程序中,n一直在右移,相当于一直除以2,所以时间复杂度就是o(logn)class Solution {public:原创 2021-12-15 13:07:58 · 776 阅读 · 0 评论 -
剑指offer 二进制中1的个数
有两种方法1 使用lowbit()函数,自定义 lowbit函数是计算出一个二进制数的最后一个1及其后面的0的大小,比如111100,那么lowbit就是返回100,相当于是求1的个数class Solution {public: int lowbit(int m) { return m & -m; } int NumberOf1(int n) { int res = 0; while (n) {原创 2021-12-15 10:48:36 · 116 阅读 · 0 评论 -
剑指offer 机器人的运动范围
本题推荐使用宽度优先遍历宽度优先遍历:bfs,需要用到队列class Solution {public: int getnum(int x, int y) { return x % 10 + x / 10 + y % 10 + y / 10; } int movingCount(int threshold, int rows, int cols) { if (rows == 0 || cols == 0) return 0;原创 2021-12-15 00:18:21 · 107 阅读 · 0 评论 -
剑指offer 矩阵中的路径
采用深度优先遍历的方法,也就是dfs。代码分为两大块首先是exist函数,对于矩阵中的每个元素都进行深度优先遍历,如果都没有找到,那就返回false。其次是dfs函数的实现,dfs有5个参数,分别是矩阵,字符串,已经匹配的字符个数,即将进行判断并且dfs的字符的x,y坐标。在dfs函数内部,首先判断当前的x y坐标对应的字符是否和字符串中相应的字符匹配,如果不匹配直接返回false,如果匹配,进行接下来的判断,如果匹配的个数 = size - 1 ,证明前size - 1 个字符已经匹配成功,而刚刚原创 2021-12-14 21:39:42 · 96 阅读 · 0 评论 -
剑指offer 重建二叉树
这个题比较难理解,建议在草稿纸上自己演示一遍程序的执行过程,执行的样例可以按照这个例子思路就会慢慢清晰。规则:先根遍历:根左右。中根遍历:左根右题目给的两个数组,先根遍历和中跟遍历,先根遍历的第一个元素就是根节点,在中根遍历中,根节点把中根遍历数组分为两部分,分别是左子树和右子树,那么左右子树又可以根据这个性质,再继续划分。整体思路就是这样。比较难理解的地方就是,如何求出左右子树在中根遍历数组中的起始位置和终止位置。也就是代码中的recur函数的参数,node->left = recur(原创 2021-12-14 15:27:13 · 859 阅读 · 0 评论 -
斐波那契数列的三种算法
暴力递归,时间复杂度是2^n,空间复杂度是o(n),这个也是最不推荐使用的,面试的时候肯定不让用代码如下class Solution {public: int fib(int n) { if (n == 0 || n == 1) return n; return fib(n - 1) + fib(n - 2); }};2 直接用数组算出来前n项,一般的题目都会限制数列的长度,比如长度为101,那么可以直接求解,下面取模是因为数列后面会超过in.原创 2021-12-13 16:17:41 · 315 阅读 · 0 评论 -
leetcode第270场周赛,5942 删除链表的中间节点
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : val(x), next(nullptr) {} * ListNode(int x, ListNode *next) : val(x), next(next)原创 2021-12-05 20:30:48 · 61 阅读 · 0 评论 -
leetcode第270场周赛,5942 找出3位偶数
方法1:直接枚举100 - 999的所有三位数字因为这道题是easy级别的,所以不用多想,因为题目比较特殊,只有三位数,所以就可以先把所有的三位偶数都列举出来,然后看是否符合题目中的条件,如果符合,就插入到res中,最终返回即可class Solution { int hash[10];public: vector<int> findEvenNumbers(vector<int>& digits) { vector<int>原创 2021-12-05 20:28:28 · 72 阅读 · 0 评论 -
acwing 154 滑动窗口
本题用到单调队列,就是代码中的q[N],存放的是从大到小或者是从小到大的元素下标,每次输出队头元素,tt表示队尾,hh表示队头#include<iostream>using namespace std;const int N = 1e6 + 10;int a[N], q[N];int main(){ int n,k; int hh = 0, tt = -1; cin >> n >> k; for (int i = 0; i <原创 2021-11-23 20:23:49 · 490 阅读 · 0 评论 -
acwing 3302 表达式求值
利用中缀表达式#include<iostream>#include<unordered_map>#include<cstring>#include<algorithm>#include<stack>using namespace std;stack<int> num;stack<char> op;void eval(){ auto b = num.top(); num.pop(); auto原创 2021-11-07 14:42:43 · 64 阅读 · 0 评论 -
leetcode 266场周赛 5918. 统计字符串中的元音子字符串
没啥好方法,直接暴力求解了class Solution {public: bool isvalid(string s1){ if (s1.find('a') != -1 && s1.find('e') != -1 && s1.find('i') != -1 && s1.find('o') != -1 && s1.find('u') != -1 ) return true; else r原创 2021-11-07 14:18:32 · 56 阅读 · 0 评论 -
2021-11-07 leetcode 266场周赛 单独计算每个元音的出现次数
此题采用简便算法,当字符串word中的word[i]是元音的时候,只需要计算word[i]出现在多少个子字符串中即可。假设word[l,r]是包含word[i]的子字符串,word的长度为n,那么l需要满足0 <= l <= i, r需要满足i <= r <= n -1。那么l有 i + 1 种情况,r有 n - i 种情况(情况数 = 右端点 - 左端点 + 1)。那么包含word[i]的子字符串数量 = (i + 1)*(n - i)。class Solution {p原创 2021-11-07 12:41:20 · 76 阅读 · 0 评论 -
acwing 829模拟队列
用数组来模拟队列#include<iostream>using namespace std;const int N = 1e5 + 10;int a[N],tt = -1,hh = 0;//hh指向队头,tt指向队尾,看成数组,插入元素的时候,尾指针向右移动,弹出元素的时候,头指针向右移动//hh在tt的左边,即队头指针在队尾指针的右侧void push(int x){ a[ ++tt] = x;}void pop(){ hh ++;}void query()原创 2021-11-07 10:05:07 · 71 阅读 · 0 评论 -
acwing 828 模拟栈
采用数组模拟栈,tt模拟栈顶指针#include<iostream>using namespace std;const int N = 1e5 + 10;int a[N],tt = -1;string str;bool isempty(){ if (tt == -1) return true; else return false;}void push(int x){ tt ++; a[tt] = x;}void pop(){原创 2021-11-06 15:43:21 · 46 阅读 · 0 评论 -
acwing 827 双链表
采用数组来替代链表#include<iostream>using namespace std;const int N = 1e5 + 10;int r[N],l[N],idx,e[N];void init(){ r[0] = 1; l[1] = 0; idx = 2; }void insert(int k,int x){ e[idx] = x; r[idx] = r[k]; l[idx] = k; l[r[k]] =原创 2021-11-06 15:33:23 · 54 阅读 · 0 评论 -
acwing 842 排列数字
本题是dfs的经典题型,到达底部的时候,进行回溯并且恢复,做题的时候,画图更好理解一点#include<iostream>using namespace std;const int N = 10;int path[N];bool flag[N];int n;void dfs(int u){ if (u == n){ for (int i =0; i < n; i ++) cout << path[i] <<" ";原创 2021-11-06 14:42:13 · 146 阅读 · 0 评论 -
acwing 830 单调栈
#include<iostream>using namespace std;const int N = 1e5 + 10;int stk[N],tt;int main(){ int n; cin >> n; for (int i = 0; i < n; i ++){ int x; cin >>x; while(tt && stk[tt] >= x) tt --;原创 2021-11-04 14:35:46 · 62 阅读 · 0 评论 -
leetcode 265周赛 找出临界点之间的最小和最大距离
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : val(x), next(nullptr) {} * ListNode(int x, ListNode *next) : val(x), next(next)原创 2021-11-04 14:32:15 · 87 阅读 · 0 评论 -
acwing 826 单链表
//采用数组来表示单链表,e数组用来存下标为x的结点的值,ne数组用来存下标为x的结点的next的下标,e存值,ne存下标,idx起索引的作用,插入的时候会用到#include<iostream>using namespace std;const int N = 1e5 + 10;int e[N],ne[N],head,idex;void init(){ head = -1; idex = 0;}//将x插入到头结点的后面void add_to_head(in原创 2021-10-28 15:51:55 · 71 阅读 · 0 评论 -
acwing 803 区间合并
#include<iostream>#include<vector>#include<algorithm>using namespace std;typedef pair<int,int> PII;vector<PII> a;void merge(vector<PII> &res){//先把第一个区间放到数组中 int st = (*res.begin()).first, ed = (*res.begin())原创 2021-10-28 12:53:21 · 74 阅读 · 0 评论 -
acwing 802 区间和
//将离散的点集中起来,省空间,利用前缀和,省时间#include<iostream>#include<vector>#include<algorithm>using namespace std;typedef pair<int,int> PII;const int N = 3e5 + 10;int n,m;int a[N],s[N];vector<int> alls;vector<PII> add,query;i原创 2021-10-28 12:52:16 · 46 阅读 · 0 评论 -
acwing 2816 判断子序列
#include<iostream>using namespace std;const int N = 1e5 + 10;int a[N], b[N];int main(){//时间复杂度是o(n),双指针算法 int n, m,num = 0; cin >> n >> m; for(int i = 0; i < n; i ++) cin >> a[i]; for(int i = 0; i < m; i ++原创 2021-10-27 14:29:15 · 57 阅读 · 0 评论 -
acwing 800数组元素的目标和
//法1,采用map键值对查找的方法,时间复杂度是o(nlogn),find函数的时间复杂度是o(logn)#include<iostream>#include<vector>#include<unordered_map>using namespace std;vector<int> a;unordered_map<int,int> b;int main(){ int n,m,x,v; cin>>n>原创 2021-10-27 13:10:06 · 59 阅读 · 0 评论 -
acwing 801二进制中1的个数
//方法1#include<iostream>using namespace std;int main(){//输入的数字和1按位与,不断右移可以得到1的个数 int n,k; cin >> n; while (n --){ cin >> k; int num = 0; while(k != 0){ if((k & 1) == 1) num原创 2021-10-27 10:02:46 · 56 阅读 · 0 评论 -
acwing 788 逆序对的数量
如果暴力求解,会超时,时间复杂度是o(n^2)简便算法:利用归并排序的归并阶段,可以求出逆序对的数量假设数组左右两边分别为low,high,中间值为mid = low + high >> 1i = low , j = mid + 1,当找到a[i] >= a[j]的时候,说明a[i]到a[mid]都是比a[j]要大的元素,所以个数就是mid - i + 1。代码如下#include<iostream>using namespace std;const int N原创 2021-10-26 20:34:51 · 58 阅读 · 0 评论 -
关于堆区,栈区,静态存储区的最大空间
堆区 :最大为2G,约等于2 ✖ 10^9字节那么int最多为10的8次方个栈区:最多为1M,约等于10的6次方字节那么int最多为10的5次方个静态存储区也是2G,同理总结:在默认情况下,栈只能得到1M大小的内存,全局静态存储可以得到2G,而在32位操作系统和64位操作系统下的堆可以分别得到2G和无限内存...原创 2021-10-26 20:15:09 · 3800 阅读 · 0 评论 -
acwing 786第K个数
有两种解法,首先用快速排序算法,这种算法时间复杂度是o(nlogn)#include<iostream>using namespace std;const int N = 1e5 + 10;int q[N];void quick_sort(int a[],int low,int high){ if(low >=high) return; int i = low - 1, j = high + 1, x = a[(low + high)>>1];原创 2021-10-26 15:43:58 · 55 阅读 · 0 评论 -
acwing 798差分矩阵
#include<iostream>using namespace std;const int N = 1e3 + 10;int a[N][N],b[N][N];void insert(int x1,int y1,int x2,int y2,int c){ b[x1][y1] += c; b[x2 + 1][y1] -= c; b[x1][y2 + 1] -= c; b[x2 + 1][y2 + 1] +=c; }int main(){原创 2021-10-26 11:48:26 · 46 阅读 · 0 评论 -
并发和并行的区别
并行是指两个或者多个事件在同一时刻发生。并发是指两个或多个事件在同一时间间隔发生。并行就好比在不同车道上同向行驶的汽车并发就像电脑中的cpu调用,不断的切换,由于切换的过快,给人的感觉好像它们在同时执行...原创 2021-10-25 16:56:27 · 61 阅读 · 0 评论 -
acwing796 子矩阵的和
#include<iostream>using namespace std;const int N = 1e3 + 10;int a[N][N],s[N][N];int main(){ int n,m,q; cin>>n>>m>>q; for(int i = 1; i <= n; i ++) for(int j = 1;j <= m; j ++) cin>>a[i][j]; for原创 2021-10-20 16:40:59 · 44 阅读 · 0 评论 -
acwing797差分
#include<iostream>using namespace std;const int N = 1e5 + 10;int a[N],b[N];void insert(int l,int r,int c){ b[l] += c; b[r + 1] -= c;}int main(){ int m,n; cin>>n>>m; for(int i =1;i <= n;i ++){ cin>>a[原创 2021-10-20 16:38:38 · 41 阅读 · 0 评论 -
aciwng 高精度加法
#include<iostream>#include<vector>#include<cstring>using namespace std;const int N = 1e5 + 10;vector<int> A,B,C;void add(vector<int> &A,vector<int> &B){ int t = 0,i = 0; for(;i < A.size()||i <原创 2021-10-19 20:47:05 · 83 阅读 · 0 评论 -
acwing 算法模板
acwing 求前缀和#include<iostream>using namespace std;const int N = 1e5 + 10;int s[N],a[N];int main(){ int m,n,l,r; cin>>m>>n; for(int i =1; i <= m; i ++) cin>>a[i]; for(int i =1;i <= m; i ++) s[i] = s[i -原创 2021-10-18 13:10:48 · 60 阅读 · 0 评论 -
快速排序算法模板
快速排序算法模板```cppvoid quick_sort(int q[], int l, int r){ if (l >= r) return; int i = l - 1, j = r + 1, x = q[l + r >> 1]; while (i < j) { do i ++ ; while (q[i] < x); do j -- ; while (q[j] > x); if原创 2021-10-18 10:58:14 · 37 阅读 · 0 评论 -
保留有效数字问题求解
头文件#include输出格式:cout << setprecision(5) << 小数 << endl;保留几位有效数字遵循的是四舍五入方法。保留几位小数:cout << setiosflags(ios::fixed) << setprecision(1) <<小数<< " “;或者用printf(”%.2f",a)表示保留两位小数注意对于整数,如果使用有效数字的方法,不可行,例如7保留2位有效数字,输出结果仍然原创 2021-03-28 09:58:23 · 629 阅读 · 0 评论