自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(35)
  • 收藏
  • 关注

原创 数据结构-线性表(数组)-双指针-不定长滑动窗口567&713&3&697

目录什么时候使用不定长滑动窗口(尺取法)?尺取法做法跟前缀和法的区别?leetcode题713. 乘积小于 K 的子数组什么时候使用不定长滑动窗口(尺取法)?寻找一个容器中是否有(有多少个)子容器符合某种条件,根据上述,这个条件大概率是指小于某某指,可以使用尺取法。尺取法做法尺取法做法: 现在遇到的尺取法就是固定右边界,这时该窗口刚好符合不超过条件,当右边界往右再移动一下就会不符合条件。这时就需要右移左边界。左右指针都只会增加不会减小。跟前缀和法的区别?什么时候尺取法?什么时候前缀和法?那种场景

2022-05-27 11:37:49 136

原创 C++ 基础知识点

float 类型如何存储?float:一位符号位,8位指数位,23位尾数位。double :1 11 52例如9.125 = 1001.001 = 1.001001*(2^11) = 1.001001*(2^3)9.125为正,符号位:0指数位为3偏移127,结果为130 指数位:10000010 为解决指数为负时无法存储的现象,此处的指数值在存储时需加上偏移量1279.125二进制形式以科学计数法表示时,小数部分为001001尾数位:001001,后面补零补码、反码、阶码、..

2022-05-23 15:51:43 276

原创 数据结构-线性表(数组)-双指针-定长滑动窗口567

定长窗口方法:固定窗口长度不变,使用该窗口在序列中滑动,判断当前窗口中的元素跟目标是否匹配567.字符串的排列方法固定窗口,由于排列不会改变字符串中每个字符的个数,所以只有当两个字符串每个字符的个数均相等时,一个字符串才是另一个字符串的排列。所以可以通过对应元素个数是否相等来判断是否匹配。数组cnt1表示s1中每个字符出现的次数,数组cnt2表示s2窗口中每个元素出现的次数。判断两个数组是否相等就可以。对上面优化,因为每次滑动窗口,只统计了一进一出两个字符,但是要比较整个数组,浪费资源。只

2022-05-19 10:08:23 110

原创 数据结构-线性表(数组)-双指针-快慢指针 Offer22&19&141+142floyd判环法

剑指 Offer 22. 链表中倒数第k个节点

2022-05-14 11:48:23 197

原创 数据结构-线性表(数组)-双指针->数组逼近(左右指针)167 & 15* & 18 &11*

两数之和 II - 输入有序数组思路我的思路:从数组两端逼近target,左右指针指向元素和大于target,则右指针左移;反之,左值针右移。其他:确定一个元素,找target-nums[i],有序数组,二分查找。代码我的做法:class Solution {public: vector<int> twoSum(vector<int>& numbers, int target) { int len = numbers.size().

2022-05-06 11:20:24 291

原创 数据结构-线性表(数组)-双指针->数组追赶(快慢指针) 977&344&151&524&611无&80&986(没做)(总结各种排序算法 原地算法图解)

这类题为什么叫数组追赶?有序数组的平方思路法一:先对nums每个元素进行平方,再sort排序法二:找到nums中负数和正数的分界线,进行类似与归并排序进行排序。[0,divid]为负数,平方后递减;[divid+1,len-1]为正数,平方后递增。相当于有了两个有序数组,用两个指针分别指向前一个数组最后面元素和后一个数组最前面的元素,均为两个数组中最小的元素,依次比较,选较小的放入新数组中,并且移动指针,当某个指针移出边界后,令一个指针还没遍历到的依次放入新数组就可。法三:左右指针,nums

2022-04-24 16:40:16 1291

原创 数据结构-线性表(数组)-线性前缀和+二分查找 528. 按权重随机选择 非常重要

思路构造前缀和数组,在0~sum中生成一个随机数,找第一个严格大于随机生成数x的数,这个数对应的下标就是要找的下标。前缀和数组presum,presum[i]与前一位置的前缀和presum[i-1]相减正好的下标i对应的数,也就是下标i的权值,就相当于以长度代表概率,对于任意一个x,他严格小于最小前缀和presum[i],表示他在[presum[i-1],presum[i]]区间内,区间长度:presum[i]-presum[i-1] = w[i],随机数一共有sum种情况,在以上区间的情况为w[i].

2022-04-22 11:26:32 348

原创 数据结构-线性表(数组)-线性前缀和+哈希表 930 && 974 && 525

930和相同的二元子数组 同560题思路求连续子数组,一般考虑前缀和。需要查找再想到哈希表。sum[i]表示数组nums中0~i的前缀和,假设子数组[j,i+1]和为gal,也就是sum[j]-sum[i] = gal;子数组长度为j-i;所以遍历nums,查看当前值前缀和在哈希表中存在的个数x,就说明当前值为结尾的子数组和为gal的子数组个数为x个代码解析class Solution {public: int numSubarraysWithSum(vector<.

2022-04-21 11:19:57 461

原创 数据结构-线性表(数组)-前缀和变形-前缀积 238. 除自身以外数组的乘积&&剑指 Offer 66. 构建乘积数组

解题思路与前缀和数组和后缀和数组类似,构建前缀积数组和后缀积数组利用O(1)的空间复杂度,构建后缀积数组,利用前缀积值利用前缀积值和后缀积值同时进行 代码q前缀积数组和后缀积数组class Solution {public: vector<int> productExceptSelf(vector<int>& nums) { int len = nums.size(); vector<int> .

2022-04-15 10:29:12 983

原创 数据结构-线性表(数组)-前缀和统计排序 523. 连续的子数组和 哈希 除法转换成求余

解题思路暴力解法:先生成一个前缀和数组,再从字串长度为L = 2开始到L = len 对数据数组进行遍历。会超时。O(n^2)利用前缀和值+哈希表。其中有一个同余定理,既当a%x == b%x 时,b-a(假设b>a)为x的整数倍。可以遍历数组,每次计算当前前缀和的值sum,sum%x在哈希表中时,需要再进行判断当前位置与哈希表中相等的那个之间的距离是否大于等于2如果sum%x不在哈希表中时,把sum%x存入哈希表中哈希表初始化时要存入(0,-1),下标比长度小1,当元素前.

2022-04-15 09:59:33 85

原创 数据结构-线性表(数组)-前缀和入门 724. 寻找数组的中心下标 && 1588. 所有奇数长度子数组的和 &&303. 区域和检索 - 数组不可变

724. 寻找数组的中心下标解题思路枚举数组中每个元素,计算左边和右边是否相等,相等则返回下标。代码int pivotIndex(vector<int>& nums) { int len = nums.size(); //1 int sum[len]; for(int i = 0;i<len;++i){ sum[i] = nums[i]; if(i){

2022-04-08 09:43:42 1274

原创 数据结构-线性表(数组)-原地算法 217.存在重复元素&&2154.将找到的值乘以2(排序 哈希表)

解题思路法一:先将数组排序,再利用候选数组(跟26. 删除有序数组中的重复项一样),如果候选数组最后的索引与原数组长度-1相等,则没有相同的元素查找可以利用哈希表,如果当前元素没有在哈希表中,则把当前元素添加进去,如果在,则直接返回false。代码法一:class Solution {public: bool containsDuplicate(vector<int>& nums) { int len = nums.size(); ..

2022-04-02 10:43:54 424

原创 数据结构-线性表(数组)-原地算法 26. 删除有序数组中的重复项

思路数组是升序,所以相等的元素一定出现在连续的一段区间内。核心是对比,相等就存到候选数组中,不相等就舍弃。最后得到的是候选数组。代码class Solution {public: int removeDuplicates(vector<int>& nums) { int j = 0; int len = nums.size(); for(int i = 1; i<len; ++i){ i..

2022-03-31 20:30:33 628

原创 数据结构-线性表(数组)-使用线性枚举求数组中最值 2170.使数组变成交替数组的最少操作数(非常重要的题-hash)

思路:1.每个数都可以经过一次修改(注意:不是加一或者减一),所以每个数最多只需要修改一次。2.所有下标为奇数的数需要改成一样的;所有下标为偶数的数也需要改成一样的。3.所以,我们只需要统计所有下标为奇数的数里面频率最高的找出来,然后把其它数改成和它一样;下标为偶数的也同样处理。4.最后统计两者之和。5.统计一堆数里面频率最高的数,可以用哈希表实现。6.但是,相邻的数又不能相等,所以当找出来的奇数和偶数下标对应的频率出现最高的数是相等的情况,我们需要让 奇数下标 的数选择次大的数,或者让偶数..

2022-03-30 11:11:24 649

原创 数据结构-线性表(数组)-使用线性枚举求数组中最值 414. 第三大的数

线性枚举:通过线性枚举求第几大值就需要定义相同个变量,但是当找n/2个最大值时,时间复杂度会变为O(n^2),这时候需要别的方法代码块中注释的是很重要的技巧。class Solution {public: int thirdMax(vector<int>& nums) { int len = nums.size(); long max = -2147483649; long secondMax = -2147483649.

2022-03-29 09:56:17 1055

原创 《C++ primer》第九章

#include<iostream>#include<string>#include<list>#include<deque>#include<vector>#include<cctype>#include<iterator>#include<forward_list>using namespace std;void f902(){ list<deque<int>>

2022-03-28 17:36:47 465

原创 数据结构-线性表(数组)-线性枚举中最值算法 154.寻找旋转排序数组中的最小值Ⅱ

大部分跟153一样,而且深刻懂了为什么这样了:if(nums[mid] < nums[right]) right = mid;在这种情况下,最优值左边都>=nums[right],最优值右边都<=nums[right]。当nums[mid]==nums[right]时不能确定最优值在mid左半边还是右半边!当不确定最优值在mid左半边还是右半边的时候只需要收缩区间就可!!!因为mid是靠近left,所以收缩right!!!class Solution {public:

2022-03-28 10:00:27 1081

原创 数据结构-线性表(数组)-线性枚举中最值算法 153.寻找旋转排序数组中的最小值 -非常重要的题(二分法)

二分法的时间复杂度是O(logn)1. 法一:遍历全部数组找到最小值 O(n);2. 法二:对数组进行排序,最小值就是nums[0];3. 法二:二分查找法 :对于有序数组 类似单峰函数的数组class Solution {public: int findMin(vector<int>& nums) { int left = 0,right = nums.size()-1; while(left<right){//保证左闭右开区间里

2022-03-27 16:55:14 810

原创 数据结构-线性表(数组)-线性枚举中最值算法 485.最大连续1的个数

线性枚举,就是对数组进行操作,一般是对数组进行遍历,所以最坏时间复杂度为O(n)class Solution {public: int findMaxConsecutiveOnes(vector<int>& nums) { int len = nums.size(); int temp = 0,max = 0; for(int i = 0;i<len;++i){ if(nums[i] == 1){

2022-03-27 10:11:20 536

原创 数据结构-线性表(数组)-线性枚举中最值算法 1464.数组中两元素的最大乘积 && 628.三个数的最大乘积

数据结构:数组算法:线性枚举目标:求最大值原始算法思路就是求解数组nums中最大值和次大值class Solution {public: int maxProduct(vector<int>& nums) { int len = nums.size(); int max = (nums[0]-1)*(nums[1]-1); int temp; for(int i = 0;i < len;

2022-03-26 10:46:26 1101

原创 leetcode 1.两数之和

哈希为啥用hash?答:hash既是一种存储方法,也一种查找方法,最适合求解查找与给定值相等的记录,但不适合范围查找。思路:先把先生成hash表(数组元素为key,数组数组元素对应的下标索引为value),然后对于每一个数组元素,在hash表中查找key值为target-nums[i],返回即可。vector<int> twoSum(vector<int>& nums, int target) { int len = nums.size();

2022-03-25 11:43:00 249

原创 学习学习kmp算法

我们看,在查找最大匹配的过程中,将上面选择的待比较的子串分成两部分:最后一个端点为一部分,前面的一段为一部分;比如上面的第一个选取的最大比较子串的例子:前缀的p[0~k-1]分成两段为p[0~k-2]和p[k-1],和后缀的p[j-k+1~j-1]和p[j]分别比较,即p[0~k-2]和p[j-k+1~j-1]比较,p[k-1]和p[j]比较,见图中的红色线段和绿色圆点;通过这个例子我们知道,只要前面一段能重复且尽可能的长,那么加上最后一个端点这个重复子串也必将是最长的。我们继续分析,因为next[j]..

2022-03-23 16:35:28 239

原创 《C++ primer》第三章

头文件中不应包含using声明。String1.1. 定义和初始化(1) 默认初始化(2) String s2(s1)(3) String s3(“weipengya”)(4) String s3 = “sdsf”(5) String s4(n,’c’)1.2. string对象上的操作(1) getline()读取一整行,参数是一个输入流和一个string对象,函数从给定的输入流中读入内容,直到遇到换行符为止(换行符也被读入),然后把所读内容存入到string对象中(不存换行符)。

2022-03-22 16:46:10 1214

原创 数据结构 实现栈和队列

1.顺序存储结构#include<iostream>#include<string>#define MAX 1024using namespace std;typedef int DataType;class Stack{public: Stack(); DataType data[MAX]; int top; void show(); int push(DataType elem); int pop(DataType& elem);};

2022-03-22 11:07:43 1128

原创 《C++ primer》笔记和课后题第二章

第二章类型准换赋给无符号类型一个超出它表示范围时,结果是初始值对无符号类型表示数值总数取模后的余数。赋给带符号类型一个超出它表示范围时,结果是未定义的。1.1含有无符号类型的表达式一个算术表达式中既有无符号数又有带符号数是,带符号数就会转化成无符号数。负数转化为无符号数,结果等于这个负数加上无符号数的模。切勿混用带符号类型和无符号类型。变量2.1 列表初始化int a(0);int a{0};Int a = {0};复合类型3.1 引用引用必须初始化,不能定义引用的引用,引用只能绑

2022-03-21 14:52:27 630

原创 数据结构 单链表

跟着《大话数据结构》实现单链表。创建链表的时候借鉴了大佬的代码,可以说是直接复制粘贴,#include<iostream>#include<string>using namespace std;typedef int DataType;class Node{public: DataType data; Node* next;};class List{public: Node* head; int lenth = 0; List(); void s

2022-03-21 10:58:53 745

原创 118.杨辉三角

vector<vector<int>> generate(int numRows) { vector<vector<int>> ret(numRows); for (int i = 0; i < numRows; ++i) { ret[i].resize(i + 1); ret[i][0] = ret[i][i] = 1;

2022-03-16 09:32:42 33

原创 88.合并两个有序数组

自己没做出来 void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) { int left = 0; int right = m; int temp = 0; if(m+n==1) { if(n == 1) { prin

2022-03-13 16:52:51 27

原创 66.加一

自己的方法1.第一次提交错误,没有考虑到进位。2.考虑到进位之后,对于把数组转化成向量又出现了问题。首先分情况没有分对 应该判断进位与digits第一位之和是否为10。是则先添加1 0 然后再添加数组中0~len-2个元素,共2+len-1=len+1个数;否则与digits[i]处理方式相同,把数组元素添加到result就行class Solution {public: vector<int> plusOne(vector<int>& digits)

2022-03-12 14:20:33 34

原创 53.最大子数组和

法一:动态规划 可以解决求最大值问题,寻找最大子序列和。对于每一个nums[i]有两个选择(1.与前面子数组合并 2.不合并):判断nums[i]本身与以nums[i]与前面最大子序列之和(dq[i-1]+nums[i])的大小,取较大的数,放入dq[i]中。然后取数组dp中最大的数。dq数组存放的就是以i位置为尾的最大子序列之和。class Solution {public: int maxSubArray(vector<int>& nums) {

2022-03-11 21:27:02 1343

原创 35.搜索插入位置

自己写的:class Solution {public: int searchInsert(vector<int>& nums, int target) { int len = nums.size(); int j = 0; for(int i = 0;i<len;i++) { if(nums[i] != target) {

2022-03-10 11:51:16 25

原创 数据结构-线性表(数组)-原地算法 27.移除元素--左右指针细节处很重要

法一:双指针法(快慢指针):从头出发,在原位刷新一个新数组,慢指针代表新的数组的尾部,快指针遍历原数组。对不等于val的值,从原数组中添加到新数组的尾部。class Solution {public: int removeElement(vector<int>& nums, int val) { int len = nums.size(); int j = 0; for(int i = 0;i<len;i++)

2022-03-09 21:27:37 50

原创 《C++ pirmer》第三章答案

《C++ pirmer》第三章答案

2022-03-09 15:08:40 362

转载 CPULSPULS项目学习1

const那些事const作用定义常量类型检查const与#definde宏定义的区别:const常量具有类型,编译器可以进行安全检查;#define宏定义没有数据类型,只是简单的字符串替换,不能进行安全检查。[issue]https://github.com/Light-City/CPlusPlusThings/issues/5const只有在修饰枚举和整型变量时才能作为常量表达式防止修改,起保护作用,增加程序健壮性可以节省空间,避免不必要的内存分配const定义常量

2022-01-10 17:42:45 399

原创 蓝桥杯 python 杨辉三角

欢迎使用Markdown编辑器你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。新的改变我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:全新的界面设计 ,将会带来全新的写作体...

2020-02-04 14:22:24 580

空空如也

空空如也

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

TA关注的人

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