![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法
qq_44709743
这个作者很懒,什么都没留下…
展开
-
快速排序
1.数组中的元素为0或1时返回2.选取枢纽元素pivot3.将数组S分成两个不相交的集合。切分:大于pivot的元素在左边,小于pivot的元素在右边。4.对[lo, pivot - 1] 区间内的数组排序,排序pivot,排序[pivot + 1,hi]数组。收益:类似归并排序,只不过快速排序是先切分,再递归;而归并排序则是向递归,在合并。inline static voidswap...原创 2020-05-05 17:35:42 · 193 阅读 · 0 评论 -
LeetCode1391 :检查网络中是否存在有效路径
分析:路径选择,一定是在上下左右中选择一条,如果存在路径的话,对每一条可行的路径进行测试;如果都不可选择的话,则不存在路径。我们先确定当前位置,查看当前位置上该往哪走,然后再往相应的方向上行进,进入下一个。因为在每个位置上,其下一步是固定不变的,我们只需在上下左右中寻找到符合其行走条件的路径即可(如果存在的话)。bool helper(int** grid, int gridSize, int...原创 2020-05-03 00:22:57 · 242 阅读 · 0 评论 -
LeetCode1319:连通网络的操作次数
分析:线的数量就是connections的值,而连接n台计算机至少需要 n - 1条线。判断是否重复连线,只需判断两台计算机是否已经在同一个网络中。如果已经相连,则把线取下。1.遍历整个connections2.计算有多少个集合,以及有多少剩余的线3.集合数量-1即为最少操作次数,与剩余的线的数量进行比较即可int makeConnected(){ 初始化并查集 for (遍历...原创 2020-05-02 17:55:08 · 118 阅读 · 0 评论 -
LeetCode LCP 01 | 传递信息
问题描述小朋友 A 在和 ta 的小伙伴们玩传信息游戏,游戏规则如下:有 n 名玩家,所有玩家编号分别为 0 ~ n-1,其中小朋友 A 的编号为 0每个玩家都有固定的若干个可传信息的其他玩家(也可能没有)。传信息的关系是单向的(比如 A 可以向 B 传信息,但 B 不能向 A 传信息)。每轮信息必须需要传递给另一个人,且信息可重复经过同一个人给定总玩家数 n,以及按 [玩家编号,对应可...原创 2020-04-19 18:15:57 · 250 阅读 · 0 评论 -
LeetCode.74 | 搜索二维矩阵
问题:在有序的二维数组中寻找目标值类型:数组搜索问题分析:有序数组查值,最快的是二分搜索。1.可以使用二分搜索寻值,但是数组为二维数组,找中间值mid的索引不方便。解决方案就是,先算出mid,将其转换为对应的二维索引,可得matrix[mid/col][mid%col],该位置上的值即为中间值。时间复杂度:O(log(mn)),m行数,n为列数空间复杂度:O(1)2.第二种二分查找则...原创 2020-04-18 16:49:19 · 135 阅读 · 0 评论 -
LeetCode:1011 | 在D天内送达包裹的能力
没啥好说的,船的载重量一定在max(weights)到sum(weights)之间,且是有序的,二分查找直接上。只不过要注意的是,目标值应该为天数,所以在选定一个mid后,下一步要计算在mid时所需耗费的天数。然后与天数进行比较。技巧:计算天数,不仅可以加,也可以减,放满一只船后,天数要减一。把货物放进船里,不仅可以加,也可以减,即放进一个货物后,船的载重量减少。操作步骤:在weights...原创 2020-04-17 16:33:11 · 159 阅读 · 0 评论 -
合并K个链表
思路:借鉴《算法4》上的自底向上的归并排序1.从1开始,两两合并,然后四四合并,八八合并,直到链表数量为一时间复杂度:O(Nlogk)空间复杂度:O(1)#define less(X,Y) ((X)<(Y)?(X):(Y))void merge(struct ListNode** lists,int start,int mid,int end){ //判断最后是否只剩一个链表,...原创 2020-04-17 16:09:05 · 90 阅读 · 0 评论 -
LeetCode21:合并2个有序链表
链表已经有序,可使用双指针l1和l2,分别指向第一个和第二个链表。再设置一个指向新链表头节点的指针,以及维护一个指向新链表最后一个节点的指针。使用双指针遍历遍历两个链表,比较后将节点添加到新链表的末尾。反思:知道要使用双指针,但是并未想到设置哨兵和尾指针(指向新链表)。一开始的思路是将第二个链表的节一 个一个插入到第一个链表中。所以插入有三种情况:(1)在表头(2)在中间(3)在表尾。麻烦且容...原创 2020-04-11 20:20:45 · 77 阅读 · 0 评论 -
leetcode2:两数相加
分析:求两个链表相加的和,运算从低到高,即从头节点开始向后运算。所需考虑的是当前两个链表是否已经遍历完成,以及当前是否需要进位。步骤:1.设置两个指针分别指向l1和l2的头节点2.开一个新链表,维护一个指向新链表的尾指针3.插入节点:a.从l1和l2中选出两个节点-b.算出当前节点的值-c.判断是否需要进位(当前节点是否大于10)-d.建立节点,连接到新链表中/** ...原创 2020-04-11 17:35:07 · 79 阅读 · 0 评论 -
自底向上的归并排序
参考0参考1方法:自底向上的归并排序算法的思想就是数组中先一个一个归并成两两有序的序列,两两有序的序列归并成四个四个有序的序列,然后四个四个有序的序列归并八个八个有序的序列,以此类推,直到,归并的长度大于整个数组的长度,此时整个数组有序。需要注意的是数组按照归并长度划分,最后一个子数组可能不满足长度要求,这个情况需要特殊处理。自顶下下的归并排序算法一般用递归来实现,而自底向上可以用循环来实现...原创 2020-04-09 19:50:21 · 1062 阅读 · 0 评论 -
LeetCode18:四数之和
int less(int a,int b){ return (a<=b)?a:b;}void Merge(int* nums,int start,int mid,int end){ if(end<=mid) return ; int fir,sec,count; fir=start,sec=mid+1,count=0;...原创 2020-04-09 19:31:57 · 77 阅读 · 0 评论 -
LeetCode##70:爬楼梯
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?注意:给定 n 是一个正整数。示例 1:输入: 2输出: 2解释: 有两种方法可以爬到楼顶。1 阶 + 1 阶2 阶示例 2:输入: 3输出: 3解释: 有三种方法可以爬到楼顶。1 阶 + 1 阶 + 1 阶1 阶 + 2 阶2 阶 + 1 阶...原创 2020-03-26 14:43:36 · 63 阅读 · 0 评论 -
LeetCode#1;
题目要求:给定一个数,在数组中寻找两个数的和等于目标数。分析:(1)暴力枚举:从第一个元素开始,对每一个数进行测试,然后再寻找后面的元素中是否有能满足条件的。时间:O(N^2);空间:O(1);(2)HashMap:在暴力枚举中我们在发现确定一个元素后,我们在该元素之后的遍历实际上就是一个****查找的过程,而能查找效率最快的莫过于哈希表,平均时间只需要O(1).而我们想要找的元素=目标数...原创 2020-03-22 18:27:15 · 73 阅读 · 0 评论 -
LeetCode-905:按奇偶排序数组
LeetCode905: 给定一个非负整数数组 A,返回一个数组,在该数组中, A 的所有偶数元素之后跟着所有奇数元素。你可以返回满足此条件的任何数组作为答案。示例:输入:[3,1,2,4]输出:[2,4,3,1]输出 [4,2,3,1],[2,4,1,3] 和 [4,2,1,3] 也会被接受。问题分类:数组问题;前后排序归类;问题分析:数组问题一般都需要用到双指针(快慢指针,首尾指...原创 2020-03-22 09:58:18 · 130 阅读 · 0 评论 -
二分查找
二分查找查找元素e是否存在序列中循环不变式为A[0,lo]<=e<=A[hi,n)当lo=0,hi=n时,则有A[lo]<=e<=A[hi]若e存在于序列中当lo=hi时,则有A[lo]=A[hi]=e;若此时A[lo]=A[hi]!=e,则说明元素e不存在于序列中。代码如下:Int BinaSearch(int *A,int lo,int hi,...原创 2019-09-16 11:09:33 · 142 阅读 · 0 评论