编程算法
C语言算法
柳瘦
大自然的搬运工
展开
-
一颗算法树
算法原创 2022-06-02 11:48:46 · 148 阅读 · 0 评论 -
C算法-二维矩阵的和,HASH+二维前缀和
计算矩阵的和----- 等于目标值1、先求前缀和2、然后缩减到固定的两行;(此时有点像个一维数组,求target)3、右边界慢慢挪动;并且把每次右边界之前的所有数加入hash map;4、只需要检查右边界的值,减去target,是否在map中class Solution {public: int numSubmatrixSumTarget(vector<vector<int>>& matrix, int target) { int row原创 2021-05-30 12:33:34 · 169 阅读 · 0 评论 -
C算法-数值在要求范围内之桶
Leetcode220,给你一个整数数组 nums 和两个整数 k 和 t 。请你判断是否存在 两个不同下标 i 和 j,使得 abs(nums[i] - nums[j]) <= t ,同时又满足 abs(i - j) <= k 。如果存在则返回 true,不存在返回 false。桶和滑动的思想;如果在K的范围内滑动的桶,按照nums[i]/(t+1)建立分类;然后如果当前移动位置已经大于K,那么要把滑窗头给擦除1、对新增的数据,如果桶里面有东西,那么一定是TRUE2、如果上个桶有东原创 2021-04-24 22:07:18 · 70 阅读 · 0 评论 -
C算法-字符串匹配之sunday算法
Leetcode28,实现strstrsunday算法1、建立next数组,代表每个字母,在pattern数组中最后一次出现的下标位置2、起始位置i,进行匹配是否满足要求;满足就返回起始位置i;不满足需要移动起始位置3、i的下个位置跳跃为:i += pattern - next[haystack[pattern+i]];处理过程中,请注意保证每个下标都是有效的举例1举例2class Solution {public: int strStr(string haystack, st原创 2021-04-24 11:44:46 · 176 阅读 · 0 评论 -
C算法-接雨水之双指针和单调栈
leetcode42题,接雨水。刷题刷久了,发现这个东西费智商啊,脑子里没有想清楚怎么计算。双指针思路如下:1、凹凸的面积计算,一列一列计算积水;需要关注左边最大值和右边最大值;如果当前左边更小,那么只需要移动左边的指针。class Solution {public: int trap(vector<int>& height) { int left, leftMax, right, rightMax, ret; left = 0;原创 2021-04-24 09:31:03 · 204 阅读 · 0 评论 -
C算法-链表升级版
之前写过一篇简单的链表,现在更新些常用的手段。1、快慢指针找中点,那么slow是间点struct ListNode*fast, *slow;fast = slow = head;while(fast != NULL && fast.next != NULL) { slow= slow.next; fast = fast.next.next;}2、链表反转,需要一个指针NULL作为尾巴,每遍历一个节点,就把这个节点作为下一个的新尾巴; struct Li原创 2020-11-03 20:35:39 · 82 阅读 · 0 评论 -
C算法-位运算
leetcode136题,只出现一次的数字。leetcode338题,比特位计数。1、异或操作^a、相同取0,相异取1b、一个数异或自己,等于0c、一个数异或0,等于自己d、一个数异或1,等于把个位取反,翻转2、右移操作 >>a、一个数右移1位,相当于除以23、与操作&a、一个数与1,相当于判断末位是否是1,也就是可以判断奇偶。leetcode答案:i...原创 2020-02-09 10:20:32 · 138 阅读 · 0 评论 -
C算法-位运算升级版
leetcode751题,IP 到 CIDR。题目意思就是取IP后联系N个地址,但是表达方法要用CIDR。我真的想不出来真的想不出来真的想不出来,作者太牛了,戳这里看作者题解整个神奇的地方有:1、sscanf可以转字符串为整数,作为初始地址。2、对整数取二进制下最后一个1的位置,这个位置如果比n小,那么可以生成一串地址。获取二进制下最后一个1的位置方法是x&-x3、通过sprin...原创 2020-03-14 21:30:26 · 150 阅读 · 0 评论 -
C算法-UT哈希是双向链表?
leetcode面试题 16.25. LRU缓存。之前写过一篇根本不算HASH的HASH,也总结过UT_hash_handle现在结合双向链表把这个题目理一理。思路如下:typedef struct Info_ { int id; int value; struct Info_ *pre; struct Info_ *next; UT_hash_handle hh;} Info;typedef struct { int MaxNum; Info *user; /*hash自带的u原创 2020-11-20 14:30:04 · 282 阅读 · 0 评论 -
C算法-UT哈希
一、键值是INT型1、定义结构体,对应键值是整形int,需要有个全局指针比如userstypedef struct { int id; /* key */ char name[10]; int cnt; UT_hash_handle hh; /* makes this structure hashable */}my_struct;my_struct *users = NULL; /* important! initialize原创 2020-06-03 14:41:15 · 1118 阅读 · 0 评论 -
C算法-UT哈希+并查集
leetcode面试题 17.07. 婴儿名字。之前写过一篇根本不算HASH的HASH,现在借鉴了各位大神的UT哈希方法,把这个题目理一理。思路如下:1、通过info存取names的关键信息,本质就是比names多了cnt及root信息,用处是记录最终的cnt信息,以及给团队赋值为最小字典序(char *root)2、通过hash存取names的关键信息,用处是支撑synonyms元素的快速查找对应索引位置HASH_FIND,将两个索引进行并查集处理小知识点一:对字符串分割names = [“Jo原创 2020-06-02 16:17:52 · 380 阅读 · 0 评论 -
C算法-贪心/回溯/剪枝-垃圾代码
leetcode1055题,形成字符串的最短路径。作者有空来写吧,写了些啥???void dfs(char * source, int slen, char * target, int tlen, int start, int count, int *ret){ if (start == tlen) { if (*ret == -1) { *ret = count; } else { *ret = *ret < count ? *ret : count; } r原创 2020-05-16 08:56:25 · 117 阅读 · 0 评论 -
C算法-贪心/回溯/剪枝/记忆
leetcode139题,单词拆分。按照之前的讲解C算法-贪心/回溯/剪枝 进行处理,会有个超时的部分。评论区大神加了个记忆,瞬间满分。思路如下1、快排对数据进行整理(贪心),调用一个函数dfs()2、dfs的结构:for循环, dfs()递归,此步骤注意是否涉及剪枝3、dfs的参数要求:包含有目标条件的参数,包含start参数,如果有需要传递给下一次循环传递还需要个col/count参数,...原创 2020-03-25 22:56:53 · 226 阅读 · 0 评论 -
C算法-贪心+排序+双指针
leetcode435,无重叠区间。给定一个区间的集合,找到需要移除区间的最小数量,使剩余区间互不重叠。 [ [1,2], [2,3], [3,4], [1,3] ]移除1,3即可。leetcode452,用最少数量的箭引爆气球。[[10,16], [2,8], [1,6], [7,12]],分别代表每个气球的左右距离,需要一个弓箭戳破。我们在x=6和x=11上就可以戳破[2,8],[1,6]和...原创 2020-03-24 18:25:12 · 209 阅读 · 0 评论 -
C算法-动态规划
leetcode面试题17.16.按摩师。一个有名的按摩师会收到源源不断的预约请求,每个预约都可以选择接或不接。在每次预约服务之间要有休息时间,因此她不能接受相邻的预约。给定一个预约请求序列,替按摩师找到最优的预约集合(总预约时间最长),返回总的分钟数。自己用了个递归,超时了,强行理解下别人的动态规划吧1、搞一个数组,来放当前i被访问到,那么最大值是多少2、初始化:如果第2个被占用,那么第...原创 2020-03-24 14:20:34 · 145 阅读 · 0 评论 -
C算法-DFS(深度优先搜索法)带返回值
leetcode490题,迷宫。带返回值与普通的C算法-DFS(深度优先搜索法)在写法上要注意的是:标记访问这个一定要有,如果本身条件不答应,就建立个数组vistied[MAXLEN][MAXLEN]1、for循环节点,和判断什么时候递归,放在主函数,与回溯风格明显不同。2、dfs结构:a、if 出界 xxx;b、if被访问过 xxx;c、标记访问; d、dfs(next)3、注意满足条件...原创 2020-03-24 12:15:03 · 921 阅读 · 0 评论 -
C算法-BFS(广度优先搜索法)
leetcode490题,迷宫。算法核心就是1、写好入队函数的判断2、写好外面函数入队的场景3、二维数组需要构造结构体包含x,y坐标#define MAXLEN 10000typedef struct { int x; int y;}Queue;Queue g_queue[MAXLEN];int Enqueue(int x, int y, int tail, int *...原创 2020-03-24 11:25:00 · 423 阅读 · 0 评论 -
C算法-DFS(深度优先搜索法)
leetcode200题,岛屿数量。二维矩阵,1代表陆地,连在一起算一个岛,返回岛屿个数。dfs套路跟之前介绍的回溯风格有点不一样C算法-贪心/回溯/剪枝1、for循环节点,放在主函数,与回溯风格明显不同。2、dfs结构:a、if 出界 xxx;b、if满足条件xxx 置条件;c、dfs(next)void dfs(char **grid,int row, int col, int i ...原创 2020-03-23 21:40:14 · 850 阅读 · 0 评论 -
C算法-线性探测法
leetcode945题,使数组唯一的最小增量。给出一个数组Arr[3,2,1,2,1,7],每次只能某个元素+1,使最后每个元素各不相同。参考作者题解,有那么一点并查集的味道。1、申请一个数组tmp,初始化为-1;2、如果b=Arr[i],在tmp的下标中没有存,那么直接放进去,并且置为b+1。暗示下次如果还有这个元素想来这个坑,需要去b+1处找找位子。3、如果已经存过loc = tm...原创 2020-03-22 11:52:01 · 488 阅读 · 0 评论 -
C算法-双指针匹配单词
leetcode1062题,最长重复子串。比如aabcaabdaab,输出最长的重复过的aableetcode758题,字符串中的加粗单词。比如 words = [“ab”, “bc”] 和 S = “aabcd”,需要返回 “aabcd”。已经出现N次的题目了,套路总结下1、定义startA、startB、curr,通过curr控制移动,匹配startA+curr与startB+curr的...原创 2020-03-21 23:41:47 · 292 阅读 · 0 评论 -
C算法-贪心
leetcode135题,每个孩子有个评分,老师根据评分判断每个孩子有多少苹果。1、每个孩子至少分配到 1 个糖果。2、相邻的孩子中,评分高的孩子必须获得更多的糖果。思路很神奇,只能意会一下先。1、从左边开始,看当前index的得分>index-1的得分,那么给index再多加一个苹果2、从右边开始,看当前index的得分>index+1的得分,那么给index再多加一个苹果,如...原创 2020-03-15 12:54:19 · 84 阅读 · 0 评论 -
C算法-QSORT&BSEARCH
leetcode139题,单词拆分。思路是按照之前博客提到的老思路来的,贪心/回溯/剪枝(最后还是会超时的,放弃了)。https://blog.csdn.net/weixin_45554139/article/details/104672443有个bug是我不会对char **长相的内容处理快排。如下仔细讲解,参考大牛的帖子,帖子无法粘贴。int (*compare)(const void ...原创 2020-03-12 16:03:52 · 187 阅读 · 0 评论 -
C算法-优先队列
leetcode778题,水位上升的泳池中游泳。第一个想到的是dfs,深搜,时间比较长,180ms有点尴尬,方法如下没啥好讲的。评论提到了优先队列,重点学习下。后台去借鉴下大家的吧,越写时间越久,累觉不爱#define MAXLEN 7typedef enum { UNVISITED, VISITED, BROUAD}Poolstate;typedef struct { ...原创 2020-03-07 20:51:28 · 85 阅读 · 0 评论 -
C算法-二分查找变换版
leetcode33题,搜索旋转排序数组。二分查找结果,写了一堆垃圾。最开始是写的另一种垃圾,等学会了来优化。int search(int* nums, int numsSize, int target) { int ret = -1, start = 0, end = numsSize - 1; while (start <= end) { int mid = (start +...原创 2020-03-07 14:10:03 · 86 阅读 · 0 评论 -
C算法-哈希
leetcode554题,砖墙。leetcode347题,前 K 个高频元素。砖墙这道题,居然是把每一行的可能性加起来,然后查找全部出现最多的位置,真真秒啊!!!!!其他,大同小异,就是求次数最多(554)或者前K多(347)的元素。作者百度了下也并不懂哈希,归结出来就是快排+对信息的val和time进行存储就可以过。554答案int comp(const void *a, const...原创 2020-03-07 12:39:48 · 200 阅读 · 0 评论 -
C算法-贪心/回溯/剪枝
leetcode698题,划分为k个相等的子集。主要是found函数,太难了= =,摘自百科:回溯算法也叫试探法,它是一种系统地搜索问题的解的方法。 用回溯算法解决问题的一般步骤:1、 针对所给问题,定义问题的解空间,它至少包含问题的一个(最优)解。2 、确定易于搜索的解空间结构,使得能用回溯法方便地搜索整个解空间 。3 、以深度优先的方式搜索解空间,并且在搜索过程中用剪枝函数避免无...原创 2020-03-05 12:46:24 · 634 阅读 · 0 评论 -
C算法-二分查找
leetcode34题,在排序数组中查找元素的第一个和最后一个位置。这个作者写的确实蛮好的,提供了一些思路,我主要讲一下如何消化的吧。https://leetcode-cn.com/problems/find-first-and-last-position-of-element-in-sorted-array/solution/er-fen-cha-zhao-suan-fa-xi-jie-xi...原创 2020-03-03 00:01:19 · 91 阅读 · 0 评论 -
C算法-并查集
leetcode684题,冗余链接。第N 遍忘记了malloc和memset一定要用sizeof(xx) * length了,晕死并查集的用途这位大哥讲的很详细,https://blog.csdn.net/qq_41593380/article/details/81146850主要思想就是:查找多少个团队,就是查找有多少个团队大哥。A和B有关系,那么我去把A的大哥找出来,B的大哥也找出来,让...原创 2020-01-14 16:02:53 · 250 阅读 · 0 评论