- 博客(51)
- 收藏
- 关注
原创 啊哈算法--堆排序 (python)
在·一个最下根堆中,如果将堆顶的元素删除并新增一个数,那么此时就不再符合最小根堆的性质了,因此这个时候就需要将这个数进行向下调整的操作,直到找到合适位置为止。向下调整代码如下:向上调整有向下调整的操作那么就有向上调整的操作:向上调整代码如下:堆的创建 利用向下调整的操作进行堆的创建利用向下调整的操作进行堆的创建我们可以从最后一个非叶子结点(n//2)开始到根结点(1),逐个扫描所有结点,根据需要将当前向下调整。该算法的时间复杂度为O(n) 利用向上调整的操作进行堆的创建
2022-06-23 15:02:34 423
原创 只出现一次的数字(I,II)(python)
写这篇博客主要是为了说明在部分场景中位运算的便利。给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?不使用额外空间:即空间复杂度为O(1)。示例 1:输入: [2,2,1]输出: 1示例 2:输入: [4,1,2,1,2]输出: 4算法思路对于这道题,可使用异或运算。异或运算有以下三个性质。题目只出现一次的数字2描述给你一个整数数组 ,除某个元素仅出现 一次
2022-06-06 19:27:01 898
原创 买卖股票的最佳时机 (python)
题目描述给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。示例输入:[7,1,5,3,6,4]输出:5解释:在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。注意利润不
2022-05-25 16:13:58 379
原创 ICPC is a Marathon (python)
题目背景ICPC是一场马拉松。愿踏在田野上,你是勇敢的人;坚持到底,你是一个坚强的人。一路上有挫折和艰辛,当然也有胜利的喜悦,美好的回忆和好朋友。题目描述为什么任务艰巨:他给了你n个轨道,其长度是a1, a2, a3,…, an(单位km). 您需要选择一些轨道并将它们拼接成一个马拉松赛道(拼接的长度是您所选轨道长度的总和)。你需要选择的最小音轨数是多少?众所周知,马拉松全程42.195公里。为了简化这个问题,你只需要走42公里的路程。所以问题很简单:选择长度总和为42公里的最小轨道。因为WHY
2022-05-24 20:19:15 344
原创 一次编辑 (python)
目的:灵活使用any()函数和zip()函数。any(iterable)函数:如果 iterable 的任一元素为真值则返回 True,否则返回 False。 如果可迭代对象为空,返回 False。zip()函数:用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的对象题目字符串有三种编辑操作:插入一个字符、删除一个字符或者替换一个字符。 给定两个字符串,编写一个函数判定它们是否只需要一次(或者零次)编辑。示例输入: first = .
2022-05-17 21:29:32 263
原创 蓝肽子序列 【决赛】(python)
分析从题目中可以看出本题要求的是最长蓝肽子公共子序列,我们都知道最长公共子序列是经典的动态规划算法,本题最长蓝肽子公共子序列经过一定的处理后可以转化为动态规划的类型。代码s1 = input()s2 = input()def createDict(s): n = len(s) d = [] start = 0 for i in range(n): if i>0 and s[i] >= 'A' and s[i] <=...
2022-05-11 17:21:16 310
原创 循环小数【决赛】(python)
代码:详细分析见精准表达浮点数 (python)import mathp, q = map(int,input().split())a = input()b = a[p-1:q]a, b = int(a), int(b)subnums, momnums = (10**(q-p+1)-1)*a + b, (10**q)*(10**(q-p+1)-1)print(int(subnums/math.gcd(subnums,momnums)), int(momnums/(math.gcd(..
2022-05-09 21:12:39 392
原创 重复字符串【决赛】(python)
代码本题主要采用贪心算法、字典来完成。字典保存的是每组数据中第i的元素出现的次数。def solve(s, k): n = len(s) if n//k != n/k: return -1 Size= n//k nums = [dict() for _ in range(Size)] for i in range(0,n,Size): for j in range(Size): nums[j][..
2022-05-09 21:08:42 346
原创 分层遍历二叉树 (python)
解法 1按题目意思一层一层的遍历二叉树。# Definition for a binary tree node.# class TreeNode:# def __init__(self, val=0, left=None, right=None):# self.val = val# self.left = left# self.right = rightclass Solution: def levelOrder(self
2022-05-07 21:36:19 1364
原创 电话号码对应英文单词 (python)
在电话号码输入数字,输出他所有的单词组合。解法 1循环法,这里假设电话号码只有3位,那么可以使用3个for循环来进行输出。c = ["","","ABC","DEF","GHI","JKL","MNO","PQRS","TUV","WXYZ"] # 分别代表着0,1,2,3,4,5,6,7,8,9total = [0,0,3,3,3,3,3,4,3,4] # 分别代表着c中字母的数量number = list(map(int, input().split()))TelLength = l
2022-04-28 19:42:57 1753
原创 字符串移位包含的问题 (python)
给定两个字符串s1和s2,要求判定s2是否能够被s1做移位得到的字符串包含。例如,给定s1=AABCD和s2=CDAA,返回True;如果给定s1=ABCD和s2=ACBD返回False。分析和解法解法 1python3的字符串有一个函数find().即 find(str, beg=0, end=len(string)) 检测 str 是否包含在字符串中,如果指定范围 beg 和 end ,则检查是否包含在指定范围内,如果包含返回开始的索引值,否则返回-1。从题目中可以
2022-04-26 16:05:10 2167
原创 数组分割 (python)
有一个无序,元素个数为2n的正整数数组,要求:如何能够把这个数组分割为元素个数为n的两个数组,并使得两个数组的和最接近?分析和解法题目的本质就是要用2n个整数中找出n个,使得它们的和尽可能地靠近所有整数地一半。解法 1一个最为直接地暴力解法是:先将数组的所有元素进行排序; 将它们划分成为两个子数组 从和中找出一对数进行交换,使得和直接的插值尽可能的小,直到找不到可对换的为止。该算法的缺点是和的值不一定是最优的,优点是和元素的个数相差最小。解法 2假设2n个整数的和是SU..
2022-04-25 17:00:11 6186
原创 数组循环移位 (python)
设计一个算法,把一个含有N个元素的数组循环右移k位,要求时间复杂度为O(N),且只允许使用两个附加变量。解法 1不符合题意得解法1:一个简单的解法就是循环k次每次将数组内的元素右移一位。def RightShif(arr,n,k): while k>0: k -= 1 t = arr[n-1] for i in range(n-1,0,-1): arr[i] = arr[i-1] arr[
2022-04-24 13:02:07 2598
原创 求数组中最长递增子序列 (python)
题目要求:写一个时间复杂度尽可能低的程序,求一个一维数组(N个元素)中最长递增子序列的长度。注意:这里要求的是子序列,子序列是不要求连续的。解法 1根据无后效性的定义我们知道,将各个阶段按一定的次序排序好之后,对于某个给定阶段的状态来说,它以前的各个阶段的状态无法直接影响它未来的一个决策。而只能间接地通过当前状态来影响。同样地,本题就符合后效性的定义。可以采用动态规划的方法来做。通过数学规律来分析目标串:1,-1,2,-3,4,-5,6,-7使用i来表示当前遍历的位置。当i等于1时..
2022-04-23 15:03:34 2010
原创 子数组之和的最大值(二维) python
解法 1利用二维前缀和求子数组之和的最大值,时间复杂为。# 参考二维前缀和 https://blog.csdn.net/justidle/article/details/103754960n = int(input())nums = []sum = [[0] * (n + 1) for _ in range(n + 1)]for i in range(n): nums.append(list(input().split(' ')))# 初始化for i in range(1,
2022-04-20 21:37:04 572
原创 求数组中的子数组之和的最大值 (python)
一个有N个整数元素的一维数组(A[0],A[1],...,A[n-1]),那么这个数组的子数组之和的最大值是什么呢?理解题意:题目所说的子数组是连续的。 题目只需要求和,并不需要返回子数组的具体位置。 数组的元素是整数,所以数组可能会出现正整数、零、负整数。解法 1使用前n项和的算法来做:nums = [1,-2,3,5,-3,2]n = len(nums)sum = [0]*(n+1)for i in range(n): sum[i+1] = sum[i] + num
2022-04-19 17:56:07 1656
原创 子数组的最大乘积 (python)
给定一个长度为N的整数数组(含正数和负数),只允许用乘法,不能用除法,计算(N-1)个数的组合中乘积最大的一组。解法 1暴力写法很容易就可以写出来,就是把所有的(N-1)个数组合找出来,分别计算它们的乘积,并计算大小。由于总共有N个(N-1)个数的组合,总的时间赋值度是O(N*N)。暴力法还有一种做法:就是用N个数的乘积除以整数数组中的每个数。但这种做法的前提条件是整数数组不能含有0,因为含有0的化N个数的乘积就会等于0。解法 2解法1显然不是最好的解法。在计算机科学中,时间和空间往
2022-04-11 20:59:18 1353
原创 快速寻找满足条件的两个数 (python)
快速寻找一个数组中的两个数,让这两个数之和等于一个给定的值。这里假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。解法 1使用穷举的方法,就是用两个for循环进行穷举。nums = [2,7,11,15]target = 9def TwoSum(nums,target): n = len(nums) for i in range(n): for j in range(i,n): if nums[i] + num
2022-04-09 20:08:19 1254
原创 寻找数组中的最大值和最小值 (python)
数组是最简单的一种数据结构,我们经常碰到的一个基本问题,就是寻找整个数组中的最大的数,或者最小的数。这时,我们都会扫描一遍数组,把最大(最小)的数找出来。如果我们需要同时找到最大和最小的数呢?解法 1先扫描一遍数组,找到最大的数以及最小的数。这样我们需要比较2*N次才能求解。nums = list(map(int, input().split()))Maxnums , Minnums = nums[0], nums[0]for i in range(len(nums)): if
2022-04-08 21:31:05 22538
原创 婓波那契(Fibonacci)数列 (Python)
有人说婓波那契起源于一对繁殖力惊人,基因非常优秀的兔子,也有人说远古时期的鹦鹉螺就知道这个规律。婓波那契由如下递推关系式定义:解法 1使用递归法,由上到下求解def Fibonacci(n): if n == 0 or n==1: return 1 else: return Fibonacci(n-1)+Fibonacci(n-2)print(Fibonacci(3))解法 2采用类似动态规划的方法,由下到上求解def
2022-04-06 21:23:23 1487
原创 找符合条件的整数 (python)
任意给定一个正整数N,求一个最小的正整数M(M>1),使得N*M的十进制表示式中只能含有1和0.当前问题可以转换为求一个最小的正整数X,使得X的十进制表示形式里只含有1和0,并且X被N整除。这样一来就是求Y对N取模的余数。当有两个余数加起来等于N,则Y=X。N = 99BigInt = [[] for _ in range(N+1)]BigInt[1].append(0) # 10^0 = 1NoUpdate = 0i, j = 0, 1 # i为十进制的第几位, j为十进制第几位为
2022-04-05 18:55:40 1832
原创 最大公约数问题 (python)
最大公约数,在python的math库中有直接调用的函数gcd()。解法 1最简单的方法是使用辗转相除法。利用递归能够很轻松的解决这个问题。def gcd(x,y): return x if y<=0 else gcd(y,x%y)print(gcd(10,5))解法 2在解法1中用到了取模运算。但是对于大整数而言,取模运算是非常昂贵的开销。在解法2中我们用到类似辗转相除法的大整数减法,如果一个数能够同时除以x和y,则必能同时整除x-y和y。及F(x,y)=F(x-y,
2022-04-05 14:57:06 2792
原创 精准表达浮点数 (python)
在计算机中,使用float存储小数并不精确,要得到精确的结果,最好使用分数形式来表达小数。小数具有两种类型,一种是有限小数,另一种是无线小数。比如:0.9 = 9/100.333 (3) = 1/3给定一个有限小数或者无线小数,希望以分母最小的分数形式返回这个小数。对于以分母最小的分数形式返回这个小数有这样的定义:对于任意的一个分数A/B,可以简化为...
2022-04-03 20:43:57 957
原创 寻找最大的K个数 (python)
解法 1将数组直接排序然后截取后半段的数据。nums = [1,2,3,4,5,6,7,8,9,10]k = 4nums.sort()print(nums[-k:])解法 2使用快速排序的方法,将数据分为两组,其中一组数据的如何一个数都比另一个数中的任意一个数大。假设N个数储存在数组S中,我们从数组S中随机找出一个元素X,把数组分为两部分S(a)和S(b)。S(a)中的元素大于等于X,S(b)中的元素小于X。这个时候存在两种情况:1、S(a)中元素的个数小于K,S(a)中所有数和
2022-04-01 21:28:36 2406
原创 1的数目(python)
给定一个十进制正整数N,写下从1开始到N的所有整数,然后计算其中出现1的个数。例如:N = 2,1到N的所有整数为1,2。这里出现一个’1‘.N = 12,有1到N的所有整数为1,2,3,4,5,6,7,8,9,10,11,12。这里出现 ’1‘,‘10’,’11‘,’12‘一共5个1。解法 1暴力解法:直接遍历1到N中的数。def Count1InInteger(num): count = 0 while num: count += 1 if nu
2022-03-31 21:26:22 2544
原创 寻找发帖“水王“ (python)
这里设ID列表中总有一个数出现的次数超过总次数的一半,这个数称为"水王"。解法 1记录所有ID出现的次数,找到最大次数的值。ID = [4,4,4,4,4,4,5,6,7,8,9]MAX_n = max(ID)nums = [0]*(MAX_n+1)for i in range(len(ID)): nums[ID[i]] += 1M = max(nums)print(nums.index(M))解法 2每次删除不同的ID,不管是水王还是其他,那么剩下的ID列表中,’水
2022-03-31 20:56:08 642
原创 N的阶乘末尾0的个数 (python)
分析对N的阶乘进行质因子分解,N! = (),由于,所以0的个数只与X和Z有关,每一对2和5相乘可以得到一个10,于是有0的个数等于min(X,Z),不难看出X大于Z。所以0的个数只与Z有关。解法 1要计算Z,最直接的方法就是计算i(i=1,2,..N)的因式分解中5的指数,然后求和:N = int(input())res = 0for i in range(1,N+1): j = i while j%5==0: res += 1 j /
2022-03-30 19:09:12 2379 1
原创 求二进制中1的个数(python)
解法 1利用整数除法的特点,通过相除和判断余数的值来分析。def count_1(v): num = 0 while v: if v%2 == 1: num += 1 v = v // 2 return num解法 2利用二进制移位的方法def count_2(v): num = 0 while v: num += v&1 v >>=
2022-03-29 21:04:55 2771
原创 期末预测之最佳阈值 (python)
题目背景考虑到安全指数是一个较大范围内的整数、小菜很可能搞不清楚自己是否真的安全,顿顿决定设置一个阈值θ,以便将安全指数y转化为一个具体的预测结果——“会挂科”或“不会挂科”。因为安全指数越高表明小菜同学挂科的可能性越低,所以当y≥θ时,顿顿会预测小菜这学期很安全、不会挂科;反之若y<θ,顿顿就会劝诫小菜:“你期末要挂科了,勿谓言之不预也。”那么这个阈值该如何设定呢?顿顿准备从过往中寻找答案。题目描述具体来说,顿顿评估了m位同学上学期的安全指数,其中第i(1≤i≤...
2022-03-19 20:52:14 823
原创 邻域均值 (python)
试题背景顿顿在学习了数字图像处理后,想要对手上的一副灰度图像进行降噪处理。不过该图像仅在较暗区域有很多噪点,如果贸然对全图进行降噪,会在抹去噪点的同时也模糊了原有图像。因此顿顿打算先使用邻域均值来判断一个像素是否处于较暗区域,然后仅对处于较暗区域的像素进行降噪处理。问题描述计算机软件能力认证考试系统http://118.190.20.162/view.page?gpid=T127输入格式输入共n+1行。输入的第一行包含四个用空格分隔的正整数n、L、r和t,含义如前文所述。...
2022-03-19 17:00:55 1159
原创 集合+排序 (python)
代码 1:A = [3, 1, 2, 0, 0, 2, 0, 4, 5, 0, 2]print(sorted(set(A)))这个就很有意思。这里先去重在排序,返回的是列表。代码 2:num = [set() for i in range(9)]for i in range(8): num[0].add(i) num[1].add(0)print(num)这里直接将集合放在列表里面了。...
2022-03-18 22:54:49 1470
原创 序列查询新解 (python)
题目背景上一题“序列查询”中说道:A=[A0,A1,A2,⋯,An]是一个由n+1个[0,N)范围内整数组成的序列,满足0=A0<A1<A2<⋯<An<N。基于序列A,对于[0,N)范围内任意的整数x,查询f(x)定义为:序列A中小于等于x的整数里最大的数的下标。对于给定的序列A和整数x,查询f(x)是一个很经典的问题,可以使用二分搜索在O(logn)的时间复杂度内轻松解决。但在 IT 部门讨论如何实现这一功能时,小 P...
2022-03-18 20:32:59 327
原创 算法训练 士兵杀敌(二)(python)
资源限制时间限制:1.0s 内存限制:256.0MB问题描述 南将军手下有N个士兵,分别编号1到N,这些士兵的杀敌数都是已知的。 小工是南将军手下的军师,南将军经常想知道第m号到第n号士兵的总杀敌数,请你帮助小工来回答南将军吧。 南将军的某次询问之后士兵i可能又杀敌q人,之后南将军再询问的时候,需要考虑到新增的杀敌数。输入格式 多组测试数据,以EOF结尾;《注意》 每组第一行是两个整数N,M,其中N表示士兵的个数(1<N<1000000),M表示指令的条数。(
2022-03-02 22:48:33 479 1
原创 算法训练 最大分解(python)
资源限制时间限制:1.0s 内存限制:256.0MB问题描述 给出一个正整数n,求一个和最大的序列a0,a1,a2,……,ap,满足n=a0>a1>a2>……>ap且ai+1是ai的约数,输出a1+a2+……+ap的最大值输入格式 输入仅一行,包含一个正整数n输出格式 一个正整数,表示最大的序列和,即a1+a2+……+ap的最大值样例输入10样例输出6数据规模和约定 1<n<=10^6样例说明 p=2
2022-03-01 22:12:08 368
原创 算法训练 粘木棍(python)
资源限制时间限制:1.0s 内存限制:256.0MB问题描述 有N根木棍,需要将其粘贴成M个长木棍,使得最长的和最短的的差距最小。输入格式 第一行两个整数N,M。 一行N个整数,表示木棍的长度。输出格式 一行一个整数,表示最小的差距样例输入3 210 20 40样例输出10数据规模和约定 N, M<=7代码(dfs):import mathn, m = list(map(int, input().split()))q .
2022-02-24 15:40:20 8309
原创 算法训练 娜神平衡(python)
资源限制时间限制:1.0s 内存限制:256.0MB问题描述 娜娜是一个特别可爱的女孩子,作为学神的她最近在情感方面出现了一点点小问题。 她暗恋的琦琦是一名学霸,他只喜欢长得漂亮和学习很好的女生。 娜娜学习确实很神,但是她在琦琦面前却总是表现不出平时的神力。 琦琦感受到了娜娜对他的爱,但是他还是觉得娜娜的学习并不是特别好,于是他出了一道题给娜娜。 “娜娜,我们之间的关系需要在不断深入的同时保持一定的平衡,不可以你总是强势或者我总是弱势。” 琦琦给了娜娜一些两两不等的数,.
2022-02-24 15:38:09 386 2
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人