自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 双指针(快速排序)

【代码】双指针-快速排序。

2025-01-25 10:32:19 151

原创 算法15、双指针(归并排序两种做法)

而代码逻辑-分治思想与手写逻辑正好相反,它是自顶向下思考:把序列对半分成两个子序列,分别对两个子序列进行归并排序,再将两个有序子序列合并为有序序列-->上一题,所以可在归并排序函数里写一个辅助函数以合并两个有序序列。我们可以观察到,每个分组里的元素个数上限一定是2的次方,比如2 8 5 1 3, 第一次分组每组的元素个数是2,2,1个,第二次分组每组的元素个数是4,1个(一个元素也可以视作一个有序序列)只有一个变大另一个变小才行,因此剩余的解只会在[i+1, j-1]里产生,于是让 i = i+1;

2025-01-15 18:27:03 872

原创 算法14、基础二分查找的运用(快速幂)

同时可以注意到,1次方->2次方->4次方->8次方,从第一项a开始,每一项都是前一项的平方,因此可以通过a = a*a 来更新每一项;显然,a的b次方就可以写成是若干a^(2的i次方) 之积,如果b的二进制的i号位为1,那么该a^(2的i次方)就被选中,应该乘上该项。a的13次方 == a的8次方 * a的4次方 * (0*a的2次方) * a的1次方。当b是偶数,a的b次方 == a的b/2次方 * a的b/2次方;当b是奇数,a的b次方 == a * a的(b-1)次方;

2025-01-03 16:40:44 521

原创 算法13、基础二分查找的应用(木棒切割等)

而且,若没加上1时,当right = left + 1时,设此时left = x, 那么mid = (left + right) /2会等于left==x, 若此时num(mid) >= k那么left = mid == x, 进入下一个循环又是mid=left==x, mid,left就会一直相等num(mid)结果一直不变导致死循环。2️⃣求导得3x^2 + 2x + 1 = 2x^2 + x^2 + 2x + 1 = 2x^2 + (x+1)^2 > 0, 所以f(x)是单调递增函数;

2025-01-01 21:18:28 1060

原创 算法12、基础二分查找的运用(旋转数组专题)

假设旋转点在[mid, right]区间,则nums[mid]应该>=nums[right], 因为旋转点左侧的元素大于所有右侧的元素,与nums[mid] < nums[right]相悖。假设旋转点不在[mid+1, right]区间,则该区间应该严格递增,即nums[mid]应该小于nums[right]。由严格递增序列形成的旋转数组,它的最小点就是旋转点,以旋转点为界,它的左半部和右半部(把旋转点归到右半部)都严格递增,且左半部的元素都比右半部大。当left == right ,找到解了,结束循环。

2024-12-18 13:38:25 884

原创 基础二分查找总结题-单峰序列2类做法

最终解为left -1 or right -1;

2024-12-14 22:54:43 792

原创 算法11、基础二分查找(寻找满足条件的元素专题)

但如果想要返回第一个大于等于元素x的位置,就不需要判断元素本身是否存在,因为即使它不存在,返回的也是“假设它存在,它应该在的位置”,也就是说我们让这个元素始终“存在”,所以当left == right时,说明区间[left,right]是这个元素存在的唯一位置,因此只需要让left < right都进入循环即可。在非递减序列里,设第一个大于等于x的元素下标是L, 或者大于x的元素下标是R,那么元素x的位置在序列中的存在区间就是左闭右开区间 [ L, R)。如果序列中没有1,那么输出−1。

2024-12-12 21:03:10 854

原创 贪心思想深入理解与总结(拼接最小数)

迄今做过的贪心题目,核心都是按贪心策略对元素进行排序。简单的题,按照常识就能想到策略,比如优先装重量最小的箱子以装上最多的箱子,难一些的,拼接最小数,需要先思考局部最优解作为排序依据),再利用sort函数将局部策略扩展到全局。

2024-12-09 13:26:31 237

原创 算法10、区间贪心(区间调度/区间覆盖)

从第二个闭区间开始遍历,若上一个点不在当前闭区间,即当前闭区间的左端点大于上一个点,则点数++,更新点为当前区间的右端点;所以转换为区间调度-区间不相交问题,只是上两题是开区间,而按照这道题目的描述,箭头如果碰到气球的边界气球也会爆炸,所以相当于求最多的不相交闭区间个数。这样情况下的两区间没有交集意味着:ri

2024-12-07 18:51:24 656

原创 算法9、简单贪心

因此把两个集合S,T从小到大排序,以S的元素s[i]为基准(即外层循环),找到T中第一个大于等于s[i]的数t[j]后,i, j后移一位, 再从后移过的j开始再次(内层循环)寻找第一个大于等于s[i]的数.那么我们就反向遍历n数组;同时用char数组存储整数,最终以%s的形式输出,别忘了最后要加\0以示字符串的结束(或者直接初始化char数组全为\0)

2024-12-04 20:26:34 303

原创 算法3、回溯全专题(构造子集/全排列/组合/背包)

以下temp是全局变量构造子集考虑的是当前元素即origin[idx],加入(三步:push_back, DFS(idx+1), pop_back() )与不加入(直接DFS(idx + 1));而排列利用的是 for(origin.begin() --> origin.end(). ) {(若origin[i]不在当前temp里) :加入当前temp, 标记为在,递归DFS(idx+1);移除当前元素, 标记为不在,递归DFS(idx+1);

2024-12-01 20:09:34 1060

原创 算法8、动态规划-背包

放入当前元素,反向等于对前i-1个元素,背包容量为v-nums[i-1],能否装满,即dp[i][v] = dp[i-1][v-nums[i-1]],且要满足v-nums[i-1] >= 0,否则只能不放入背包里了即dp[i][v] = dp[i-1][v]。若放物品i-1,反向说明前i-1个物品被选的容量不能超过v-w[i-1](要>=0否则只能不放该物品了->说明放入物品i-1就超重了), 则dp[i][v] = c[i-1] + dp[i-1][v - w[i]];无论容量是否允许都可以不放;

2024-11-28 19:18:40 1089

原创 算法7、二维动态规划-最长公共子序列LCS

ij。

2024-11-26 18:12:41 748

原创 算法6、一维动态规划-单序列问题(最大连续和/最长子序列)

在前一题的基础上,再根据maxSub遍历dp,就能找到所有满足最大和maxSub的子序列结尾元素索引j, 还需要知道这些子序列的首元素i,那么额外增加一个数组start[j]记录以j索引元素为结尾的最大连续子序列的首元素索引, 也利用分治,那么start[j]的值,当a[j]+dp[j-1] < a[j],首元素是该元素本身,否则,首元素就是以前一个元素为结尾的最大连续子序列的首元素,初始化start[1] = a[1].比如-2, 11, -4, 13,-5的序列,要求以13结尾的最大连续子序列和,

2024-11-24 21:29:00 763

原创 算法5、动态规划入门-递归与递推写法

但到达该递归层后可选的元素与上一层选择的元素的列x有关,只能选x,x+1列, 所以,应把当前选择的元素的列传递下去,且当前层用for遍历可选元素,的列索引范围应为col->col+1。递归表达式为f(n) = f(n-1) + f(n-2),即要踏上第n级台阶时,有两个办法:从第n-1级一步上去,从第n-2级两步上去,初始化:dp[0] = 1, dp[1] = 1, ( dp[2] = dp[0] + dp[1])。状态转移方程是:dp[n] = dp[n-1] + dp[n-2],

2024-11-21 10:33:20 725

原创 算法4、分治思想进阶-二维分治

设定表示原点的坐标一般来说不可少(而且应该将表示原点坐标的x,y与规模参数一起作为递归函数的参数),因为子问题分布在同一平面的不同地方,需要初始原点+偏移才能指示到位于不同地方的子问题(初始原点+偏移就是该子问题的原点了);所以二维的分治要分别处理这四个子问题,对于该题四个子问题即四个小棋盘,❗️❗️把一个小棋盘(一个子问题)递归解决了,再去处理另一个小棋盘(另一个子问题)-----> 对于子问题1左上小棋盘,有两种可能:one特殊方格在左上小棋盘,那么能到得一个拐角坐标,并将左上小棋盘作为母问题递归;

2024-11-16 17:34:21 802

原创 数据结构1、链表专题(环/反转/合并/分割)

最后再把left结点的前一个结点.next指向返回的头结点, 所以需要记录第left-1个结点,也因此当left是头结点即left==1时要记录它的前一个结点,就需要有sentinel结点了 , 最后返回sentinel.next。将第left个结点作为头节点组成子链表,反转它的前right-left+1个结点,所以我们可以写一个辅助方法reverseN即反转链表的前n个结点method并返回反转后的头结点,需要注意的是:删除结点必须要有sentinel结点,因为有可能要删除的是头节点!

2024-11-08 13:14:43 1069

原创 算法3、回溯全专题(构造子集/全排列/组合/背包)

本来以为子集不允许出现重复元素,那就多一步:在origin输入元素的时候用哈希去重,再对origin升序。构造子集考虑的是当前元素即origin[idx],加入(三步:push_back, DFS(idx+1), pop_back() )与不加入(直接DFS(idx + 1));给定一个长度为𝑛的序列,其中有𝑛个可能重复的正整数,求该序列的所有子集。给定一个长度为𝑛的序列,其中有𝑛个可能重复的正整数,求该序列的所有全排列。给定一个长度为𝑛的序列,其中有𝑛个互不相同的正整数,求该序列的所有子集。

2024-10-05 16:51:42 875 1

原创 算法2. 分治入门(采用递归实现)

i < n;j++) {

2024-05-28 10:05:10 706

原创 算法1、字符串处理+排名+散列

1 4 4 4 5,设置sameRankCount = 1(用于输出),与后一名(i+1)比较分数若相同则sameRankCount++,直到找到后一名是不同的分数,然后一次性连续输出sameRankCount行结果,再重置为1.哈希表的下标(索引)是每个元素映射后的值,因此它的长度由元素大小决定,一般来说(根据映射规则),元素越大对应的索引也越大,因此,由哈希表从小到大输出的索引(其对应元素)是严格递增的, 这可以运用在两个集合求并集并升序输出。其余再输出空格,最后一个不再输出空格;

2024-05-16 13:18:19 873 1

空空如也

空空如也

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

TA关注的人

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