自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(55)
  • 资源 (1)
  • 收藏
  • 关注

原创 剑指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 797

原创 剑指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 136

原创 剑指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 129

原创 剑指offer 矩阵中的路径

采用深度优先遍历的方法,也就是dfs。代码分为两大块首先是exist函数,对于矩阵中的每个元素都进行深度优先遍历,如果都没有找到,那就返回false。其次是dfs函数的实现,dfs有5个参数,分别是矩阵,字符串,已经匹配的字符个数,即将进行判断并且dfs的字符的x,y坐标。在dfs函数内部,首先判断当前的x y坐标对应的字符是否和字符串中相应的字符匹配,如果不匹配直接返回false,如果匹配,进行接下来的判断,如果匹配的个数 = size - 1 ,证明前size - 1 个字符已经匹配成功,而刚刚

2021-12-14 21:39:42 119

原创 剑指offer 旋转数组的最小数字

此题最简单的算法就是直接sort排序,然后返回第一个元素。或者直接遍历数组,找出最小的数字,但是,面试的时候显然不能用这两种算法,因为时间复杂度高,sort的时间复杂度是o(nlogn),直接遍历数组求最小值时间复杂度是o(n),面试的时候用二分算法最好,时间复杂度可以大大降低,变为o(logn)。思路,这个题目的数组很特殊,分为两部分,每个部分都是递增排序的,如下图,水平坐标看作数组的下标,竖直坐标看作数组的值的大小,有可能数组的开头和结尾是重复的,所以在算法开头,就把重复的去掉,因为重复的会影响二分

2021-12-14 20:18:14 808

原创 剑指offer,二叉树的下一个节点

本题是求二叉树中序遍历的节点的下一个节点。总体可以分为两种情况:1 该节点有右子树,那么后继节点就是右子树最左侧的节点2 该节点没有右子树,那么后继节点要么是NULL,要么是祖先节点当该节点一直向上走的时候,如果有一个祖先是某节点的左儿子,那么某节点就是后继节点/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *r

2021-12-14 16:17:35 960

原创 剑指offer 重建二叉树

这个题比较难理解,建议在草稿纸上自己演示一遍程序的执行过程,执行的样例可以按照这个例子思路就会慢慢清晰。规则:先根遍历:根左右。中根遍历:左根右题目给的两个数组,先根遍历和中跟遍历,先根遍历的第一个元素就是根节点,在中根遍历中,根节点把中根遍历数组分为两部分,分别是左子树和右子树,那么左右子树又可以根据这个性质,再继续划分。整体思路就是这样。比较难理解的地方就是,如何求出左右子树在中根遍历数组中的起始位置和终止位置。也就是代码中的recur函数的参数,node->left = recur(

2021-12-14 15:27:13 859

原创 斐波那契数列的三种算法

暴力递归,时间复杂度是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 319

原创 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 66

原创 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 74

原创 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 &lt

2021-11-23 20:23:49 509

原创 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 65

原创 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 62

原创 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 82

原创 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 73

原创 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 49

原创 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 56

原创 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 152

原创 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 65

原创 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 96

原创 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 72

原创 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 79

原创 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 48

原创 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 76

原创 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 63

原创 acwing799 最长连续不重复子序列的长度

这道题和牛客上的最长无重复子数组一样采用双指针算法,i指针先往后移,用数组s,或者哈希map<int,int>来表示每个i走过的数字的个数,每当i走过一个不重复的数字的时候,就更新一下当前的不重复长度,当遇到某个数字的个数是2的时候,说明出现重复了,此时我们需要找到这个数字在之前重复的位置,那么就用j指针,j一直后移,直到找到这个重复的位置,j指针走到这个重复位置的下一个位置,再更新长度即可#include<iostream>using namespace std;const

2021-10-27 10:41:21 68

原创 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 59

原创 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 61

原创 关于堆区,栈区,静态存储区的最大空间

堆区 :最大为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 4055

原创 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 57

原创 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 53

原创 并发和并行的区别

并行是指两个或者多个事件在同一时刻发生。并发是指两个或多个事件在同一时间间隔发生。并行就好比在不同车道上同向行驶的汽车并发就像电脑中的cpu调用,不断的切换,由于切换的过快,给人的感觉好像它们在同时执行...

2021-10-25 16:56:27 65

原创 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 48

原创 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 46

原创 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 86

原创 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 65

原创 快速排序算法模板

快速排序算法模板```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 39

原创 保留有效数字问题求解

头文件#include输出格式:cout << setprecision(5) << 小数 << endl;保留几位有效数字遵循的是四舍五入方法。保留几位小数:cout << setiosflags(ios::fixed) << setprecision(1) <<小数<< " “;或者用printf(”%.2f",a)表示保留两位小数注意对于整数,如果使用有效数字的方法,不可行,例如7保留2位有效数字,输出结果仍然

2021-03-28 09:58:23 646

原创 1072 开学寄语 (20分)(详细代码和测试点2分析)

注意测试点2,当物品编号为0123的时候,输出的时候也要是四位数字0123#include <iostream>#include<cstdio>#include<string>using namespace std;int goods[10000] = {0};string s;int main(){ int n, m, num1 = 0,n...

2020-03-21 09:39:27 378

原创 1069 微博转发抽奖 (20分)易错点分析

在序号满足题目条件的情况下,还要判断是否多次中奖,如果超过一次,那么就后延,直到有人满足没中过奖,输出昵称,(接下来是重点),然后从这个人的序号开始,相隔给定的数目,再继续查找。还有一点就是利用map<string,int> 来记录是否中奖重复#include <iostream>#include<algorithm>#include<cstdi...

2020-03-20 18:22:54 221

u盘做系统.docx

电脑做系统技巧,掌握后不再花钱找人重装系统,自己动手免费装系统。 U盘重装windows操作系统详细教程,有详细的步骤和图片,有什么不足也可以提出来,我会慢慢改正。

2020-03-23

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除