随笔分类 -  数据结构与算法

摘要:Redis是一种键值(key Value)数据库,相对于关系型数据库,它也被叫作非关系型数据库 Redis中,键的数据类型是字符串,但是为了非富数据存储方式,方便开发者使用,值的数据类型有很多 字符串 (string) 这种数据类型非常简单,对应到数据结构里面,就是 字符串 列表 (list) 支持 阅读全文
posted @ 2019-11-05 10:54 james_cai 阅读(378) 评论(0) 推荐(0)
摘要:一个由1亿个数组成的集合M,数的范围从1~10亿 新来一个数n,如何快速且省内存地判断是否存在M中? 方法一: 将集合M的数用散列表保存,然后对数n判断是否在散列表中即可 消耗内存:假设一个数用4字节保存,1亿个数至少要381M内存,不过由于实际上由于有装载因子,散列冲突解决等,实际内存远远不止38 阅读全文
posted @ 2019-10-18 17:50 james_cai 阅读(1049) 评论(0) 推荐(1)
摘要:递归 广度优先搜索 深度优先搜索 二分 left, right = 0, len(array) 1 while left 阅读全文
posted @ 2019-10-09 18:19 james_cai 阅读(605) 评论(0) 推荐(0)
摘要:关键位运算 x & ( x) 取得最低位1 x & (x 1) 去掉最低位1 阅读全文
posted @ 2019-10-08 11:30 james_cai 阅读(247) 评论(0) 推荐(0)
摘要:什么是位运算 程序中所有数在计算机内存中都是以 二进制 的形式储存的。位运算就是直接对 整数 在内存中的二进制位进行操作。不需要转成十进制,因此处理 速度 非常快 常见操作 XOR 异或 x ^ 0 = x x ^ ~0 = ~x x ^ (~x) = 1s x ^ x = 0 a ^ b = c 阅读全文
posted @ 2019-10-08 09:44 james_cai 阅读(151) 评论(0) 推荐(0)
摘要:Trie树, 即字典树, 又称单词查找树或键树, 多叉树 基本性质 根节点不包含字符,除根节点外每一个节点都只包含一个字符 从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串 每个节点的所有子节点包含的字符都不相同 本质: 利用字符串之间的 公共前缀 ,将重复的前缀合并在一起 主要操 阅读全文
posted @ 2019-09-30 16:49 james_cai 阅读(277) 评论(0) 推荐(0)
摘要:``` n = 4 # 以4皇后举例 result = [] # 放置互斥的列、左斜线、右斜线信息 cols= set() pie = set() na = set() def dfs(row, state): if row >= n: result.append(state) for col in range(n): if col in cols or row + col in pie or r 阅读全文
posted @ 2019-09-30 15:52 james_cai 阅读(386) 评论(0) 推荐(0)
摘要:解法一: 数学归纳法 从n =1 n=2 n=x ,从小到大,发现规律。 解法二: DFS + 递归 字符号长度 2 n 暴力解法,结合栈 O(2 2n) 解法三: 解法二上改进 + 剪枝 O(2 n) 阅读全文
posted @ 2019-09-30 11:38 james_cai 阅读(106) 评论(0) 推荐(0)
摘要:关键词 双指针 占坑思想 阅读全文
posted @ 2019-09-27 15:21 james_cai 阅读(120) 评论(0) 推荐(0)
摘要:方法一,使用数组辅助 方法二,使用快慢指针 双指针 p 和 q 的话,当 q 指向末尾的 NULL, p 与 q 之间相隔的元素个数为 n 时,那么删除掉 p 的下一个指针就完成了要求。 设置虚拟节点 dummyHead 指向 head 设定双指针 p 和 q ,初始都指向虚拟节点 dummyHea 阅读全文
posted @ 2019-09-23 16:58 james_cai 阅读(170) 评论(0) 推荐(0)
摘要:定义 堆是一个完全二叉树 堆中每一个节点的值都必须大于等于(或小于等于)其子树中每个节点的值 如何存储一个堆 完全二叉树比较适合用数组来存储 数组中下标为 i 的节点的 左子节点: i 2 的节点 右子节点: i 2 + 1 的节点 父节点: i / 2 重要操作 插入一个数据: 新插入数据放到数组 阅读全文
posted @ 2019-09-23 15:51 james_cai 阅读(1222) 评论(0) 推荐(1)
摘要:你有一排书架,有空时会拿些书来看,经常性会买些新书。无奈书架容量有限,当新买的书放不下时,需要一个策略将旧书淘汰。 LRU(最近最少使用)缓存淘汰机制正合适。 1)新买的书放在最左侧。 2)最近常看的书也放在最左侧。 久而久之,越往右边的书越是长时间没看,当有新书时,就从右侧淘汰起。Perfect。 阅读全文
posted @ 2019-09-23 10:57 james_cai 阅读(247) 评论(0) 推荐(0)
摘要:解法1:递归 +备忘录 自顶向下 解法2:动态规划 自底向上 阅读全文
posted @ 2019-09-20 16:43 james_cai 阅读(197) 评论(0) 推荐(0)
摘要:思考: 由于乘法的特殊性,所以nums上每一位的乘积最大值(不论正负),都只与前一个值能达到的最大值(当前数字为正)和最小值(当前数位为负)有关系。 nums = [2,3, 2,4] imin ,imax =1,1 max_product = float(' inf') for num in nu 阅读全文
posted @ 2019-09-19 16:30 james_cai 阅读(525) 评论(1) 推荐(1)
摘要:将nums数组当成是一个赌徒连续几天的输赢情况。 如果昨天赢钱了 =0 ,那今天无论输赢,之后都有可能赢更多钱。所以记住昨天 如果昨天输钱了 int: size = len(nums) dp = [0] size dp[0] = nums[0] for i in range(1,size): if 阅读全文
posted @ 2019-09-19 09:38 james_cai 阅读(115) 评论(0) 推荐(0)
摘要:N = 7 paths = [[1,2],[2,3],[3,4],[4,1],[1,3],[2,4],[5,6],[5,7],[6,7]] res = [0] (N + 1) G = [ [] for _ in range(N + 1)] 使用邻接表存放每个花园与其它花园连接的信息 for x ,y 阅读全文
posted @ 2019-09-16 10:45 james_cai 阅读(284) 评论(0) 推荐(0)
摘要:解题思路,有些类似于在电影院忘了自己是在第几排,就问前一排的人,前一排也不知道,再问前前排。如此一直问到第一排。第一排肯定知道自己是第一排。 然后第二排在第一排的答案上加1。如此经过一递一归,就能求出当前自己是在第几排了。 递归最重要的是想好终止条件。及在每一个递归过程中,自己应该做什么(每个递归过 阅读全文
posted @ 2019-09-06 09:34 james_cai 阅读(335) 评论(0) 推荐(0)
摘要:给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回滑动窗口中的最大值。 阅读全文
posted @ 2019-09-05 11:26 james_cai 阅读(806) 评论(0) 推荐(0)
摘要:长度 联想到下标 有效括号 联想到栈 最长 要对长度态判断 阅读全文
posted @ 2019-09-02 12:07 james_cai 阅读(627) 评论(0) 推荐(0)
摘要:利用栈后进先出的特性解决 阅读全文
posted @ 2019-09-02 10:40 james_cai 阅读(161) 评论(0) 推荐(0)