数据结构和算法
梧桐雪
I am MetaWu from a magicverse where Models are all wrong, some of which are useful.
展开
-
一图总结数学建模竞赛必须要掌握的十个算法
本图改编自数学建模竞赛必须要掌握的十个算法数学建模比赛是本科生和研究生阶段最重要的比赛之一,包括全国大学生数学建模竞赛(俗称“国赛”)和美国大学生数学建模竞赛(俗称“美赛”)。在这些比赛中取得好成绩,不仅有助于保研、有助于找工作,更重要的是形成科学的思维模式。下面列举了十大算法,在数学建模竞赛中有着无比广泛而重要的应用,我们可以对照着图作为checklist依次学习。...原创 2020-12-01 10:09:38 · 1499 阅读 · 0 评论 -
二分查找的解题套路总结:以LeetCode455分发饼干问题为例
一、找到二分的判断条件在这一步,我们需要理解二分查找的本质:在有序数组中查找某种特定的元素,并且解空间可以分成两部分(也就是找到那个可以回答True或者False的判决条件)。形象地说,我们可以用下图中的陆地和大海来代表True和False,他们的边界就是我们需要找的东东。每次查找,我们都要拷问自己的灵魂:“我在陆地还是海洋?”二、循环体的编写然后我们需要编写二分查找的循环体,往往需要设定三个指针L(左指针)、R(有指针)以及中间指针mid,我们可以根据判决条件来决定改变L还是R。我们用下图可以原创 2020-11-12 23:04:01 · 275 阅读 · 0 评论 -
python缓存技术优化斐波那契数列
我们经常使用斐波那契数列学习递归,很容易就能够写出以下的递归函数:def fibonacci(n): if n <= 1: return n else: return fibonacci( n - 1 ) + fibonacci( n - 2 )然而,随着n的增大,这个算法的算法复杂度也随着增大,当n到50的时候,会消耗非常大的时间才能计算出来数列的值,这显然不是我们想看到的,因此,我们需要采用一些技术来减少算法复杂度,一种方法就是引入缓存(cache)的技术,我们将曾经计算过的数列原创 2020-11-05 14:58:40 · 1870 阅读 · 2 评论 -
一图总结算法考点
上图总结了算法考点,比较全面,但是常见的考点也就以下几种,根据二八法则,20%的题目占了80%的题目:STL(包括堆、栈、队列、链表)搜索(包括广度优先和深度优先)枚举、贪心、二分、动态规划...原创 2020-11-03 20:13:04 · 213 阅读 · 0 评论 -
LeetCode209:长度最小的子数组之双指针解法
题设给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的 连续 子数组,并返回其长度。如果不存在符合条件的子数组,返回 0。示例:输入:s = 7, nums = [2,3,1,2,4,3]输出:2解释:子数组 [4,3] 是该条件下的长度最小的子数组。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/minimum-size-subarray-sum著作权归领扣网络所有。商业转载请联系官方授权,非原创 2020-10-29 11:13:47 · 181 阅读 · 0 评论 -
LeetCode1262:可被三除的最大和之贪心+去除方法
题设给你一个整数数组 nums,请你找出并返回能被三整除的元素最大和。示例 1:输入:nums = [3,6,5,1,8]输出:18解释:选出数字 3, 6, 1 和 8,它们的和是 18(可被 3 整除的最大和)。示例 2:输入:nums = [4]输出:0解释:4 不能被 3 整除,所以无法选出数字,返回 0。示例 3:输入:nums = [1,2,3,4,4]输出:12解释:选出数字 1, 3, 4 以及 4,它们的和是 12(可被 3 整除的最大和)。提示:1 <原创 2020-10-29 10:59:58 · 271 阅读 · 0 评论 -
LeetCode547:朋友圈的深度优先解法
题设班上有 N 名学生。其中有些人是朋友,有些则不是。他们的友谊具有是传递性。如果已知 A 是 B 的朋友,B 是 C 的朋友,那么我们可以认为 A 也是 C 的朋友。所谓的朋友圈,是指所有朋友的集合。给定一个 N * N 的矩阵 M,表示班级中学生之间的朋友关系。如果M[i][j] = 1,表示已知第 i 个和 j 个学生互为朋友关系,否则为不知道。你必须输出所有学生中的已知的朋友圈总数。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/frie原创 2020-10-27 15:25:54 · 546 阅读 · 1 评论 -
LeetCode275:H指数及其算法优化
题设给定一位研究者论文被引用次数的数组(被引用次数是非负整数),数组已经按照 升序排列 。编写一个方法,计算出研究者的 h 指数。h 指数的定义: “h 代表“高引用次数”(high citations),一名科研人员的 h 指数是指他(她)的 (N 篇论文中)总共有 h 篇论文分别被引用了至少 h 次。(其余的 N - h 篇论文每篇被引用次数不多于 h 次。)"方案一:思路我们先对引用次数的列表进行降序排列,然后从前向后遍历并且计数,如果我们遇到计数的数值大于引用次数的时候,就是hIndex的原创 2020-10-27 13:37:33 · 257 阅读 · 0 评论 -
LeetCode94:二叉树的中序遍历
题设给定一个二叉树,返回它的中序 遍历。示例:输入: [1,null,2,3]12/3输出: [1,3,2]思路采用递归的方式进行中序遍历,先定义一个中序函数,这个子函数分成四步走,第一步是判断根节点是否为空,如果为空则直接返回,后面三步就是遍历的三个步骤,即递归调用左节点=>列表添加中序结点=>递归调用右节点。然后在母函数里面定义一个空列表,将二叉树的root作为参数调用子函数,最终返回列表即可。代码from typing import Listclass Tree原创 2020-10-22 16:25:07 · 125 阅读 · 0 评论 -
leetcode455:分法饼干问题
题设假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。对每个孩子 i,都有一个胃口值 g[i],这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j,都有一个尺寸 s[j] 。如果 s[j] >= g[i],我们可以将这个饼干 j 分配给孩子 i ,这个孩子会得到满足。你的目标是尽可能满足越多数量的孩子,并输出这个最大数值。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/assign-cookie原创 2020-10-21 22:47:08 · 403 阅读 · 0 评论 -
Harvard CS50 Project0:Degrees
哈佛大学公开课CS50 Introduction to Artificial Intelligence with Python的Lecture0参考解答,实现了好莱坞明星人物关系的BFS搜索。def shortest_path(source, target): """ Returns the shortest list of (movie_id, person_id) pairs that connect the source to the target. source a原创 2020-07-29 01:48:28 · 269 阅读 · 0 评论 -
python for kids 14章弹球游戏代码及其编程小测验4个问题的实现
代码如下:from tkinter import *import tkinterimport tkinter.messageboximport randomimport timedef callbackClose(): tk.destroy()class Ball: def __init__(self,canvas,paddle,color): self.canvas = canvas self.paddle = paddle原创 2020-07-11 22:56:31 · 318 阅读 · 0 评论 -
用opencv-python数玉米粒数并且判断玉米品质
openCV是一个非常强大的视觉计算的模块,我们可以通过python来调用它对图像进行一些列的操作完成计算机视觉的任务。比如我们可以给出如下的玉米图片,来让python自动输出图片中玉米的颗粒数,并且判定玉米的品质。大致的思路按照二值化、腐蚀、距离变换、轮廓提取的流程进行,通过内切圆与整体面积比来判定玉米颗粒的饱满度,我们可以写出一下程序:# -*- coding: utf-8 -*-import cv2import numpy as npimport timefont = cv2.FONT_原创 2020-07-06 17:50:57 · 2761 阅读 · 1 评论 -
python版武侠小说男女侠姓名生成器
中国人对宝宝取名字一事非常重视,常会请风水先生出马,市面上也有一些自动取名软件,在淘宝上卖出了比较高的价格。同样的,网络小说或者游戏角色的设计当中也经常会遇到取名字的问题,其实中国的汉字也就几千个,取名的数量在2-4范围之内,所以中文名字其实是从一个有限集合中选取文字组合而成的,完全可以通过程序设计的方式从有限集中随机选择,我制作(也是用python哈哈)了三个.csv文件,分别存放常见的姓、男名、女名常用词(见附件),编写了以下代码,可以自动生成男名、女名、指定姓氏的男/女名。这样我们就可以完成以下任务:原创 2020-07-03 22:48:22 · 4912 阅读 · 0 评论 -
python生成并二分查找有序列表中的元素
如题,我们可以使用sorted(random.sample(range(100),10))生成一个有序的列表,然后使用二分查找的方法来寻找对应元素的index,如果这个元素不存在与列表中,则返回第一个大于它的元素的index值。import randomslst = sorted(random.sample(range(100),10))snum = 25print(slst,'\n',snum)def index_of_snum_in_slst(num,lst): left = 0 rig原创 2020-06-25 10:24:18 · 527 阅读 · 0 评论 -
递归法合并两个有序列表
如题,这题的关键就是要找递归方程:f(m+n)=f(0).next−>merge(m+n−1)f(m+n)=f(0).next->merge(m+n-1)f(m+n)=f(0).next−>merge(m+n−1),转化为代码就是分两种情况如下。linklist.pyimport randomclass ListNode(): def __init__(self,num): self.next = None self.val = numdef merge2lists(l原创 2020-06-25 00:39:55 · 504 阅读 · 0 评论 -
使用递归的方法打印杨辉三角
def young_triange(num_rows): if num_rows == 1: return [[1]] elif num_rows ==2: return [[1],[1,1]] else: new_col = [1] for i in range(1,num_rows-1): new_ele = young_triange(num_rows-1)[num_rows-2][i-1]+young_triange(num_rows-1)[num_rows-2][i]原创 2020-06-14 22:36:55 · 974 阅读 · 0 评论 -
二分查找算法的python实现
二分查找算法,binary search algorithm,也称「折半搜索算法」、「对数搜索算法」它的使用前提:是一种在「有序数组」中查找某一特定元素的搜索算法。以下使用python程序来随机生成一个20以内的不重复随机序列randlist,然后编写二分查找算法binary_search来查找目标target=8的索引。import randomN = 20k = 10randlist = sorted(random.sample(range(1,N), k))target = 8prin原创 2020-06-10 00:32:27 · 526 阅读 · 0 评论 -
【LeetCode】宝石与石头的python实现
题目:宝石与石头给定字符串 J 代表你现在拥有代表宝石的类型,和字符串 S 代表你拥有的石头。S 中每个字符代表了一种你拥有的石头的类型,你想知道你拥有的石头中有多少是宝石。J 中的字母不重复,J 和 S 中的所有字符都是字母。字母区分大小写,因此"a"和"A"是不同类型的石头。示例1输入: J = “aA”, S = “aAAbbbb”输出: 3示例2输入: J = “z”, S = “ZZ”输出: 0写法1:使用for循环和if语句class Solution: def原创 2020-06-03 07:03:15 · 521 阅读 · 0 评论 -
由浅入深:字母异位词分组的四种python写法
题目:字母异位词分组(LeetCode49)给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。示例: 输入: ["eat", "tea", "tan", "ate", "nat", "bat"] 输出: [ ["ate","eat","tea"], ["nat","tan"], ["bat"] ] 说明:所有输入均为小写字母;不考虑答案输出的顺序。思路:用排好序的字符串作为key,对应的排序之前的字符串作为追加元素加入到该key对应的列表中,当然要原创 2020-06-02 21:52:56 · 1548 阅读 · 0 评论 -
python语言写的选择排序
选择排序,冒泡排序的升级版本,把最大值下降到列表最后的同时,把最小值上升到列表的前端,代码中写了swap函数,用于交换,这样代码看起来可读性更强一些,具体测试代码如下:num_list = [5,8,3,7,2,1,0,4]def swap(num_list,oindex,nindex): tmp = num_list[oindex] num_list[oindex] = num_list[nindex] num_list[nindex] = tmp return num_listdef原创 2020-05-24 20:56:07 · 248 阅读 · 0 评论 -
python语言实现冒泡算法(附代码)
冒泡算法的基本原理就是让大的数冒泡冒到列表的最后,最大的排在最后一位,第二大的排到最后第二位,以此类推,直到整个列表遍历完整。具体的代码如下所示:num_list = [5,8,3,7,2,1,0,4]def bubble(num_list): for i in range(len(num_list)): greatest_this_round = num_list[0] greatest_index = 0 for j in range(len(num_list)-i): if n原创 2020-05-23 11:37:49 · 1110 阅读 · 0 评论 -
鸡兔同笼问题的python解法
方法一:通过sympy的方法进行计算from sympy import Symbol,solve,pprintx = Symbol('x')y = Symbol('y')n = Symbol('n')m = Symbol('m')expr1 = x + y - nexpr2 =2*x+4*y- msolution = solve((expr1,expr2),(x,y),dict=True)chicken = solution[0][x].subs({n:35,m:94})rabbits.原创 2020-05-12 22:28:58 · 14244 阅读 · 3 评论 -
用python编写华氏温度转换为摄氏温度函数
华氏温度和摄氏温度之间的转换关系如以下表达式所示:我们可以通过以下代码来实现该数值计算:def fah2cel(fahrenheit): return 5/9*(fahrenheit-32)degree = fah2cel(104)print(degree)输出结果如下:40.0[Finished in 0.1s]...原创 2020-05-12 21:51:32 · 14984 阅读 · 10 评论 -
QuestionNO.4ofPythonChallengingProgrammingExercises
Question:Please write a program to output a random number, which is divisible by 5 and 7,between 0 and 200 inclusive using random module and list comprehension.Hints:Use random.choice() to a rando...原创 2020-05-07 09:52:14 · 189 阅读 · 0 评论 -
QuestionNO.3ofPythonChallengingProgrammingExercises
Question:Write a program that computes the value of a+aa+aaa+aaaa with a given digit as the value of a.Suppose the following input is supplied to the program:9Then, the output should be:11106代码:...原创 2020-04-30 09:47:02 · 192 阅读 · 0 评论 -
QuestionNO.2ofPythonChallengingProgrammingExercises
Question:Write a program that prints a word list in a comma-separated sequence after sorting them alphabetically.Suppose the following input is supplied to the program:[‘bat’,‘ant’,‘cat’,‘rat’]Th...原创 2020-04-28 10:19:23 · 176 阅读 · 0 评论 -
QuestionNO.1ofPythonChallengingProgrammingExercises
Question:Write a program which will find all such numbers which are divisible by 7 but are not a multiple of 5,between 2000 and 3200 (both included).The numbers obtained should be printed in a comm...原创 2020-04-24 09:56:01 · 271 阅读 · 0 评论 -
面向对象使用python-docx模块制作格式化文本(奖状生成器)
完成这个小项目需要掌握以下知识点:1.第三方模块的import使用方法2.word文档的docx模型(doc/paragraph/run三层结构)3.类和函数写法(OOP)基础4.pinyin、datetime模块的基本使用方法代码如下:from docx import Documentfrom docx.shared import Pt, RGBColorfrom docx.en...原创 2020-04-10 14:47:37 · 922 阅读 · 4 评论 -
使用python基本知识验证哥德巴赫猜想
def isprime(num): i = 2 while(i<num): if num%i==0: return False i += 1 return Truedef goldbachresolve(num): for i in range(2,num): if isprime(i) and isprime(num-i): print(num,'=',...原创 2020-04-01 21:45:29 · 2294 阅读 · 0 评论 -
找出1000以内的所有质数,并且统计1000以内质数的个数
代码如下:import mathdef isprime(num): for i in range(2,int(math.sqrt(num))+1): if num%i == 0: return False return Truecount = 0for i in range(2,1001): if isprime(i): print(i,end='\t') cou...原创 2020-04-01 21:37:58 · 4920 阅读 · 0 评论 -
容器数据结构的综合应用:词频统计
我们可以在网上找到川普的演讲稿,把它作为字符串写入到python程序中:speech ='''Thank you. Thank you very much, everyone. Sorry to keep you waiting. Complicated business, complicated. Thank you very much.I've just received a call f...原创 2020-10-28 14:35:34 · 471 阅读 · 0 评论 -
统计《西游记》中大圣出现的次数
需要提前掌握的知识点:一、文件的打开方式(with open)二、文件的readlines()方法(返回一个字符串列表)三、正则表达式re.split()方法分割字符串为字符串列表四、in关键字来判断一个字符串是否在另外一个字符串中五、for循环和if语句的灵活运用import rewith open('./xiyouji.txt','r',encoding = 'utf-8') a...原创 2020-04-01 11:16:29 · 1769 阅读 · 0 评论 -
计算pi的其他方法
方法一:HPI = 1for i in range(1,10000): HPI *= (4*i*i)/(2*i-1)/(2*i+1) PI = 2*HPI print(PI,end = '\r',flush=True)方法二:import mathSPIS = 0for i in range(1,10000000): SPIS += 1/(i*i) PI = math....原创 2020-03-31 16:05:06 · 370 阅读 · 0 评论 -
python基础知识验证哥德巴赫猜想
哥德巴赫猜想:任何大于2的偶数都能够写成两个质数相加的形式。验证思路:编写哥德巴赫分解程序,输入一个数,输出他的两个子质数,如果找不到,返回False。遍历整数,查看是否有False的情况,如果有False的情况,我们认为哥德巴赫猜想不成立,如果没有False,我们认为歌德巴赫猜想是不能证伪的。第一步:质数的判定:我们可编写函数通过if语句和for循环来判断一个数是否为质数def i...原创 2020-03-21 15:24:34 · 28156 阅读 · 1 评论 -
用python打印九九乘法表
考察知识点:1.for循环的使用;2.range函数的使用;3.print函数的使用;4.字符串的使用;代码:for i in range(1,10) : for j in range(i,10): print(i,' ',j,'得',i*j,end='\t;') print('')运行结果:...原创 2020-03-21 14:09:34 · 992 阅读 · 0 评论 -
蓝桥杯竞赛真题:图片旋转问题
图片旋转是对图片最简单的处理方式之一,在本题中,需要对图片顺时针旋转 90 度。用一个 n×m 的二维数组来表示一个图片,例如给出一个 3×4 的图片的例子:1 3 5 79 8 7 63 5 9 7这个图片顺时针旋转 90 度后的图片如下:3 9 15 8 39 7 57 6 7给定初始图片,请计算旋转后的图片。【输入格式】输入的第一行包含...原创 2020-02-29 09:53:08 · 1006 阅读 · 0 评论 -
python暴力破解小学奥赛习题
一道小学奥赛题如下:XYZ×693 = ZYX*396我们可以使用python语言来进行枚举法暴力破解,注意这里我们将使用product函数,这个方法可以把原本需要3层循环才能实现的遍历压缩到一个for循环之内。from itertools import productfor x,y,z in product(range(1,10),range(10),range(10)): a = 1...原创 2020-02-27 22:16:04 · 628 阅读 · 0 评论 -
python列表实现斐波那契数列的计算
问题:有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13…求出这个数列的前20项之和这道题是典型的斐波那契数列。斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……在数学上,斐...原创 2020-02-10 09:48:30 · 6598 阅读 · 1 评论 -
一套例题演示python中for循环遍历字符串列表
这道例题可以用来演示如何用python遍历字符串列表。题目:两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出三队赛手的名单。for a in ['x','y','z']: for b in ['x','y','z']: for c in ['x','y','z'...原创 2020-02-07 12:48:47 · 2558 阅读 · 0 评论