- 博客(26)
- 资源 (13)
- 收藏
- 关注
原创 leetcode5.11
1.原地排序,常数空间原地排序:用一个指针控制,第一次从左到右把0拎到前面,第二次1因为只有两个数,所以只要两个并列的for循环就行用一个指针控制头部的范围。void sortColors(vector<int>& nums) { int n=nums.size(); int ptr=0; for(int i=0;i<n;i++){ if(nums[i]==0){
2022-05-11 21:37:40
433
原创 leetcode5.10
1.找出只出现一次的数字要求:线性时间复杂度->位运算用到的性质:任何数和 0 做异或运算,结果仍然是原来的数任何数和其自身做异或运算,结果是 0异或运算满足交换律和结合律。int singleNumber(vector<int>& nums) { int res=0; for(auto e:nums){ res^=e; } return res; }2.找到多数元素用到:哈希表
2022-05-10 21:16:29
319
原创 dp和状态压缩dp的入门
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言 一、pandas是什么? 二、使用步骤 1.引入库 2.读入数据 总结前言做题做到状态压缩dp真的看不懂答案了,从b站找了两个课听,受益匪浅,做了笔记。一、DP入门核心:从集合角度分析dp问题,经验也重要有限级的最优化:从定义求:枚举太难DP优化:1.化零为整(状态表示fi)a:集合...
2022-03-29 12:17:03
1187
原创 蓝桥杯 c++A试题 E: 路径
考察:图论可用算法:floyd算法,gcd的求法,最小公倍数求法1.gcd:背下来嘛,辗转相除int gcd(int a, int b) { return b == 0 ? a : gcd(b, a % b);}2.最小公倍数int bei(int a, int b) { return a * b / gcd(a, b);}3.floyd算法struct graph { int sta; int en; int matx[2022][2022];};void f
2022-03-27 19:51:41
591
原创 开始学Python的第一天
已经掌握了c++,学一下python,毕竟python比c++好应付作业。甚至自信的感觉,今天学到了这些好像会了一大半哈哈哈哈。以下是我根据一套现成代码,学习语法的结果。暂时没找到什么更好的学习方法。numpy是提供数组的库 定义函数 只要 def 函数名()换一行就能开始写了,根据需要return python和C++/Java不一样,没有主函数一说,也就是说python语句执行不是从所谓的主函数main开始的。当运行单个python文件时,如运行a.py,这个时候a的一个属性__name__是.
2022-03-25 10:43:24
1420
原创 二分查找算法2022.3.20
二分查找算法2022.3.20二分查找的前提是有序的,一般是从小到排列。二分查找是枚举查找的优化mid = (low + high+1) / 2;这里不能丢了+1二分的题目主要是必须要求是单调的,一般会有条件等字眼。做这种题目主要还是找到递增或者递减的序列,然后关于序列的判定条件。或者通过观察时间复杂度来看是否可以使用二分,二分法的题目相对来说比较明显,设计起来也比较简单,模板不用死记硬背,理解一下,很快就可以独立写出来。1e-8是10的-8次方#include<iom
2022-03-24 15:40:49
88
原创 递推法与递归法2022.3.14
递推法与递归法2022.3.14递推法是用于数值求解的一个重要算法。存储型的递归和递推:存储就加个数组就好了吧。三角形递推,先赋好值然后从后往前递推。甚至都不需要额外的空间,最后返回a[1][1]即可。...
2022-03-24 15:40:12
143
原创 打表法和模拟法2022.3.13
打表法和模拟法2022.3.13既然不需要考虑时间问题和代码问题,我们一定要将代码设计的具有较高的逻辑性和准确性。求值数论。约数就是因数。题目中的描述是找约数,那我们定义个找约数个数的函数,然后枚举,令 约数个数==100停。既约分数控制最大公约数是1-->求最大公约数,在循环中==1(辗转相除:除数和余数)启发:这道题,分数 的概念就没有用,本质再考 gcd。天干地支以0000年为基准,从000...
2022-03-24 15:38:29
83
原创 差分与前缀和2022.3.19
差分与前缀和2022.3.19差分与前缀和是一对互逆的操作,常常用于处理区间问题,差分法是解决区间加减问题,前缀和是解决区间求和问题的常用办法。秘密就是,对于每个 [l,r] 区间的加减操作都转化为对端点 l,r+1 的操作,前同后相反。对差分数组做这个操作,然后把差分数组按照b[i]=b[i]+b[i-1] 复原,因为是从后往前的操作,后面受前面影响,所以就得到了目的数组。其实很简单,算法分为四部分:输入,差分,操作(+or-),还原前缀和某一项前面所有项的和前缀和是指某序列的前 n
2022-03-24 15:36:06
96
原创 贪心算法2022.3.21
贪心算法2022.3.21在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而使得问题得到全局最优解。贪心算法与枚举法的不同之处在于每个子问题都选择最优的情况,然后向下继续进行,且不能回溯,1.证明原问题的最优解之一可以由贪心选择得到。2.将最优化问题转化为这样一个问题,即先做出选择,再解决剩下的一个子问题。3.对每一子问题一一求解,得到子问题的局部最优解;4.把子问题的解局部最优解合成原来解问题的一个解找钱问题的贪心解法:将大问题转化为一个个小的子问题,每
2022-03-24 15:35:35
789
原创 笔记2022.3.8链表
笔记2022.3.8链表,小王子单链表,前插只需要head,后插需要一个不断更新到最后的指针。想成环最后再指向一下first就行了。约瑟夫环,把东西都写到程序里就行,循环单链表其实也很简单,注意数是到k-1还是k。小王子循环链表,多个before使删除操作简单了很多。但是循环链表的头节点是怎么呆着的?基本不用管,它不是环。出问题的地方有插入,要考虑到在中间插入的情况,before和next都要赋值。...
2022-03-24 15:35:00
335
原创 刷题笔记2022.3.6bst
刷题笔记2022.3.6颠倒32位二进制。uint32_t:unsigned (无符号)int 32位。(n & 1):取二进制的最末位。<<:左移。注意for循环的使用,。给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。标签是位运算,不会,只能想到哈希表。数组中的全部元素的异或运算结果即为数组中只出现一次的数字。规则:相同为0,相异为1,0∧0=0,0∧1=1,1∧0=1,1∧1=0^验证是二叉搜索树。...
2022-03-24 15:33:58
590
原创 刷题笔记2022.3.5位移运算
刷题笔记2022.3.5如果存在一个整数x使得n == 2x,则认为n是 2 的幂次方。标签上有个位运算。不会操作。一个数n是2的幂,当且仅当n是正整数,并且n的二进制表示中仅包含1个1。因此我们可以考虑使用位运算,将n的二进制表示中最低位的那个1提取出来,再判断剩余的数值是否为0即可。编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 '1' 的个数。移位运算:1<<i 是将1左移i位,即第i位为1,其余...
2022-03-24 15:33:22
123
原创 刷题笔记2022.3.4动态
刷题笔记2022.3.4假设你正在爬楼梯。需要n阶你才能到达楼顶。每次你可以爬1或2个台阶。你有多少种不同的方法可以爬到楼顶呢?见过这个,动态规划我好像自己还是写不出来。状态转移方程在这里,不知道怎么去维护。第n个台阶只能从第n-1或者n-2个上来,直接用数去维护。意味着爬到第x级台阶的方案数是爬到第x - 1级台阶的方案数和爬到第x - 2级台阶的方案数的和。然后从第三层开始更新就好了,for循环相当于是在动态规划着。打家劫舍。如果房屋数量大于两间,应该如何计算能够偷窃到的...
2022-03-24 15:32:35
143
原创 刷题笔记2022.3.3回溯
刷题笔记2022.3.3给定两个整数n和k,返回范围[1, n]中所有可能的k个数的组合。你可以按任何顺序返回答案。标签是回溯。我印象中的回溯是八皇后问题,但我并不会做。方法:递归实现组合型枚举n个元素选 k个,在dfs的时候需要多传入一个参数 k,即 dfs(cur,n,k)。在每次进入这个dfs 函数时,我们都去判断当前 temp 的长度是否为 k,如果为 k,就把temp 加入答案并直接返回,即:解决⼀个回溯问题,实际上就是⼀个决策树的遍历过程。也就是Dfs遍历决策树我...
2022-03-24 15:32:00
173
原创 刷题笔记2022.3.2树
刷题笔记2022.3.2做过这个:将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。这次用递归的思想:就是要判断l1和l2哪一个链表的头节点的值更小,然后递归地决定下一个添加到结果里的节点。二叉树的前中后序遍历:给你二叉树的根节点root,返回它节点值的前序遍历。真的不熟二叉树。其实很简单,自定义递归函数preorder。以上就是今天的全部题目了,真的太简单了哈哈哈哈哈。 了解一个递归问题,斐波那契数列。但凡遇到需要递归的问题,最好都画出递归
2022-03-23 20:53:56
137
原创 刷题笔记2022.3.1bfs矩阵
刷题笔记2022.3.11.给定一个由0和1组成的矩阵mat,请输出一个大小相同的矩阵,其中每一个格子是mat中对应位置元素到最近的0的距离。跟前几天那个上下左右的广度优先搜索很像,但是这个是找到最小的为止,动态规划。(多源bfs)如何对于矩阵中的每一个1,都快速地找到离它最近的0呢?让1找0,0有好多个,不好控制那么让0找1也是可以的。我们可以添加一个「超级零」(虚拟的),它与矩阵中所有的0相连,这样的话,任意一个1到它最近的0的距离,会等于这个...
2022-03-23 20:53:23
235
原创 刷题笔记2022.2.28tree
刷题笔记2022.2.28两个二叉树进行覆盖,数字相加。我的疑问在于,需要设置新树吗,还是说,以一个树为基础加上另一个树就可以了?果断深度优先,因为广度优先找到兄弟节点太难了。对一个节点进行合并之后,还要对该节点的左右子树分别进行合并。这是一个递归的过程。用递归真的使问题非常简单。只需要考虑三个基本情况,返回值,中间每部是怎么变的。填充它的每个 next 指针,让这个指针指向其下一个右侧节点。最后输出是层序遍历的,层序遍历用什么?队列or数组。我的方法思维是对的但过程有点迷。按层遍历
2022-03-23 20:52:41
94
原创 刷题笔记2022.2.27bfs
刷题笔记2022.2.27给二维数组表示的图重新上色,(行,列,新颜色)。给出一个点,原本跟他一样色的辐射点都要换成新颜色。辐射状的一个一个是咋找到的呢?那么多点,递归我猜。如果前后颜色一样就不需要修改。从方法一:广度优先搜索+队列二维数组进队列的表示:queue<pair<int,int>>que;Queue.emplace():把元素插在队列尾部。图解:真的无语辣,这一行都是&&,顺序不一样竟然影响结果。mx...
2022-03-23 20:51:55
539
原创 刷题笔记2022.2.26字符串
刷题笔记2022.2.26找出其中不含有重复字符的最长子串的长度滑动窗口问题,让我想到了kmp算法,kmp是模式匹配,俩字符串比较的。这里可以从每一个字符开始,不包含重复字符的最长子串,那么其中最长的那个字符串即为答案。没出现过”是由unordered_set的count(value)控制的,0个时是没出现过。这里的滑动窗口使用假性的双指针的移动来控制:右指针的右移,由!set.count(rk+1)控制,左指针右移由循环控制(只要一个最大记录完毕左指针就右移一次)最大由max每轮都比一个..
2022-03-23 20:50:37
84
原创 刷题笔记2022.2.25链表
刷题笔记2022.2.25链表,双指针。不会指针用数组做也可,->把链表拷贝到数组中。vector.back()意思是返回数组中末尾的元素。注意输出的是节点,就是list node*类型的。快慢指针法也挺简单的,就是一个速度是1,一个是2,2的走完了1的在中间那。 删除链表倒数第n个节点。我试了先转移到vector里再删除的方法,但是总编译出错。不太敢用链表做,笑死,其实就是不会。复习一下链表的各种用法。方法一:计算链表长度我们首先从头节点开始对链表进行一次遍历,得到链表的长度 LL。随后
2022-03-23 20:49:57
1746
原创 刷题笔记2022.2.24三角
刷题笔记2022.2.24反转字符数组当然这里用reverse()相当简单。如果不能用这个方法的话,应该要用双指针。双指针注意别忘了beg和end怎么变的就行,还是挺简单的。反转字符串中的单词。String我是真不太会。实际上只需要在反转的时候加上“你所反转的是单词”这一限制条件就够了。从分界入手。 二维数组转化成一维数组的问题。这个vector<vector<int>>看的我头疼。形象化地来说,我们把这个二维数组「排扁」成了一个一维数组。如果读者对机器学习有一定了解
2022-03-23 20:48:18
1783
原创 刷题笔记2022.2.23数组和简单的规划
刷题笔记2022.2.23返回两数组的交集:返回结果中每个元素出现的次数,应与元素在两个数组中都出现的次数一致,伤脑筋怎么回事。看来得复杂一点方法一:哈希表。需要用哈希表存储每个数字出现的次数。首先遍历第一个数组,并在哈希表中记录第一个数组中的每个数字以及对应出现的次数,然后遍历第二个数组,对于第二个数组中的每个数字,如果在哈希表中存在这个数字,则将该数字添加到答案,并减少哈希表中该数字出现的次数。vector在用的时候不需要提前设定大小for(int i:num)其实就是 叫 foreach循.
2022-03-23 20:47:18
90
原创 刷题笔记2022.2.22数组和指针
刷题笔记2022.2.22合并两个有序数组,用双指针,真的不会,vector的用法记不清~两个方法:1先合并后排序。用法:for里是nums1[i+1]=nums2[i]再用sort函数即可2.双指针法:利用两个都已排好队的性质,比较同一位置的元素,放到集合里,再全覆盖给nums1,cur是现在要往集合里插入的。还有个题是把递增数列的平方放到新递增里这里的双指针是正负数字的分界线利用vector里的反转函数reverse解决数组的移动问题。比如向右移动三位,先整体旋转,再在分界左右各转一次就好
2022-03-23 20:45:50
318
原创 刷题笔记2022.2.21数组+哈希表
1.unordered_map:iterator find ( const key_type& k );查找key所在的元素。- 找到:返回元素的迭代器。通过迭代器的second属性获取值- 没找到:返回unordered_map::end先排序,再看相邻,排序直接用sort(); 从数组中找出具有最大和的连续子数组:动态规划我还不会,先看简单方法(特很牛) 忘了怎么封装二分查找了,真不知道都学到哪里去了呜呜呜intmid=(high-low)/2+low;这一行改了好久,要.
2022-03-23 20:44:29
302
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅