随笔分类 -  算法

摘要:一、什么是背包问题 0/1背包:有N件物品和一个最多能背重量为W 的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。每件物品只能用一次,求解将哪些物品装入背包里物品价值总和最大。 二、动态规划法求解0/1背包问题思路 每一件物品其实只有两个状态,取或者不取,所以可以使用回 阅读全文
posted @ 2022-01-09 20:13 光彩照人 阅读(848) 评论(0) 推荐(0) 编辑
摘要:1.leetcode 494题 //转换为0/1背包问题,求解在bagsize为某值的时候,有多少种组合方式,dp[j]表示在容量为j的情况下,有多少种组合方式 def findTargetSumWays(self, nums: List[int], target: int) -> int: sum 阅读全文
posted @ 2022-01-03 20:58 光彩照人 阅读(211) 评论(0) 推荐(0) 编辑
摘要:一、动态连通性(Dynamic Connectivity) Union-Find 算法(中文称并查集算法)是解决动态连通性(Dynamic Conectivity)问题的一种算法。动态连通性是计算机图论中的一种数据结构,动态维护图结构中相连信息。简单的说就是,图中各个节点之间是否相连、如何将两个节点 阅读全文
posted @ 2019-12-21 19:11 光彩照人 阅读(4111) 评论(0) 推荐(0) 编辑
摘要:log(n)时间复杂度快速求幂 阅读全文
posted @ 2019-03-22 16:46 光彩照人 编辑
摘要:一、二分查找法 对于一个非负数n,它的平方根不会小于大于(n/2+1)。在[0, n/2+1]这个范围内可以进行二分搜索,求出n的平方根。 二、牛顿迭代法 牛顿迭代法原理如下: 计算x2 = A的解,令f(x)=x2-A,相当于求解f(x)=0的解,如左图所示 首先找到一个x0初始点,如果x0不是最 阅读全文
posted @ 2019-03-22 10:06 光彩照人 编辑
摘要:1. 已知一随机发生器,产生0的概率是p,产生1的概率是1-p,现在要你构造一个发生器,使得它产生0和1的概率均为1/2 由题目有:0 : p1 : 1-p 连续产生两个数,其组合以及概率如下:00 : p201 : p*(1-p)10 : (1-p)*p11 : (1-p)2 可以发现 01 和 阅读全文
posted @ 2019-03-06 12:23 光彩照人 编辑
摘要:一、定义 二叉排序树(Binary Sort Tree)又称二叉查找树、二叉搜索树。 它或者是一棵空树;或者是具有下列性质的二叉树: (1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值; (2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值; (3)左、右子树也分别为二叉排序树 阅读全文
posted @ 2018-12-23 17:40 光彩照人 阅读(10450) 评论(1) 推荐(0) 编辑
摘要:基本思想 通过Dijkstra计算图G中的最短路径时,需要指定起点s(即从顶点s开始计算)。 此外,引进两个集合S和U。S的作用是记录已求出最短路径的顶点(以及相应的最短路径长度),而U则是记录还未求出最短路径的顶点(以及该顶点到起点s的距离)。 初始时,S中只有起点s;U中是除s之外的顶点,并且U 阅读全文
posted @ 2018-12-20 12:20 光彩照人 阅读(221) 评论(0) 推荐(0) 编辑
摘要:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10. 解析:该算法经典就经典到利用玩魔方的方 阅读全文
posted @ 2018-01-30 22:15 光彩照人 阅读(947) 评论(0) 推荐(0) 编辑
摘要:信号量与互斥锁之间的区别: 互斥量用于线程的互斥,信号线用于线程的同步。 这是互斥量和信号量的根本区别,也就是互斥和同步之间的区别。 互斥:是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的。 同步:是指在互斥的基础上(大多数情况) 阅读全文
posted @ 2018-01-29 10:21 光彩照人 阅读(3736) 评论(0) 推荐(0) 编辑
摘要:1.求一个数的所有约数 2.求两个数的最大公约数 3.最小公倍数 记住这个公式: x*y=最小公倍数*最大公约数 阅读全文
posted @ 2018-01-27 22:41 光彩照人 阅读(183) 评论(0) 推荐(0) 编辑
摘要:一、给一个列表,输出其中元素的所有组合情况,全排列问题。例如[1,2,3],一共有6中组合情况。 二、输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。 基本思想:就是两两元 阅读全文
posted @ 2018-01-27 13:13 光彩照人 阅读(152) 评论(0) 推荐(0) 编辑
摘要:一、最长公共子串(Longest Common Substring) 遍历的时候用一个二维数组存储相应位置的信息,如果两个子串1与子串2相应位置相等:则看各自前一个位置是否相等,相等则该位置值B[i][j]=B[i-1][j-1]+1,不相等则置为1。如果两个子串1与子串2相应位置不相等,则B[i] 阅读全文
posted @ 2018-01-25 19:16 光彩照人 阅读(232) 评论(0) 推荐(0) 编辑
摘要:注解:该方法是从第一个元素开始遍历,每遍历到一个元素就开始左右各放置一个指针,分别进行判断是否左右对称位置字符相等,一开始加一个#号,这样无论对于abbc(回文串为bb),还是abcbd,或者是a(单个),这样的都能统一处理了。时间复杂度大概为O(n^2) 阅读全文
posted @ 2018-01-24 22:26 光彩照人 阅读(160) 评论(0) 推荐(0) 编辑
摘要:1.给你一个数组,求一个k值,使得前k个数的方差 + 后面n-k个数的方差最小 ,时间复杂度可以到O(n)。 根据方差公式D(X)=E(x^2)-[E(X)]^2 2.给你一个只由0和1组成的字符串,找一个最长的子串,要求这个子串里面0和1的数目相等。 时间复杂度可以到O(n) 这样一种巧妙的解法: 阅读全文
posted @ 2018-01-23 10:45 光彩照人 阅读(10107) 评论(0) 推荐(0) 编辑
摘要:def maxProduct(arr): if len(arr)==1: return arr max_val=arr[0] min_val=arr[0] #用于保存最大乘积的结果 res=arr[0] for i in range(1,len(arr)): #保留上一次计算的最大值,以便带入下面求解三者最大值,如果没有t... 阅读全文
posted @ 2018-01-22 18:40 光彩照人 阅读(498) 评论(0) 推荐(0) 编辑
摘要:题目描述 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5 def deleteDuplication(head): if head is None: return None 阅读全文
posted @ 2018-01-01 17:25 光彩照人 阅读(236) 评论(0) 推荐(0) 编辑
摘要:题目描述: 风口之下,猪都能飞。当今中国股市牛市,真可谓“错过等七年”。 给你一个回顾历史的机会,已知一支股票连续n天的价格走势,以长度为n的整数数组表示,数组中第i个元素(prices[i])代表该股票第i天的股价。 假设你一开始没有股票,但有至多两次买入1股而后卖出1股的机会,并且买入前一定要先 阅读全文
posted @ 2017-12-22 17:30 光彩照人 阅读(221) 评论(0) 推荐(0) 编辑
摘要:这种方法速度比较快,其运算次数与输入n的大小无关,只与n中1的个数有关。如果n的二进制表示中有k个1,那么这个方法只需要循环k次即可。 其原理是不断清除n的二进制表示中最右边的1,同时计数器加1,直至n为0。 对于int 型32位的呢 int型32位表示范围为-2^31~2^31-1,最高位表示符号 阅读全文
posted @ 2017-12-22 15:28 光彩照人 阅读(541) 评论(0) 推荐(0) 编辑
摘要:ord('0')=48,ord('A')=65,ord('a')=97chr(65)='A' def str2Int(s): s=s.strip() if len(s)==0: return 0 dict_flag={'+':1,'-':-1} sum_,flag=0,1 if s[0] in di 阅读全文
posted @ 2017-12-21 16:51 光彩照人 阅读(1381) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示