算法
算法
乔二梦
这个作者很懒,什么都没留下…
展开
-
C指针的分析(数组指针和指针数组)
指针:1. 指针基础定义:int *p 定义一个指针看,这个指针只指向一个整形,char *p 这个指针只指向一个字符型, 还有 double *p, float *p 等int *p;p 表示所指向的对象的地址, *p可以理解成对象本身#include<stdio.h>int main(){ int a = 5; int* p = &a; printf("p指向的值:%d ,p的值:%d ,a的地址:%d", *p , p,&a); return原创 2021-08-16 22:01:16 · 182 阅读 · 1 评论 -
5.基于C的背包问题多讲(二维费用背包)
有 N 件物品和一个容量是 V 的背包,背包能承受的最大重量是 M。每件物品只能用一次。体积是 vi,重量是 mi,价值是wi。求解将哪些物品装入背包,可使物品总体积不超过背包容量,总重量不超过背包可承受的最大重量,且价值总和最大。输出最大价值。输入格式第一行两个整数,N,V,M,用空格隔开,分别表示物品件数、背包容积和背包可承受的最大重量。接下来有 N行,每行三个整数 vi,mi,wi,用空格隔开,分别表示第 i件物品的体积、重量和价值。输出格式输出一个整数,表示最大价值。数据范围0&原创 2021-06-22 22:19:16 · 138 阅读 · 0 评论 -
4.基于C的背包问题多讲(混合背包)
有 N 种物品和一个容量是 V 的背包。物品一共有三类:第一类物品只能用1次(01背包); 第二类物品可以用无限次(完全背包); 第三类物品最多只能用 si 次(多重背包);每种体积是 vi,价值是 wi。求解将哪些物品装入背包,可使物品体积总和不超过背包容量,且价值总和最大。输出最大价值。输入格式第一行两个整数,N,V,用空格隔开,分别表示物品种数和背包容积。接下来有 N 行,每行三个整数 vi,wi,si,用空格隔开,分别表示第 i 种物品的体积、价值和数量。si=−1 :表示第 i 种物品只能原创 2021-06-22 22:03:12 · 184 阅读 · 0 评论 -
3.基于C的背包问题多讲(多重背包及其相关优化)
有 N 种物品和一个容量是 V 的背包。第 i 种物品最多有 si 件,每件体积是 vi,价值是 wi。求解将哪些物品装入背包,可使物品体积总和不超过背包容量,且价值总和最大。输出最大价值。输入格式第一行两个整数,N,V,用空格隔开,分别表示物品种数和背包容积。接下来有 N 行,每行三个整数 vi, wi, si,用空格隔开,分别表示第 i 种物品的体积、价值和数量。输出格式输出一个整数,表示最大价值。数据范围0<N,V≤1000<vi,wi,si≤100输入样例4 51原创 2021-06-22 16:58:54 · 150 阅读 · 0 评论 -
2.基于C的背包问题多讲(完全背包)
有 N 种物品和一个容量是 V的背包,每种物品都有无限件可用。第 i 种物品的体积是 vi,价值是 wi。求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。输出最大价值。输入格式第一行两个整数,N,V,用空格隔开,分别表示物品种数和背包容积。接下来有 N行,每行两个整数 vi,wi,用空格隔开,分别表示第 i种物品的体积和价值。输出格式输出一个整数,表示最大价值。数据范围0<N,V≤10000<vi,wi≤1000输入样例4 51 22 43 4原创 2021-06-22 10:23:22 · 159 阅读 · 0 评论 -
873.枚举找出升序数组中最长的斐波那契数列
最长的斐波那契子序列的长度如果序列 X_1, X_2, …, X_n 满足下列条件,就说它是 斐波那契式 的:n >= 3对于所有 i + 2 <= n,都有 X_i + X_{i+1} = X_{i+2}给定一个严格递增的正整数数组形成序列,找到 A 中最长的斐波那契式的子序列的长度。如果一个不存在,返回 0 。(回想一下,子序列是从原序列 A 中派生出来的,它从 A 中删掉任意数量的元素(也可以不删),而不改变其余元素的顺序。例如, [3, 5, 8] 是 [3, 4, 5,.原创 2021-05-11 14:57:07 · 275 阅读 · 0 评论 -
870. 优势洗牌(c语言用结构体解决)
给定两个大小相等的数组 A 和 B,A 相对于 B 的优势可以用满足 A[i] > B[i] 的索引 i 的数目来描述。返回 A 的任意排列,使其相对于 B 的优势最大化。示例 1:输入:A = [2,7,11,15], B = [1,10,4,11] 输出:[2,11,7,15]示例 2:输入:A = [12,24,8,32], B = [13,25,32,11] 输出:[24,32,8,12]解题思路:本题是力扣870题,上面这个题核心就是将A重新排列,排列后和B相比满足对应位置上的数字原创 2021-05-06 19:50:46 · 264 阅读 · 0 评论 -
连续正整数和为 N,求一共有多少组
给定一个正整数 N,试求有多少组连续正整数满足所有数字之和为 N?示例 1:输入: 5输出: 2解释: 5 = 5 = 2 + 3,共有两组连续整数([5],[2,3])求和后为 5。示例 2:输入: 9输出: 3解释: 9 = 9 = 4 + 5 = 2 + 3 + 4分析:对于连续的整数,可以类比于公差是1的等差数列,首项为a,连续n个数的和N=(2a+n-1)*n/2,即求2N=(2a-1+n)n整数解的个数所以只要枚举出满足以下两个条件的结果即可:1.n是2N的因子2.2N除原创 2021-04-02 16:51:06 · 871 阅读 · 0 评论 -
sprintf()函数将数字转换成字符串
给你一个仅由数字 6 和 9 组成的正整数 num,你最多只能翻转一位数字,将 6 变成 9,或者把 9 变成 6 请返回你可以得到的最大数字。输入:num = 9669输出:9969解释:改变第二位数字可以得到 9969 。最大的数字是 9969 。int maximum69Number (int num){ char strNum[6]; sprintf(strNum, "%d", num); /* 数字转为字符串 */ int len = strlen(strNum)原创 2021-04-01 11:05:46 · 2800 阅读 · 0 评论 -
颜色分类算法
给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/sort-colors示例 1:输入:nums = [2,0,2,1,1,0]输出:[0,0,1,1,2,2]示例 2:输入:nums = [2,0,1]输出:[0,1,2]示例 3:输入:nu原创 2021-03-24 19:15:07 · 658 阅读 · 0 评论 -
匹配子序列的单词数
给定字符串 S 和单词字典 words, 求 words[i] 中是 S 的子序列的单词个数。示例:输入:S = “abcde”words = [“a”, “bb”, “acd”, “ace”]输出: 3解释: 有三个是 S 的子序列的单词: “a”, “acd”, “ace”。注意:所有在words和 S 里的单词都只由小写字母组成。S 的长度在 [1, 50000]。words 的长度在 [1, 5000]。words[i]的长度在[1, 50]。来源:力扣(LeetCode)原创 2021-03-23 16:08:08 · 385 阅读 · 0 评论 -
C实现蓄水池抽样算法
蓄水池抽样算法:当内存无法加载全部数据时,如何从包含未知大小的数据流中随机选取k个数据(每一次读都只是K个数),并且要保证每个数据被抽取到的概率相等。*隐含条件:*只能顺序读取,然后保证每个数读取的概率都相同,随机读取K个,也就是说内存内最多只能装下K个数据1.当 k = 1 时即此题的情况也就是说,我们每次只能读一个数据。假设数据流含有N个数,我们知道如果要保证所有的数被抽到的概率相等,那么每个数抽到的概率应该为 1/N那如何保证呢?先说方案:每次只保留一个数,当遇到第 i 个数时,以 1原创 2021-03-03 14:42:50 · 419 阅读 · 1 评论 -
C解决构建乘积数组
给定一个数组 A[0,1,…,n-1],请构建一个数组 B[0,1,…,n-1],其中 B[i] 的值是数组 A 中除了下标 i 以外的元素的积, 即 B[i]=A[0]×A[1]×…×A[i-1]×A[i+1]×…×A[n-1]。不能使用除法。leetcode上面提供了一种非常精妙的算法,空间复杂度为nint* constructArr(int* a, int aSize, int* returnSize){ int *arr = NULL; int i, temp; if原创 2021-03-02 16:59:29 · 102 阅读 · 0 评论 -
罗马数字的计数规则和算法实现罗马数字和十进制的相互转换
1.罗马数字的计数规则罗马数字共有7个 I(1) ,V(5),X(10),C(100),D(500),M(1000)。a、重复数次:一个罗马数字重复几次,就表示这个数的几倍。比如: III表示3,XXX表示30。 同一数码最多只能出现三次,如40不可表示为XXXX,而要表示为XL。例外:由于IV是古罗马神话主神朱庇特(即IVPITER,古罗马字母里没有J和U)的首字,因此有时用IIII代替Ⅳ。b、右加左减:在较大的罗马数字的右边记上较小的罗马数字,表示大数字加小数字。在较大的罗马数字的左边记上原创 2021-02-26 16:06:36 · 2700 阅读 · 0 评论 -
N个数任意组合相加得不到的数中的最小值
题目:小易邀请你玩一个数字游戏,小易给你一系列的整数。你们俩使用这些整数玩游戏。每次小易会任意说一个数字出来,然后你需要从这一系列数字中选取一部分出来让它们的和等于小易所说的数字。 例如: 如果{2,1,2,7}是你有的一系列数,小易说的数字是11.你可以得到方案2+2+7 = 11.如果顽皮的小易想坑你,他说的数字是6,那么你没有办法拼凑出和为6 现在小易给你n个数,让你找出无法从n个数中选取部分求和的数字中的最小数(从1开始)。输入描述:输入第一行为数字个数n (n ≤ 20)第二行为n个数xi原创 2021-01-20 07:45:34 · 642 阅读 · 2 评论 -
基于数组判断字符串是否是回文
“回文串”是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串。花花非常喜欢这种拥有对称美的回文串,生日的时候她得到两个礼物分别是字符串A和字符串B。现在她非常好奇有没有办法将字符串B插入字符串A使产生的字符串是一个回文串。你接受花花的请求,帮助她寻找有多少种插入办法可以使新串是一个回文串。如果字符串B插入的位置不同就考虑为不一样的办法。例如:A = “aba”,B = “b”。这里有4种把B插入A的办法:在A的第一个字母之前: “baba” 不是回文在第一个字母‘a’原创 2021-01-18 07:13:24 · 1599 阅读 · 0 评论 -
C基于贪心思想实现网格盒子欧几里得距离不等于固定数的最大分布
题目:二货小易有一个W*H的网格盒子,网格的行编号为0 ~ H-1,网格的列编号为0 ~ W-1。每个格子至多可以放一块蛋糕,任意两块蛋糕的欧几里得距离不能等于2。对于两个格子坐标(x1,y1),(x2,y2)的欧几里得距离为: (x1-x2) * (x1-x2) + (y1-y2) * (y1-y2) ) 的算术平方根。小易想知道最多可以放多少块蛋糕在网格盒子里。引用:原文描述添加链接描述满足欧几里得距离不等于2,则同一行中任意两块蛋糕的距离一定大于等于2或者为0才可以,在任意斜对角线上的蛋糕都不可能原创 2021-01-16 08:50:01 · 102 阅读 · 1 评论 -
N个数最少能由多少个数异或产生
题目描述:你现在想绘制一幅画,但是你现在没有足够颜色的颜料。为了让问题简单,我们用正整数表示不同颜色的颜料。你知道这幅画需要的n种颜色的颜料,你现在可以去商店购买一些颜料,但是商店不能保证能供应所有颜色的颜料,所以你需要自己混合一些颜料。混合两种不一样的颜色A和颜色B颜料可以产生(A XOR B)这种颜色的颜料(新产生的颜料也可以用作继续混合产生新的颜色,XOR表示异或操作)。本着勤俭节约的精神,你想购买更少的颜料就满足要求,所以兼职程序员的你需要编程来计算出最少需要购买几种颜色的颜料?(输出最少需要在商店原创 2021-01-13 07:34:01 · 385 阅读 · 0 评论 -
C实现递归的经典案例
题目:一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。分析:无论中间怎么跳,第n个台阶是必须要碰到的,他可以从第n-1个跳一步来,也可以是第n-2个跳两步过来,两种情况分别代表着不同的跳法,即第n个台阶的跳法:JumpNumber[n]=JumpNumber[n-1]+JumpNumber[n-2];以此类推,跳到JumpNumber[n-1]的也是由n-2或者n-3跳过来,而JumpNumber[n-2]是由n-3和n-4跳过来,原创 2021-01-12 10:49:58 · 434 阅读 · 0 评论 -
链表中每一个节点的值都在 0 - 9 之间,链表整体代表一个整数。 两个这种链表,请生成个整数相加值的结果链表。
问题详述: 假设链表中每一个节点的值都在 0 - 9 之间,那么链表整体就可以代表一个整数。给定两个这种链表,请生成代表两个整数相加值的结果链表。例如:链表 1 为 9->3->7,链表 2 为 6->3,最后生成新的结果链表为 1->0->0->0。算法实现:1.将链表翻转a.实现原理图:b.实现函数 struct ListNode* reverseList(struct ListNode* head) struct ListNode *en原创 2021-01-12 09:09:49 · 1536 阅读 · 0 评论 -
C实现判断链表是否有环
//设置两个速度不同的指针同时从链表的第一个节点开始遍历链表,//一个快指针p2每次移动两个节点,一个慢指针p1每次移动一个节点,//若两个指针能相遇,则存在环。 #include <stdbool.h> bool hasCycle(struct ListNode* head ) { struct ListNode *p1=head, *p2=head; while((p2 != NULL) && (p2->next != NULL))原创 2021-01-11 09:45:58 · 178 阅读 · 0 评论