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

数组-> 链表-> 哈希表->字符串->栈与队列-> 树->回溯->贪心->动态规划->图论->高级数据结构
摘要:503. 下一个更大元素 II 思路 可以使用单调栈解决本题。 单调栈中保存的是下标,从栈底到栈顶的下标在数组 nums 中对应的值是单调不升的。 每次我们移动到数组中的一个新的位置 i,我们就将当前单调栈中所有对应值小于 nums[i] 的下标弹出单调栈,这些值的下一个更大元素即为 nums[i] 阅读全文
posted @ 2022-03-22 16:17 当康 阅读(70) 评论(0) 推荐(0)
摘要:128. 最长连续序列 思路 方法1 最朴素的解法 先排序,从前往后找最长连续上升序列,但是复杂度已经至少有O(nlogn)。 方法2 哈希集合 外层需要枚举 O(n),只有当一个数是连续序列的第一个数的情况下才会进入内层循环 方法3 动态规划 哈希表记录连续区间长度 遍历nums数组中的所有数字n 阅读全文
posted @ 2022-03-21 23:56 当康 阅读(95) 评论(0) 推荐(0)
摘要:1、只用2GB内存在20亿个整数中找到出现次数最多的数 初级进阶: 40亿个整数 高级进阶: 80亿个整数 思路 想要在很多整数中找到出现次数最多的数,通常的做法是使用哈希表对出现的每一个数做词频统计。 哈希表的key需要占用4B,value也是4B。 本题共有20亿个数,用32位的整数就可以表示其 阅读全文
posted @ 2022-03-14 22:30 当康 阅读(1031) 评论(0) 推荐(0)
摘要:问题 认识布隆过滤器 布隆过滤器 (Bloom Filter)是由Burton Howard Bloom于1970年提出,它是一种space efficient的概率型数据结构,用于判断一个元素是否在集合中。在垃圾邮件过滤的黑白名单方法、爬虫(Crawler)的网址判重模块中等等经常被用到。哈希表也 阅读全文
posted @ 2022-03-14 17:56 当康 阅读(262) 评论(0) 推荐(0)
摘要:剑指 Offer 20. 表示数值的字符串 思路 确定有限状态自动机 确定有限状态自动机(以下简称「自动机」)是一类计算模型。它包含一系列状态,这些状态中: 有一个特殊的状态,被称作「初始状态」。 还有一系列状态被称为「接受状态」,它们组成了一个特殊的集合。其中,一个状态可能既是「初始状态」,也是「 阅读全文
posted @ 2022-02-24 18:30 当康 阅读(227) 评论(0) 推荐(0)
摘要:1447. 最简分数 思路 欧几里得算法 问题转化为:如何快速判断两个数组成的分数是否为最简(即判断两个数的最大公约数是否为 1)。 快速求得 a 和 b 的最大公约数的主要方式有两种 :「更相减损法」和「欧几里得算法」,其中「欧几里得算法」的递归实现最为好写。 代码 class Solution 阅读全文
posted @ 2022-02-10 13:35 当康 阅读(146) 评论(0) 推荐(0)
摘要:384. 打乱数组 思路 洗牌算法 共有 n 个不同的数,根据每个位置能够选择什么数,共有 n! 种组合。 题目要求每次调用 shuffle 时等概率返回某个方案,或者说每个元素都够等概率出现在每个位置中。 我们可以使用 Knuth 洗牌算法,在 O(n) 复杂度内等概率返回某个方案。 从前往后尝试 阅读全文
posted @ 2021-11-22 12:00 当康 阅读(131) 评论(0) 推荐(0)
摘要:229. 求众数 II 思路 方法一:哈希统计 用哈希统计数组中每个元素出现的次数。 方法二:摩尔投票法 摩尔投票法:摩尔投票法的核心思想为对拼消耗。首先我们考虑最基本的摩尔投票问题,比如找出一组数字序列中出现次数大于总数一半的数字(并且假设这个数字一定存在)。我们可以直接利用反证法证明这样的数字只 阅读全文
posted @ 2021-10-22 12:54 当康 阅读(2475) 评论(0) 推荐(2)
摘要:50. Pow(x, n) 思路 不用递归 设 res=1,则初始状态 xn = xn × res 。 在循环二分时,每当 n 为奇数时,将多出的一项 x 乘入 res ,则最终可化至 xn = x0 × res = res ,返回 res。 代码 class Solution { public d 阅读全文
posted @ 2021-10-12 23:30 当康 阅读(167) 评论(0) 推荐(0)
摘要:位运算操作 右移操作 >> 将一个运算对象的各二进制位全部右移若干位: 正数左补0,负数左补1,右边丢弃 一个数右移1位,相当于该数除以2 左移操作 << 将一个运算对象的各二进制位全部左移若干位: 左边的二进制位丢弃,右边补0 一个数左移1位,相当于该数乘以2 与操作& 一个数与1,相当于判断末位 阅读全文
posted @ 2021-10-02 20:41 当康 阅读(142) 评论(0) 推荐(0)
摘要:208. 实现 Trie (前缀树) Trie(发音类似 "try")或者说前缀树是一种树形数据结构,用于高效地存储和检索字符串数据集中的键。这一数据结构有相当多的应用情景,例如自动补完和拼写检查。 请你实现 Trie 类: Trie() 初始化前缀树对象 void insert(String wo 阅读全文
posted @ 2021-08-25 17:03 当康 阅读(168) 评论(0) 推荐(0)
摘要:300. 最长递增子序列 思路 最长上升子序列是动规的经典题目。 dp[i]的定义 dp[i]表示i之前包括i的最长上升子序列。 状态转移方程 位置i的最长升序子序列等于j从0到i-1各个位置的最长升序子序列 + 1 的最大值。 所以:if (nums[i] > nums[j]) dp[i] = m 阅读全文
posted @ 2021-08-18 16:08 当康 阅读(105) 评论(0) 推荐(0)
摘要:121. 买卖股票的最佳时机 思路 贪心 因为股票就买卖一次,那么贪心自然就是取最左最小值,取最右最大值,那么得到的差值就是最大利润。 动态规划 确定dp数组(dp table)以及下标的含义 dp[i][0] 表示第i天持有股票所得现金(一开始现金是0,那么加入第i天买入股票现金就是 -price 阅读全文
posted @ 2021-08-12 15:18 当康 阅读(327) 评论(0) 推荐(0)
摘要:198. 打家劫舍 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。 给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃 阅读全文
posted @ 2021-08-11 23:41 当康 阅读(58) 评论(0) 推荐(0)
摘要:139. 单词拆分 给定一个非空字符串 s 和一个包含非空单词的列表 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。 说明: 拆分时可以重复使用字典中的单词。 你可以假设字典中没有重复的单词。 输入: s = "leetcode", wordDict = ["leet 阅读全文
posted @ 2021-08-09 00:03 当康 阅读(123) 评论(0) 推荐(0)
摘要:322. 零钱兑换 给你一个整数数组coins,表示不同面额的硬币;以及一个整数amount,表示总金额。 计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回-1。 你可以认为每种硬币的数量是无限的。 输入:coins = [1, 2, 5], amount 阅读全文
posted @ 2021-08-06 17:43 当康 阅读(103) 评论(0) 推荐(0)
摘要:518. 零钱兑换 II 给你一个整数数组coins表示不同面额的硬币,另给一个整数amount表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带符号整数。 输入:amount = 阅读全文
posted @ 2021-08-04 09:57 当康 阅读(181) 评论(0) 推荐(0)
摘要:完全背包 有N件物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。每件物品都有无限个(也就是可以放入背包多次),求解将哪些物品装入背包里物品价值总和最大。 完全背包和01背包问题唯一不同的地方就是,每种物品有无限件。 例子 背包最大重量为4。 物 阅读全文
posted @ 2021-07-27 19:33 当康 阅读(113) 评论(0) 推荐(0)
摘要:474. 一和零 给你一个二进制字符串数组strs和两个整数m和n。 请你找出并返回strs的最大子集的大小,该子集中最多有m个0和n个1。 如果x的所有元素也是y的元素,集合x是集合y的子集。 输入:strs = ["10", "0001", "111001", "1", "0"], m = 5, 阅读全文
posted @ 2021-07-25 19:43 当康 阅读(71) 评论(0) 推荐(0)
摘要:494. 目标和 给你一个整数数组nums和一个整数target。 向数组中的每个整数前添加 '+' 或 '-' ,然后串联起所有整数,可以构造一个表达式 : 例如,nums = [2, 1] ,可以在 2 之前添加 '+' ,在 1 之前添加 '-' ,然后串联起来得到表达式 "+2-1" 。 返 阅读全文
posted @ 2021-07-13 19:18 当康 阅读(126) 评论(0) 推荐(0)