- 博客(23)
- 收藏
- 关注
原创 算法打卡二十一
我:表示出数组长度n,接着表示初数组位置i,和表示从左往右的括号数right(右括号),left(左括号),接着就用for循环开始遍历数组操作。接着判断,当right==left时,则,得到一个原组,去掉此次最开始的左括号,和当rightt==left时的右括号,即令其=‘ ’ 空即可,所以要在循环开始时要先令[i-1]=' ' 空。这个顺序是不能改变的,当leve=0时(一样),即得一原组,将‘(’判断放最后,即可去掉首字符;将‘)’放开始,即可在当level=0时,将一个原组的为字符给去掉。
2024-09-19 21:44:20 204
原创 C++中Stack(栈)的学习
栈是一种线性数据结构,遵循“先进后出”的原则,即最后一个添加到栈的元素将第一个被移除(像手枪的弹夹一样,最后一个放进来的子弹将第一个被发射出去)。向栈顶添加元素 emplace( );向栈顶添加元素 push( );(直接传入已构造好的对象)·添加在栈顶 push_top( );判断栈堆是否为空 empty( );从栈顶删除元素 pop( );访问栈底元素 back( );返回栈的大小 size( );访问栈顶元素 top( );·添加在栈底 push_back( );
2024-09-19 20:48:03 143
原创 算法打卡二十
法一(正向遍历):表示出整个数组的长度n,设出初数组位置i,用sum来表示每个单词的长度,用num来表示每个单词的起始长度,接着逐步增大,直至遇到空格,又归为0.然后,for循环为主体,来遍历整个数组。循环中,首先if判断该数组元素是否为空格,若是,则立刻跳出此次循环(continue),因为一遇到空格,则说明即将遇到下一个新单词,单词长度要重新计算,所以在跳出此次循环之前,需将num=0归零处理;若否,则单词长度加一(num+1)。依次循环遍历完数组,完成题目要求,最终返回sum的值即可。
2024-09-17 16:59:32 115
原创 算法打卡十九
接着,if判断原数组若后一个(i)元素大于前一个(i-1)元素,则新数组的后一元素比前一元素多得一个糖果(left[i]=left[i-1]+1);如上述左规则般,右规则的初糖果数为1,接着if判断若原数组前一个元素(i)大于后一个元素(i-1),则前一糖果数比后一糖果数多一个,否则right=1。然后,依据左规则和右规则找出每个元素所得的最大糖果数(因为,要符合两边规则,选较大的才行),最后求和,即得最小糖果数。但并不对,若是[1,3,2,2,1]这类似的数组就不行了,就不是最少的了。
2024-08-26 11:14:21 112
原创 算法打卡十八
设出两个数组初位置i=0,j=0,一个i用来定位初位置并返回,一个j用来判断操作,再来给sum=0来作为次数。用while循环,用(i>n)来限制,接着又一个while循环开始判断,用(sum<n)来限制,因为当次数等于数组长度,说明它回到了原来的位置。在循环中分别算出每次的加油量和耗油量,如果加油量大于耗油量,则可以到达下一个加油站,次数加一;若小于,则不能到达下一个加油站,即跳出该循环,寻找下一个起点。然后判断,若次数等于数组长度,则说明它完成了一圈,可返回起点;
2024-08-23 19:06:53 212
原创 算法打卡十七
因为新函数的无元素,所以先赋值给ans[0]=1,再继续操作。先算左边数的乘积,用for循环从[i=1]位置开始遍历数组,依次求积并赋值给ans[i];接着再算右边数的积,因为一开始右边无元素,则先赋值右边j=1,就可用for循环从[i=n-1]的位置开始遍历数组,依次求积并再次赋值给ans[i]。我:一开始用一对正逆指针,正指针指向要除外的元素,逆指针用来做乘积。双重for循环,正外逆内,接着用if判断,只要正逆指针位置不等,就可以累积。完成一次逆循环,则将乘积赋值给ans数组。最后返回ans函数即可。
2024-08-14 23:09:11 176 1
原创 算法打卡十六
第一次,先是从正向,for循环,我想到只要找到从第一个位置数(i+1)小于等于所在位置上的元素nums[i],找到符合条件的最大位置数返回即可。新:认识H指数,它是一个混合量化指标,一种评价学术成就的新方法。如一个科学家的H指标,就是指在他的n篇文章中有h篇文章至少被引用了h次,剩余n-h篇文章被引用的次数均小于等于h次,h即最大值,指每篇论文至少被引用了h次的h篇文章。法一(排序):表示出数组长度n,将数组从小到大排序,从数组末(i=n-1)开始循环,要找到符合题意的最大值h,初始值设为零。
2024-08-13 23:04:47 135
原创 算法打卡十五
因为这次的跳跃要精准的跳到数组末,就要找到每次所在位置可达到的下一个最远距离x,可以用if来判断,步数x要大于位置数i才可继续,接着就要更新最远距离x,并if判断跳跃后到的最远距离是否与位置数重合,重合就更新次数,直到循环结束,返回次数即可。是找最小跳跃次数,先打好地基,数组长度,for循环开始。加上题目上提示,定好初指针,下一个位置步数的最大值为目前所在位置上元素的值,就这样遍历循环,每加一次,就加一次次数,直到找到位置与数组末重合,返回其最小次数即可。看了看,才发现,原来超过数组长度也是到了数组末呀。
2024-08-12 21:49:36 172
原创 算法打卡十四
设出三个指针的初值i,j,k分别为0,1,2;确定好第一个指针i,就来确定j,用if判断,若j位上值减i位上值小于目标值,则j向左移;看到指针k,用if判断,若k位上值减j位上值小于目标值,则k向左移;最后,返回其数目即可。确定好第一个元素,即可确定第二个元素,因为目标值就是第二个元素减第一个元素得,由此找到第二个元素,接着第三个循环就用if判断第三个元素减第二个元素(已定)是否等于目标值就可找到。法一(暴力枚举):用三重循环暴力枚举数组中每个三组元素,if判断它们是否为算术三元组,返回其数目即可。
2024-08-09 22:06:50 128
原创 算法打卡十三
设出第一个元素位置i于数组首,在第一个for循环开始遍历,为不出现重复的值,用if判断前一个元素和后一个元素不相等才可进行该循环内操作,确定第二个元素位置j=i+1,第三个元素位置k=n-1位于数组尾;若相等,则跳到下一循环。要求输出的是接近值(即三元素之和),我试着直接返回和,不可;返回目标值减去差(得和),但像遇到三个零的情况就显然不行了,(到这,我看题解才发现,重复的值应该略去才好)。看了题解,可以加一个函数来确定三数之和的值,加上后就可以返回和值了,对了耶,就是耗时太长(但没超时耶)。
2024-08-09 00:55:13 111
原创 算法打卡十二
设出第一个位置于数组初i,为了不让数重复,用if来判断若前一个和后一个数相等就跳过第一循环的操作,若不等,即确定了第一个数,接着设出一个目标值target等于已确定的第一个数的相反数,来套住后两个数,设第三个数为数组末k=n-1。接着,就是两数之和的做法,第二个for循环,确定除第一个已确定数之外的第二个数j=i+1,又如上述操作确定第二个数;看了题解找返回方法,就是创建一个新的数组来返回(新),结果是错的,也不全错,就错第一个例子的结果,这个例子中有重复的数,所以输出来后就有重复的数组,怎么解决?
2024-08-07 21:46:20 221
原创 算法打卡十一
我:开始,我想了一会该怎么解决这个题目,看了看例子,嗯,可以先找最大值,再找第二个小的值,返回它们的位置,按题相乘就好。对,我就开始用for循环遍历数组元素,让每两个元素(不带重复的)之间按题目要求的那样求积,找到最大的那个积即可。还真让我做对了,结果是没问题的,就是超时了,这个方法就像我上一题用的暴力枚举那样,确实耗时。用if判断,若x位置上的值大于y上的,则x不动,y向右移(因为容纳的水量是由较短的一边决定的,改变短边去配长边,才可以找到更合适的最大容水量);将遍历得的积作比较,找出最大值即可。
2024-08-04 21:11:47 123
原创 算法打卡十
法一(暴力枚举):将数组中的数两两相加且不重复的遍历一遍,即用两个嵌套的for循环,来遍历数组中的每个元素来相加,为使这两个相加的元素不重复,设一个为x=0,另一个为y=x+1,就可以开始循环了,用if判断,直到找到目标和,返回符合要求的数组元素位置即可。为了避免两数重复,可以从数组的右边来开始找第二个数,最后再返回这两个数的位置值即可。我:开始时我还在想怎么表示数组元素位置,就将位置数转入主函数来表示,在返回前两个数即可,但系统提示编译错误,看了题解才想起还有(return {x,y})这种返回格式。
2024-08-02 22:50:14 157
原创 Git 基础学习
使用 git commit 命令也可以,它会跳到一个编辑界面(vim),按i键可进入编辑状态,在第一排命 名好后,按ESC建退回命令模式,输入“:wq”退出编辑,即可。(慎用,若误操作使用,可用 git reflog 命令来查看历史操作记录,找到误操作之前的版本号,再使用 git reset 命令来回退到这个版本即可)·使用 git branch -D 命令强制删除未合并的分支。使用 git branch -d 命令删除该分支(该分支已合并)。
2024-08-02 18:39:31 392
原创 算法打卡9
法一(双指针):初始化两个指针i、j,分别指向s(子)、t(母)序列初始位置,设t序列的长度为n。用while循环来写,每次贪心地匹配,匹配成功,则i、j同时右移,若匹配不成功,则s序列不动(即i不动),t序列不动(即j右移一个单位)。若s序列能移到末尾,则说明s是t的子序列。【return i==n】我:我一开始是用两个for循环,长数列在外,短序列在内,依次判断两序列的元素是否相等,若相等则跳出来。等待循环完毕,判断若短序列中有元素等于零(即空集)则说明该序列不是长序列的子序列。
2024-07-15 21:23:13 83
原创 算法打卡8
我:除开大写变小写没写,我后面是用for循环来做。设出两个初始位置为0的数组函数,再设一初始值为0的新数,一数组等于其正序,一数组等于其逆序,接着再比较,若两数组完全相等,则输出true,若不等,则输出false。看来题解,思考一下,我发现,循环和判断应该一起操作,而我的是循环完了才来判断,就不知要判断的是哪个元素了。法一(双指针/筛选+判断):先将数组中的字母都转化成小写,用for循环遍历来实现。接着表示出正逆数组,用while循环来判断正逆数组中的元素字母是否完全相等,若不相等,则返回false;
2024-06-29 21:49:30 159
原创 算法打卡7
法二(一次遍历):设出一个最低价格,且其范围为1e9(即等于它,足够大即可),还要设出最大利润,给予其初始值为0,表示出数组长度。看了题解,就发现并没有我想象的那么麻烦,只要另利润等于后一个减前一个,再找出最大的利润即可。看了题解,发现我又想复杂了,原来题目所表意思即交易次数是无限的,所以所有日间差的值都是利润,它们之和即最大利润。法一(双指针):设出两个指针,一个快指针,一个慢指针。利润只能快指针减慢指针(即后一个减前一个),用for循环遍历所得利润,判断利润大小,找出最大利润,输出即可。
2024-06-26 22:08:40 185
原创 算法打卡6
法一(环形替代):先算出某一位置的元素更替一轮要循环几次(即轮回数和元素个数的最大公约数)。接着根据次数,用两个内包循环来完成目的。一个循环用于该元素的次数循环,先对元素赋值处理(因为若直接赋值,则原来的数值会被覆盖,所以再令一变量等于原来的元素,接着再赋值);另一循环用于该元素一轮的循环(交换,赋值),直至循环结束,轮回下一个元素。法二(另设一新数组):先用for循环遍历数组,将原来的元素位置i变为i加1,得新数组。再将新数组复制到原数组即可。
2024-06-23 19:11:07 98
原创 算法打卡5
法三(Boyer-Moore投票算法):先设出两个数,即候选众数candidate(初始值可为任意数)和它出现的次数count(初始为0)。然后用for循环遍历数组,先给candidate赋值(即数组的第一个数)再判断数组中的数是否等于它,若等于,则次数count加一;法一(直接排序):先用sort函数排好序,这样,我们想要的数就会靠近中间重叠。所以再返回中间(即n/2)的数即可。法二(哈希映射):用for循环将数组遍历到哈希映射中,再遍历哈希映射中所有的键对值,返回最大的值。
2024-06-22 17:45:33 230
原创 算法打卡4
b.先设出两个初位置均为2位的指针(x,y),然后就开始用while循环来操作。while循环中,用if来判断,若一指针的第0(x-2)位不等于二指针(y),则这两个指针所表示的数相等,依次循环判断。法一(双指针):a.判断出只有两项的数组情况,将它表示出来,再看其他情况。
2024-05-30 22:08:19 100
原创 算法打卡3
法一(双指针):先判断出只有零的情况,再看其他情况。先设出两个在同一位置(即该数组的1位)的指针,一指针用来作比较判断,从数组的1位和0位比较起(即后一位比前一位),依次比较判断;二指针用作新数组来输出,即若一指针中比较不相等,则二指针等于一指针中所比较的后一位。
2024-05-28 22:06:55 94
原创 算法打卡2
法一(双指针优化):设出从首、尾各一个指针,然后用“while循环”从数组首开始判断要删除的数(val),若等于val,则将其置尾,即其与尾互换,依次判断。法二(双指针):设出从首尾各一个指针,然后用“for循环”从数组首开始判断要删除的数(val),若不等于val,则将其置前,依次判断。
2024-05-25 22:04:39 104
原创 算法打卡1
法二(双指针正/逆排序):给两数组分别设置两指针作列队的头(/尾)部指针,再设置一总数组(及两数组位数之和)和一新数组。然后用for循环将两数组排序合并(从两数组0位(/末位)开始比较,小的在前,大的在后)值为新数组,最后将新数组等效到原数组中。法一(函数直接排序):先用for循环将两个序列合并,再用sort函数直接排序输出。新学到:sort函数(给定区间元素排序,c++)
2024-05-20 22:44:08 143
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人