算法
对一些经典的算法题写出自己的一些理解
酱油瓶啤酒杯
这个作者很懒,什么都没留下…
展开
-
算法-Stone Game V-石子游戏/阿里笔试0322
几块石子 排成一行 ,每块石子都有一个关联值,关联值为整数,由数组 stoneValue 给出。游戏中的每一轮:Alice 会将这行石子分成两个 非空行(即,左侧行和右侧行);Bob 负责计算每一行的值,即此行中所有石子的值的总和。Bob 会丢弃值最大的行,Alice 的得分为剩下那行的值(每轮累加)。如果两行的值相等,Bob 让 Alice 决定丢弃哪一行。下一轮从剩下的那一行开始。只 剩下一块石子 时,游戏结束。Alice 的分数最初为 0 。返回 Alice 能够获得的最大分数 。原创 2021-03-26 09:28:24 · 306 阅读 · 0 评论 -
2019百度之星开发者大赛-复盘
进决赛时是前十名,之后因为队员的安排没有去北京参加路演答辩1、比赛介绍面向AI爱好者的深度学习算法竞赛——百度之星-开发者大赛,总之是为有创新力、专业性、团队合作精神和极客精神的顶级开发者团队提供真实的数据集+深度学习飞桨平台+一站式深度学习开发平台AI Studio模型小型化技术成为最近几年学术界和工业界研究的热点,模型小型化技术也从最开始的网络剪枝、知识蒸馏、参数量化等发展为最新的神经网络架构搜索(NAS)和自动模型压缩等技术。目标检测任务要找出图像中所有感兴趣的目标,确定它..原创 2021-03-16 10:27:42 · 580 阅读 · 0 评论 -
算法-堆排序-原理与Java代码实现
以大顶堆举例:1、首先用构造一个初始的大顶堆2、然后将堆顶和堆尾的一个元素交换,交换后的队尾元素加入排序队列尾3,重新构建堆4,重复步骤2-3理解上就是每次选取堆的最大值,之后将最大值删除,重构堆再重复以上操作在Java中我们常用优先队列构建大顶堆和小顶堆PriorityQueue<Integer> pq = new PriorityQueue<>();在后边的括号中使用Lamba表达式调整大顶堆和小顶堆使用代码实现一个堆排序如下package so原创 2021-03-10 09:45:29 · 120 阅读 · 0 评论 -
算法-尽可能使字符串相等-滑动窗口
1、题目描述给你两个长度相同的字符串,s 和 t。将 s 中的第 i 个字符变到 t 中的第 i 个字符需要 |s[i] - t[i]| 的开销(开销可能为 0),也就是两个字符的 ASCII 码值的差的绝对值。用于变更字符串的最大预算是 maxCost。在转化字符串时,总开销应当小于等于该预算,这也意味着字符串的转化可能是不完全的。如果你可以将 s 的子字符串转化为它在 t 中对应的子字符串,则返回可以转化的最大长度。如果 s 中没有子字符串可以转化成 t 中对应的子字符串,则返回 0。-原创 2021-02-05 22:28:10 · 158 阅读 · 0 评论 -
算法-相似字符串组-并查集
leetcode 839,2021.01.31每日一题原创 2021-01-31 20:29:35 · 294 阅读 · 1 评论 -
算法-保证图可完全遍历-并查集
1、题目介绍Alice 和 Bob 共有一个无向图,其中包含 n 个节点和 3 种类型的边:类型 1:只能由 Alice 遍历。类型 2:只能由 Bob 遍历。类型 3:Alice 和 Bob 都可以遍历。给你一个数组 edges ,其中 edges[i] = [typei, ui, vi] 表示节点 ui 和 vi 之间存在类型为 typei 的双向边。请你在保证图仍能够被 Alice和 Bob 完全遍历的前提下,找出可以删除的最大边数。如果从任何节点开始,Alice 和 Bob 都可以到达原创 2021-01-27 19:16:06 · 238 阅读 · 0 评论 -
《剑指Offer》Java实现版-电子科大-2021最新
LeetCode-剑指offer-全1、03数组中重复的数字找出数组中重复的数字。在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。示例 1:输入:[2, 3, 1, 0, 2, 5, 3]输出:2 或 3 限制:2 <= n <= 100000/*我的思路:1、暴力解答,两层for循环,直接超时警告 n^22、使用额外的数组来模拟原创 2021-01-14 19:52:06 · 1254 阅读 · 1 评论 -
算法-Binary Prefix Divisible By 5-可被 5 整除的二进制前缀
LeetCode-1018-每日一题2021.01.14原创 2021-01-14 13:24:04 · 178 阅读 · 0 评论 -
算法-Redundant Connection-冗余连接
1、题目介绍在本问题中, 树指的是一个连通且无环的无向图。输入一个图,该图由一个有着N个节点 (节点值不重复1, 2, ..., N) 的树及一条附加的边构成。附加的边的两个顶点包含在1到N中间,这条附加的边不属于树中已存在的边。结果图是一个以边组成的二维数组。每一个边的元素是一对[u, v] ,满足 u < v,表示连接顶点u 和v的无向图的边。返回一条可以删去的边,使得结果图是一个有着N个节点的树。如果有多个答案,则返回二维数组中最后出现的边。答案边 [u, v] 应满足相同的格式 u &原创 2021-01-13 15:59:28 · 246 阅读 · 0 评论 -
算法-Course Schedule-课程表
1、题目描述你这个学期必须选修 numCourse 门课程,记为 0 到 numCourse-1 。在选修某些课程之前需要一些先修课程。 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们:[0,1]给定课程总量以及它们的先决条件,请你判断是否可能完成所有课程的学习? 示例 1:输入: 2, [[1,0]] 输出: true解释: 总共有 2 门课程。学习课程 1 之前,你需要完成课程 0。所以这是可能的。2、题目分析修一门课之前需要满足这门课的先修课程已经原创 2021-01-12 10:04:39 · 403 阅读 · 0 评论 -
算法-Summary Ranges-汇总区间
1、题目描述给定一个无重复元素的有序整数数组 nums 。返回 恰好覆盖数组中所有数字 的 最小有序 区间范围列表。也就是说,nums 的每个元素都恰好被某个区间范围所覆盖,并且不存在属于某个范围但不属于 nums 的数字 x 。列表中的每个区间范围 [a,b] 应该按如下格式输出:"a->b" ,如果 a != b"a" ,如果 a == b 示例 1:输入:nums = [0,1,2,4,5,7]输出:["0->2","4->5","7"]解释:区间范围是:[0原创 2021-01-11 10:16:27 · 117 阅读 · 0 评论 -
算法-Best Time to Buy and Sell Stock III-买卖股票的最佳时机III
1、题目描述给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。设计一个算法来计算你所能获取的最大利润。你最多可以完成 两笔 交易。注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。示例 1:输入:prices = [3,3,5,0,0,3,1,4]输出:6解释:在第 4 天(股票价格 = 0)的时候买入,在第 6 天(股票价格 = 3)的时候卖出,这笔交易所能获得利润 = 3-0 = 3 。随后,在第 7 天(股票价格 = 1)的时候买入,在第 8 天 (原创 2021-01-09 20:00:08 · 120 阅读 · 0 评论 -
算法-Evaluate Division-除法求值
1、题目描述给你一个变量对数组 equations 和一个实数值数组 values 作为已知条件,其中 equations[i] = [Ai, Bi] 和 values[i] 共同表示等式 Ai / Bi = values[i] 。每个 Ai 或 Bi 是一个表示单个变量的字符串。另有一些以数组 queries 表示的问题,其中 queries[j] = [Cj, Dj] 表示第 j 个问题,请你根据已知条件找出 Cj / Dj = ? 的结果作为答案。返回 所有问题的答案 。如果存在某个无法确定的答原创 2021-01-06 13:52:10 · 199 阅读 · 0 评论 -
算法-Positions of Large Groups-较大分组的位置
1、题目描述在一个由小写字母构成的字符串 s 中,包含由一些连续的相同字符所构成的分组。例如,在字符串 s = "abbxxxxzyy" 中,就含有 "a", "bb", "xxxx", "z" 和 "yy" 这样的一些分组。分组可以用区间 [start, end] 表示,其中 start 和 end 分别表示该分组的起始和终止位置的下标。上例中的 "xxxx" 分组用区间表示为 [3,6] 。我们称所有包含大于或等于三个连续字符的分组为 较大分组 。找到每一个 较大分组 的区间,按起始位置下标递原创 2021-01-05 09:04:03 · 250 阅读 · 0 评论 -
算法-Can Place Flowers-种花问题
1、题目描述假设有一个很长的花坛,一部分地块种植了花,另一部分却没有。可是,花不能种植在相邻的地块上,它们会争夺水源,两者都会死去。给你一个整数数组 flowerbed 表示花坛,由若干 0 和 1 组成,其中 0 表示没种植花,1 表示种植了花。另有一个数 n ,能否在不打破种植规则的情况下种入 n 朵花?能则返回 true ,不能则返回 false。示例 1:输入:flowerbed = [1,0,0,0,1], n = 1输出:true2、题目分析在最左端如果有两个连续的0,那么原创 2021-01-02 13:30:23 · 236 阅读 · 0 评论 -
算法-Sliding Window Maximum-滑动窗口最大值
1、题目描述给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。返回滑动窗口中的最大值。示例 1:输入:nums = [1,3,-1,-3,5,3,6,7], k = 3输出:[3,3,5,5,6,7]解释:滑动窗口的位置 最大值--------------- -----[1 3 -1] -3 5 3 6 7原创 2021-01-02 13:06:33 · 143 阅读 · 0 评论 -
算法-Last Stone Weight-最后一块石头的重量
1、题目描述有一堆石头,每块石头的重量都是正整数。每一回合,从中选出两块 最重的 石头,然后将它们一起粉碎。假设石头的重量分别为 x 和 y,且 x <= y。那么粉碎的可能结果如下:如果 x == y,那么两块石头都会被完全粉碎;如果 x != y,那么重量为 x 的石头将会完全粉碎,而重量为 y 的石头新重量为 y-x。最后,最多只会剩下一块石头。返回此石头的重量。如果没有石头剩下,就返回 0。示例:输入:[2,7,4,1,8,1]输出:1解释:先选出 7 和 8,得到 1,原创 2020-12-30 10:05:19 · 230 阅读 · 0 评论 -
算法-Patching Array-按要求补齐数组
1、题目描述给定一个已排序的正整数数组 nums,和一个正整数 n 。从 [1, n] 区间内选取任意个数字补充到 nums 中,使得 [1, n] 区间内的任何数字都可以用 nums 中某几个数字的和来表示。请输出满足上述要求的最少需要补充的数字个数。示例 1:输入: nums = [1,3], n = 6输出: 1 解释:根据 nums 里现有的组合 [1], [3], [1,3],可以得出 1, 3, 4。现在如果我们将 2 添加到 nums 中, 组合变为: [1], [2], [3原创 2020-12-29 13:20:36 · 155 阅读 · 0 评论 -
算法-Assign Cookies-分发饼干
1、题目介绍假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。对每个孩子 i,都有一个胃口值 g[i],这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j,都有一个尺寸 s[j] 。如果 s[j] >= g[i],我们可以将这个饼干 j 分配给孩子 i ,这个孩子会得到满足。你的目标是尽可能满足越多数量的孩子,并输出这个最大数值。 示例 1:输入: g = [1,2,3], s = [1,1]输出: 1解释: 你有三个孩子和两块小饼干,3个原创 2020-12-25 10:16:40 · 87 阅读 · 0 评论 -
算法-Candy-分发糖果
1、题目介绍老师想给孩子们分发糖果,有 N 个孩子站成了一条直线,老师会根据每个孩子的表现,预先给他们评分。你需要按照以下要求,帮助老师给这些孩子分发糖果:每个孩子至少分配到 1 个糖果。相邻的孩子中,评分高的孩子必须获得更多的糖果。那么这样下来,老师至少需要准备多少颗糖果呢?示例 1:输入: [1,0,2]输出: 5解释: 你可以分别给这三个孩子分发 2、1、2 颗糖果。2、题目分析每个孩子都会得到至少一个糖果,则用辅助数组来表示每个孩子得到的糖果数相邻,包括左邻居和右邻居,原创 2020-12-24 09:52:56 · 269 阅读 · 1 评论 -
算法-First Unique Character in a String-字符串中的第一个唯一字符
1、题目描述给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。示例:s = "leetcode"返回 0s = "loveleetcode"返回 22、题目分析与以往的题目不同,这个是找唯一的字符,那就需要遍历完成之后再二次遍历首先考虑使用HashMap,再考虑使用字典第一次遍历统计各个字符出现的次数,第二次遍历找仅出现一次的那个字符3、代码实现 public int firstUniqChar1(String s) {原创 2020-12-23 09:51:08 · 192 阅读 · 0 评论 -
算法-Min Cost Climbing Stairs-使用最小的花费爬楼梯
1、题目描述数组的每个索引作为一个阶梯,第 i个阶梯对应着一个非负数的体力花费值 cost[i](索引从0开始)。每当你爬上一个阶梯你都要花费对应的体力花费值,然后你可以选择继续爬一个阶梯或者爬两个阶梯。您需要找到达到楼层顶部的最低花费。在开始时,你可以选择从索引为 0 或 1 的元素作为初始阶梯。示例 1:输入: cost = [10, 15, 20]输出: 15解释: 最低花费是从cost[1]开始,然后走两步即可到阶梯顶,一共花费15。示例 2:输入: cost = [1, 10原创 2020-12-21 16:34:14 · 161 阅读 · 0 评论 -
算法-Remove Duplicate Letters-去除重复字母
1、题目描述给你一个字符串 s ,请你去除字符串中重复的字母,使得每个字母只出现一次。需保证 返回结果的字典序最小(要求不能打乱其他字符的相对位置)。示例:输入:s = "bcabc"输出:"abc"2、题目分析首先每个字母都不能重复,也就是所有字母有且只保留一个其次,返回结果的字典序最小。这就要求去除重复字母的位置要有技巧,遇到一个新字符 如果比栈顶小 并且在新字符后面还有和栈顶一样的 就把栈顶的字符抛弃了首先,考虑使用栈来解决这个问题,当栈空的时候入栈先比较当前入栈元素与栈顶的元原创 2020-12-20 13:50:31 · 591 阅读 · 3 评论 -
算法-Word Pattern-单词规律
1、题目描述给定一种规律 pattern 和一个字符串 str ,判断 str 是否遵循相同的规律。这里的 遵循 指完全匹配,例如, pattern 里的每个字母和字符串 str 中的每个非空单词之间存在着双向连接的对应规律。示例1:输入: pattern = "abba", str = "dog cat cat dog"输出: true2、题目分析一个字符串对应一个字母,也就是"一一对应"的关系用什么数据结构处理这种关系最合适?当然是HashMap,一个键对应一个值用空格分离的字符原创 2020-12-16 10:09:33 · 282 阅读 · 0 评论 -
算法-Monotone Increasing Digits-单调递增的数字
1、题目描述给定一个非负整数 N,找出小于或等于 N 的最大的整数,同时这个整数需要满足其各个位数上的数字是单调递增。(当且仅当每个相邻位数上的数字 x 和 y 满足 x <= y 时,我们称这个整数是单调递增的。)示例 1:输入: N = 10输出: 9示例 2:输入: N = 1234输出: 1234示例 3:输入: N = 332输出: 2992、题目分析递增的数字是什么?前一位的要小于等于后一位的当数字只有一位的时候,本身就是递增的数字当数字是递增的时候原创 2020-12-15 17:30:47 · 175 阅读 · 0 评论 -
算法-Group Anagrams-字母异位词分组
1、题目描述给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。示例:输入: ["eat", "tea", "tan", "ate", "nat", "bat"]输出:[ ["ate","eat","tea"], ["nat","tan"], ["bat"]]说明:所有输入均为小写字母。不考虑答案输出的顺序。2、题目分析题目的关键在于如何判断同分异构词刚开始的思路是用字典来判断,但这样复杂度太高,超时使用HashMap来判断,异位原创 2020-12-14 10:44:13 · 129 阅读 · 0 评论 -
算法-Contains Duplicate-存在重复元素
1、题目描述给定一个整数数组,判断是否存在重复元素。如果任意一值在数组中出现至少两次,函数返回 true 。如果数组中每个元素都不相同,则返回 false 。示例 1:输入: [1,2,3,1]输出: true2、问题分析用字典模拟哈希整数范围太大了,直接使用HashSetboolean put(Object value)3、代码实现 public boolean containsDuplicate(int[] nums) { Set<Integer&原创 2020-12-13 08:50:44 · 130 阅读 · 0 评论 -
算法-Wiggle Subsequence-摆动序列
1、问题描述如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为摆动序列。第一个差(如果存在的话)可能是正数或负数。少于两个元素的序列也是摆动序列。 例如, [1,7,4,9,2,5] 是一个摆动序列,因为差值 (6,-3,5,-7,3) 是正负交替出现的。相反, [1,4,7,2,5] 和 [1,7,4,5,5] 不是摆动序列,第一个序列是因为它的前两个差值都是正数,第二个序列是因为它的最后一个差值为零。给定一个整数序列,返回作为摆动序列的最长子序列的长度。 通过从原始序列中删除一原创 2020-12-12 13:39:29 · 115 阅读 · 0 评论 -
算法-Dota2 Senate-Dota2参议院
1、题目描述Dota2 的世界里有两个阵营:Radiant(天辉)和 Dire(夜魇)Dota2 参议院由来自两派的参议员组成。现在参议院希望对一个 Dota2 游戏里的改变作出决定。他们以一个基于轮为过程的投票进行。在每一轮中,每一位参议员都可以行使两项权利中的一项:1)禁止一名参议员的权利:参议员可以让另一位参议员在这一轮和随后的几轮中丧失所有的权利。2)宣布胜利:如果参议员发现有权利投票的参议员都是同一个阵营的,他可以宣布胜利并决定在游戏中的有关变化。给定一个字符串代表每个参议员的阵营。原创 2020-12-11 09:51:32 · 172 阅读 · 0 评论 -
算法 - 股票买卖 // 一窝端
算法 - 股票买卖 // 一窝端1、通用问题的描述//188. 买卖股票的最佳时机 IV给定一个整数数组 prices ,它的第 i 个元素 prices[i] 是一支给定的股票在第 i 天的价格。设计一个算法来计算你所能获取的最大利润。你最多可以完成 k 笔交易。注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。//示例 1:输入:k = 2, prices = [2,4,1]输出:2解释:在第 1 天 (股票价格 = 2) 的时候买入,在第 2 天 (股票价格 =原创 2020-12-10 19:29:36 · 113 阅读 · 2 评论 -
算法 - Lemonade Change-柠檬水找零
1、题目描述在柠檬水摊上,每一杯柠檬水的售价为 5 美元。顾客排队购买你的产品,(按账单 bills 支付的顺序)一次购买一杯。每位顾客只买一杯柠檬水,然后向你付 5 美元、10 美元或 20 美元。你必须给每个顾客正确找零,也就是说净交易是每位顾客向你支付 5 美元。注意,一开始你手头没有任何零钱。如果你能给每位顾客正确找零,返回 true ,否则返回 false 。示例 1:输入:[5,5,5,10,20]输出:true解释:前 3 位顾客那里,我们按顺序收取 3 张 5 美元的钞原创 2020-12-10 15:33:30 · 154 阅读 · 0 评论 -
算法-Unique Paths-不同路径
算法-Unique Paths不同路径1、题目描述一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。问总共有多少条不同的路径?2、题目分析经典的动态规划模板题,简单难度dp[i] [j]表示从(0,0)位置走到(i,j)位置的路径数量初始状态是第一列和第一行,因为机器人只会向下和向右走,所以只有一种情况动态规划方程 dp[i] [j] =原创 2020-12-09 11:50:56 · 159 阅读 · 0 评论 -
算法-Split Array into Fibonacci Sequence-数组拆分斐波那契数列
将数组拆分成斐波那契序列1、题目描述给定一个数字字符串 S,比如 S = "123456579",我们可以将它分成斐波那契式的序列 [123, 456, 579]。形式上,斐波那契式序列是一个非负整数列表 F,且满足:0 <= F[i] <= 2^31 - 1,(也就是说,每个整数都符合 32 位有符号整数类型);F.length >= 3;对于所有的0 <= i < F.length - 2,都有 F[i] + F[i+1] = F[i+2] 成立。另外,请注意原创 2020-12-08 10:48:44 · 185 阅读 · 0 评论 -
算法-Score After Flipping Matrix-翻转矩阵后的得分
算法-Score After Flipping Matrix-翻转矩阵后的得分1、题目描述有一个二维矩阵 A 其中每个元素的值为 0 或 1 。移动是指选择任一行或列,并转换该行或列中的每一个值:将所有 0 都更改为 1,将所有 1 都更改为 0。在做出任意次数的移动后,将该矩阵的每一行都按照二进制数来解释,矩阵的得分就是这些数字的总和。返回尽可能高的分数。示例:输入:[[0,0,1,1],[1,0,1,0],[1,1,0,0]]输出:39解释:转换为 [[1,1,1,1],[1,0,原创 2020-12-07 09:33:16 · 163 阅读 · 1 评论