
数据结构和算法
qq_长期不在
这个作者很懒,什么都没留下…
展开
-
Leetcode 每日一题——649. Dota2 参议院
649. Dota2 参议院Dota2 的世界里有两个阵营:Radiant(天辉)和 Dire(夜魇)Dota2 参议院由来自两派的参议员组成。现在参议院希望对一个 Dota2 游戏里的改变作出决定。他们以一个基于轮为过程的投票进行。在每一轮中,每一位参议员都可以行使两项权利中的一项:禁止一名参议员的权利:参议员可以让另一位参议员在这一轮和随后的几轮中丧失所有的权利。宣布胜利:如果参议员发现有权利投票的参议员都是同一个阵营的,他可以宣布胜利并决定在游戏中的有关变化。给定一个字符串代表每个参议原创 2020-12-11 10:28:56 · 233 阅读 · 0 评论 -
Leetcode 每日一题——860. 柠檬水找零
860. 柠檬水找零在柠檬水摊上,每一杯柠檬水的售价为 5 美元。顾客排队购买你的产品,(按账单 bills 支付的顺序)一次购买一杯。每位顾客只买一杯柠檬水,然后向你付 5 美元、10 美元或 20 美元。你必须给每个顾客正确找零,也就是说净交易是每位顾客向你支付 5 美元。注意,一开始你手头没有任何零钱。如果你能给每位顾客正确找零,返回 true ,否则返回 false 。该题由于要找零的范围很小,所以用if判断就可以解决了,具体代码如下(C++版):class Solution {p原创 2020-12-10 09:19:27 · 263 阅读 · 0 评论 -
Leetcode 每日一题——62. 不同路径
62. 不同路径一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。问总共有多少条不同的路径?该题是比较经典的动态规划题,下面是C++的代码:class Solution {public: int uniquePaths(int m, int n) { vector<vector<int>> DP(m,vector原创 2020-12-09 09:08:52 · 243 阅读 · 1 评论 -
Leetcode 每日一题——861. 翻转矩阵后的得分
Leetcode 每日一题——861. 翻转矩阵后的得分有一个二维矩阵 A 其中每个元素的值为 0 或 1 。移动是指选择任一行或列,并转换该行或列中的每一个值:将所有 0 都更改为 1,将所有 1 都更改为 0。在做出任意次数的移动后,将该矩阵的每一行都按照二进制数来解释,矩阵的得分就是这些数字的总和。返回尽可能高的分数。该题目的算法思路是先保证首节点都是1的情况下每列有尽可能多的1,具体代码如下(C++版):class Solution {public: int matrixSc原创 2020-12-07 09:35:44 · 242 阅读 · 0 评论 -
Leetcode 每日一题——118. 杨辉三角
118. 杨辉三角给定一个非负整数 numRows,生成杨辉三角的前 numRows 行。在杨辉三角中,每个数是它左上方和右上方的数的和。该题直接模拟求解就可以,下面是C++的实现:class Solution {public: vector<vector<int>> generate(int numRows) { if(numRows==0) return {}; if(numRows==1) return {{1}};原创 2020-12-06 10:45:59 · 137 阅读 · 0 评论 -
Leetcode 每日一题——621. 任务调度器
621. 任务调度器给你一个用字符数组 tasks 表示的 CPU 需要执行的任务列表。其中每个字母表示一种不同种类的任务。任务可以以任意顺序执行,并且每个任务都可以在 1 个单位时间内执行完。在任何一个单位时间,CPU 可以完成一个任务,或者处于待命状态。然而,两个 相同种类 的任务之间必须有长度为整数 n 的冷却时间,因此至少有连续 n 个单位时间内 CPU 在执行不同的任务,或者在待命状态。你需要计算完成所有任务所需要的 最短时间 。该题可以使用排序的方法进行模拟,具体代码如下(C++版):原创 2020-12-05 10:56:16 · 195 阅读 · 0 评论 -
Leetcode 每日一题——659. 分割数组为连续子序列
659. 分割数组为连续子序列给你一个按升序排序的整数数组 num(可能包含重复数字),请你将它们分割成一个或多个子序列,其中每个子序列都由连续整数组成且长度至少为 3 。如果可以完成上述分割,则返回 true ;否则,返回 false 。下面是C++代码实现(官方答案搬运版):class Solution {public: bool isPossible(vector<int>& nums) { unordered_map<int,int>原创 2020-12-04 17:12:37 · 202 阅读 · 0 评论 -
Leetcode 每日一题——204. 计数质数
204. 计数质数统计所有小于非负整数 n 的质数的数量。质数统计虽然是个简单的题目,但是如果不了解数学的意义还是有点难处理的,下面是枚举法的C++代码:class Solution {public: int countPrimes(int n) { int res=0; for(int i=2; i<n; i++) { res+=isPrime(i); } return res;原创 2020-12-03 09:27:17 · 159 阅读 · 0 评论 -
Leetcode 每日一题——321. 拼接最大数
321. 拼接最大数给定长度分别为 m 和 n 的两个数组,其元素由 0-9 构成,表示两个自然数各位上的数字。现在从这两个数组中选出 k (k <= m + n) 个数字拼接成一个新的数,要求从同一个数组中取出的数字保持其在原数组中的相对顺序。求满足该条件的最大数。结果返回一个表示该最大数的长度为 k 的数组。说明: 请尽可能地优化你算法的时间和空间复杂度。这道题目没咋搞出来,参考了个大佬的(链接在下面),具体代码如下(Python版):class Solution: def m原创 2020-12-02 14:09:58 · 281 阅读 · 0 评论 -
Leetcode 每日一题——34. 在排序数组中查找元素的第一个和最后一个位置
34. 在排序数组中查找元素的第一个和最后一个位置给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值 target,返回 [-1, -1]。进阶:你可以设计并实现时间复杂度为 O(log n) 的算法解决此问题吗?该题使用双指针可以比较轻松地解决,但是要保证时间复杂度为*o(logN)*那就要用二分查找了。两边二分查找的代码如下(C++版):class Solution {public: vecto原创 2020-12-01 09:45:19 · 251 阅读 · 1 评论 -
Leetcode 每日一题——767. 重构字符串
767. 重构字符串给定一个字符串S,检查是否能重新排布其中的字母,使得两相邻的字符不同。若可行,输出任意可行的结果。若不可行,返回空字符串。该题的算法是优先队列加贪心(优先队列的API真的记不住),下面是C++的代码:class Solution {public: string reorganizeString(string S) { if(S.length()<2) return S; string result=""; vect原创 2020-11-30 09:47:16 · 204 阅读 · 0 评论 -
面试常考排序算法汇总(Python版)
面试常考排序算法汇总(Python版)快速排序def qiuckSort(nums,left,right): if left >= right: return randomNum=nums[right] print(randomNum) i,j=left,right while(i<j): while i<j and nums[i]<randomNum: i+=1 nums[j]=nu原创 2020-11-29 12:51:45 · 327 阅读 · 1 评论 -
Leetcode 每日一题——976. 三角形的最大周长
976. 三角形的最大周长给定由一些正数(代表长度)组成的数组 A,返回由其中三个长度组成的、面积不为零的三角形的最大周长。如果不能形成任何面积不为零的三角形,返回 0。该题使用排序函数加贪心处理还是比较方便的(前提是不用手推排序算法)。class Solution {public: int largestPerimeter(vector<int>& A) { if(A.size()<3) return 0; sort(A.begi原创 2020-11-29 10:22:30 · 193 阅读 · 0 评论 -
Leetcode 每日一题——493. 翻转对
493. 翻转对给定一个数组 nums ,如果 i < j 且 nums[i] > 2*nums[j] 我们就将 (i, j) 称作一个重要翻转对。你需要返回给定数组中的重要翻转对的数量。该题类似于逆序对个数的查找,使用归并排序进行求解,具体代码如下:class Solution {public: int reversePairsRecursive(vector<int>& nums,int left, int right) { i原创 2020-11-28 11:54:31 · 227 阅读 · 0 评论 -
Scala版 LeetCode练习
Scala版 LeetCode练习(简单版)1480. 一维数组的动态和object Solution { def runningSum(nums: Array[Int]): Array[Int] = { for (i<- 1 to nums.size - 1) { nums(i)=nums(i-1)+nums(i) } return nums }}1512. 好数对的数原创 2020-11-27 17:41:16 · 289 阅读 · 0 评论 -
Leetcode 每日一题——454. 四数相加 II
454. 四数相加 II给定四个包含整数的数组列表 A , B , C , D ,计算有多少个元组 (i, j, k, l) ,使得 A[i] + B[j] + C[k] + D[l] = 0。为了使问题简单化,所有的 A, B, C, D 具有相同的长度 N,且 0 ≤ N ≤ 500 。最开始我的思路是将最后一个数组的数值存到hash表中,但其实将两组数组的和存入hash map中效率是最高的,具体代码如下(C++版):class Solution {public: int four原创 2020-11-27 09:04:21 · 268 阅读 · 0 评论 -
Leetcode 每日一题——164. 最大间距
164. 最大间距给定一个无序的数组,找出数组在排序之后,相邻元素之间最大的差值。如果数组元素个数小于 2,则返回 0。该题目最麻烦的是要在线性复杂度下解决问题,所以可以使用基数排序的方法(虽然评论区都说效果一般),下面是Python的实现代码:class Solution: def maximumGap(self, nums: List[int]) -> int: if len(nums) < 2: return 0 maxN原创 2020-11-26 10:07:44 · 446 阅读 · 0 评论 -
Leetcode 每日一题——1370. 上升下降字符串
1370. 上升下降字符串给你一个字符串 s ,请你根据下面的算法重新构造字符串:从 s 中选出 最小 的字符,将它 接在 结果字符串的后面。从 s 剩余字符中选出 最小 的字符,且该字符比上一个添加的字符大,将它 接在 结果字符串后面。重复步骤 2 ,直到你没法从 s 中选择字符。从 s 中选出 最大 的字符,将它 接在 结果字符串的后面。从 s 剩余字符中选出 最大 的字符,且该字符比上一个添加的字符小,将它 接在 结果字符串后面。重复步骤 5 ,直到你没法从 s 中选择字符。重复步骤原创 2020-11-25 08:42:41 · 139 阅读 · 0 评论 -
Leetcode 每日一题——222. 完全二叉树的节点个数
222. 完全二叉树的节点个数给出一个完全二叉树,求出该树的节点个数。说明:完全二叉树的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。今天算是学了一个知识点,用二进制的方式表示完全二叉树的索引,利用这个性质可以查找某索引是不是完全二叉树的根节点索引,Python代码如下(参考官方解法):# Definition for a binary tree node.# class TreeNode:# de原创 2020-11-24 09:41:05 · 147 阅读 · 1 评论 -
Leetcode 每日一题——452. 用最少数量的箭引爆气球
452. 用最少数量的箭引爆气球在二维空间中有许多球形的气球。对于每个气球,提供的输入是水平方向上,气球直径的开始和结束坐标。由于它是水平的,所以纵坐标并不重要,因此只要知道开始和结束的横坐标就足够了。开始坐标总是小于结束坐标。一支弓箭可以沿着 x 轴从不同点完全垂直地射出。在坐标 x 处射出一支箭,若有一个气球的直径的开始和结束坐标为 xstart,xend, 且满足 xstart ≤ x ≤ xend,则该气球会被引爆。可以射出的弓箭的数量没有限制。 弓箭一旦被射出之后,可以无限地前进。我们想找到原创 2020-11-23 09:11:40 · 164 阅读 · 0 评论 -
Leetcode 每日一题——242. 有效的字母异位词
242. 有效的字母异位词给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。这道题目比较简单,直接使用hash map就可以比较轻松地求解了,具体代码如下(Python版):class Solution: def isAnagram(self, s: str, t: str) -> bool: if len(s)!=len(t):return False chMap=[0 for _ in range(26)]原创 2020-11-22 19:39:53 · 177 阅读 · 0 评论 -
Leetcode 每日一题——148. 排序链表
148. 排序链表给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。进阶:在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序该题可以使用归并排序的算法,具体代码如下(C++版):/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(null原创 2020-11-21 11:06:56 · 191 阅读 · 0 评论 -
Leetcode 每日一题——147. 对链表进行插入排序
147. 对链表进行插入排序对链表进行插入排序。插入排序算法:插入排序是迭代的,每次只移动一个元素,直到所有元素可以形成一个有序的输出列表。每次迭代中,插入排序只从输入数据中移除一个待排序的元素,找到它在序列中适当的位置,并将其插入。重复直到所有输入数据插入完为止。链表的题目只要细心一点还是能解决的,记住在插入的时候要使用两个指针,一个指在当前节点,一个指在上一个节点就可以了,具体的代码实现如下(C++版):/** * Definition for singly-linked list原创 2020-11-20 09:12:15 · 170 阅读 · 0 评论 -
Leetcode 每日一题——283. 移动零
283. 移动零给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。该题使用双指针就可以轻松求解了,具体代码如下(C++版):class Solution {public: void moveZeroes(vector<int>& nums) { if(! nums.size()) return; int left=0; int right=0; while(rig原创 2020-11-19 09:08:01 · 293 阅读 · 0 评论 -
Leetcode 每日一题——134. 加油站
134. 加油站在一条环路上有 N 个加油站,其中第 i 个加油站有汽油 gas[i] 升。你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发,开始时油箱为空。如果你可以绕环路行驶一周,则返回出发时加油站的编号,否则返回 -1。**说明: **如果题目有解,该答案即为唯一答案。输入数组均为非空数组,且长度相同。输入数组中的元素均为非负数。该题的解题思路是筛选去除不可能是起点的加油站,C++代码如下:cla原创 2020-11-18 09:02:08 · 224 阅读 · 0 评论 -
Leetcode 每日一题——1030. 距离顺序排列矩阵单元格
1030. 距离顺序排列矩阵单元格给出 R 行 C 列的矩阵,其中的单元格的整数坐标为 (r, c),满足 0 <= r < R 且 0 <= c < C。另外,我们在该矩阵中给出了一个坐标为 (r0, c0) 的单元格。返回矩阵中的所有单元格的坐标,并按到 (r0, c0) 的距离从最小到最大的顺序排,其中,两单元格(r1, c1) 和 (r2, c2) 之间的距离是曼哈顿距离,|r1 - r2| + |c1 - c2|。(你可以按任何满足此条件的顺序返回答案。)这道题用原创 2020-11-17 09:28:40 · 112 阅读 · 0 评论 -
Leetcode 每日一题——406. 根据身高重建队列
406. 根据身高重建队列假设有打乱顺序的一群人站成一个队列。 每个人由一个整数对(h, k)表示,其中h是这个人的身高,k是排在这个人前面且身高大于或等于h的人数。 编写一个算法来重建这个队列。注意:总人数少于1100人。该题需要使用贪心算法进行求解(虽然我一直没搞懂贪心在哪里),首先就是要对列表进行排序,然后一个个插入结果列表,C++的实现代码如下(用的list数据结构方便插入):class Solution {public: vector<vector<int>原创 2020-11-16 08:53:38 · 144 阅读 · 0 评论 -
Leetcode 每日一题——402. 移掉K位数字
402. 移掉K位数字给定一个以字符串表示的非负整数 num,移除这个数中的 k 位数字,使得剩下的数字最小。注意:num 的长度小于 10002 且 ≥ k。num 不会包含任何前导零。可以看出来这道题是要使用栈的数据结构处理的,但是感觉还是没怎么写好,C++的代码如下(感觉写得很啰嗦):class Solution {public: string removeKdigits(string num, int k) { vector<int> IntN原创 2020-11-15 12:08:56 · 180 阅读 · 0 评论 -
Leetcode 每日一题——1122. 数组的相对排序
1122. 数组的相对排序给你两个数组,arr1 和 arr2,arr2 中的元素各不相同arr2 中的每个元素都出现在 arr1 中对 arr1 中的元素进行排序,使 arr1 中项的相对顺序和 arr2 中的相对顺序相同。未在 arr2 中出现过的元素需要按照升序放在 arr1 的末尾。可以使用字典数据结构储存arr1中的重复数字,然后根据arr2的顺序将数字填充进结果数组中,具体代码如下(Python版):class Solution: def relativeSortArr原创 2020-11-14 11:04:45 · 274 阅读 · 0 评论 -
Leetcode 每日一题——328. 奇偶链表
328. 奇偶链表给定一个单链表,把所有的奇数节点和偶数节点分别排在一起。请注意,这里的奇数节点和偶数节点指的是节点编号的奇偶性,而不是节点的值的奇偶性。请尝试使用原地算法完成。你的算法的空间复杂度应为 O(1),时间复杂度应为 O(nodes),nodes 为节点总数。链表操作还是相对简单的,就是插入、删除以及交换节点这些操作的组合,用双指针思路实现的代码如下(Python版):# Definition for singly-linked list.# class ListNode:#原创 2020-11-13 10:14:58 · 229 阅读 · 0 评论 -
Leetcode 每日一题——922. 按奇偶排序数组 II
922. 按奇偶排序数组 II给定一个非负整数数组 A, A 中一半整数是奇数,一半整数是偶数。对数组进行排序,以便当 A[i] 为奇数时,i 也是奇数;当 A[i] 为偶数时, i 也是偶数。你可以返回任何满足上述条件的数组作为答案。今天的题目很简单,看完题目后我反手就写出了答案(感觉自己又行了O(∩_∩)O哈哈~),下面是Python的代码:class Solution: def sortArrayByParityII(self, A: List[int]) -> List[i原创 2020-11-12 08:48:51 · 333 阅读 · 1 评论 -
Leetcode 每日一题——514. 自由之路
514. 自由之路视频游戏“辐射4”中,任务“通向自由”要求玩家到达名为“Freedom Trail Ring”的金属表盘,并使用表盘拼写特定关键词才能开门。给定一个字符串 ring,表示刻在外环上的编码;给定另一个字符串 key,表示需要拼写的关键词。您需要算出能够拼写关键词中所有字符的最少步数。最初,ring 的第一个字符与12:00方向对齐。您需要顺时针或逆时针旋转 ring 以使 key 的一个字符在 12:00 方向对齐,然后按下中心按钮,以此逐个拼写完 key 中的所有字符。旋转 rin原创 2020-11-11 10:03:22 · 780 阅读 · 0 评论 -
回溯算法模板题型(leetcode)
回溯算法模板题型357. 计算各个位数不同的数字个数class Solution: def countNumbersWithUniqueDigits(self, n: int) -> int: if n is 0: return 1 def DFS(n,idx,used): count=0 if idx is not n: for i in range(原创 2020-11-10 21:45:42 · 178 阅读 · 0 评论 -
堆排序(Python版)
堆排序(Python版)堆排序借用了完全二叉树的数据结构,在排序过程中使得每个节点的数值都要大于左右孩子的数值:#n表示排序长度,i表示要构建最大堆的节点def buildHeap(nums,n,i): lagest=i left=2*i+1 right=2*i+2 if left<n and nums[left]>nums[lagest]: lagest=left if right<n and nums[right]>n原创 2020-11-10 15:50:57 · 90 阅读 · 0 评论 -
Leetcode 每日一题——31. 下一个排列
31. 下一个排列实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。必须原地修改,只允许使用额外常数空间。以下是一些例子,输入位于左侧列,其相应输出位于右侧列。这道题在做之前首先要搞懂什么是字典序(不知道的请出门左拐百度),为了找到字典序的下一个排列,要分成两步处理,首先从尾节点开始找第一个降序节点的前一个节点(就是降序那个点),然后再从尾节点开始遍历,找到第一个比降序那个点大的并进行交换,原创 2020-11-10 09:44:55 · 228 阅读 · 0 评论 -
Leetcode 每日一题——973. 最接近原点的 K 个点
973. 最接近原点的 K 个点我们有一个由平面上的点组成的列表 points。需要从中找出 K 个距离原点 (0, 0) 最近的点。(这里,平面上两点之间的距离是欧几里德距离。)你可以按任何顺序返回答案。除了点坐标的顺序之外,答案确保是唯一的。首先想到的是排序,可以借助于优先队列去找K个离原点最小的值,C++的代码如下:class Solution {public: struct cmp { bool operator()(vector<int>&a原创 2020-11-09 16:03:14 · 441 阅读 · 0 评论 -
Leetcode 每日一题——122. 买卖股票的最佳时机 II
122. 买卖股票的最佳时机 II给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。该题比较简单(终于是简单题了ε=(´ο`*)))唉),遍历数组有上升就买,有下降就卖,具体C++代码如下:class Solution {public: int maxProfit(vector<int>& pri原创 2020-11-08 16:47:50 · 153 阅读 · 0 评论 -
Leetcode 每日一题——327. 区间和的个数
327. 区间和的个数给定一个整数数组 nums,返回区间和在 [lower, upper] 之间的个数,包含 lower 和 upper。区间和 S(i, j) 表示在 nums 中,位置从 i 到 j 的元素之和,包含 i 和 j (i ≤ j)。说明:最直观的算法复杂度是 O(n2) ,请在此基础上优化你的算法。今天是真的没搞出来,只能厚颜无耻的搬运官方答案了:struct SegNode { int lo, hi, add; SegNode* lchild, *rchi原创 2020-11-07 21:31:20 · 148 阅读 · 0 评论 -
Leetcode 每日一题——1356. 根据数字二进制下 1 的数目排序
1356. 根据数字二进制下 1 的数目排序给你一个整数数组 arr 。请你将数组中的元素按照其二进制表示中数字 1 的数目升序排序。如果存在多个数字二进制中 1 的数目相同,则必须将它们按照数值大小升序排列。请你返回排序后的数组。这道题用简单的暴力求解是可以做出来的,下面是C++的代码:class Solution {public: void getBits(vector<int>& arr,unordered_map<int,int>& bi原创 2020-11-06 09:18:05 · 170 阅读 · 0 评论 -
Leetcode 每日一题——127. 单词接龙
127. 单词接龙给定两个单词(beginWord 和 endWord)和一个字典,找到从 beginWord 到 endWord 的最短转换序列的长度。转换需遵循如下规则:每次转换只能改变一个字母。转换过程中的中间单词必须是字典中的单词。说明:如果不存在这样的转换序列,返回 0。所有单词具有相同的长度。所有单词只由小写字母组成。字典中不存在重复的单词。你可以假设 beginWord 和 endWord 是非空的,且二者不相同。该题目是NLP相关算法中经常遇到的问题,最短路径问题首先原创 2020-11-05 16:43:22 · 272 阅读 · 1 评论