
Leetcode
零下3℃
这个作者很懒,什么都没留下…
展开
-
【Leetcode】421. 数组中两个数的最大异或值
题目:421题意:给你一个整数数组 nums ,返回 nums[i] XOR nums[j]的最大运算结果,其中 0 ≤ i ≤ j < n 。题解:核心思想: 在位运算异或运算符中,x = ai⊕ aj 等价于 ai= x ⊕ aj ,由于数的范围在0~231-1范围内,所以每一次从二进制的角度选取最大的x。方法一: 哈希表,具体而言,保存数组中每一个数的前k位,从第30位开始,每一次选取数组中是否存在使得当前x可以满足的解;详细思路可以看代码进行理解。class Solution {p原创 2021-05-16 11:45:28 · 194 阅读 · 0 评论 -
滑动窗口算法框架
/* 滑动窗口算法框架 */void slidingWindow(string s, string t) { unordered_map<char, int> need, window; for (char c : t) need[c]++; int left = 0, right = 0; int valid = 0; while (right < s.size()) { // c 是将移入窗口的字符 cha.原创 2021-03-06 19:46:16 · 158 阅读 · 0 评论 -
二分搜索框架
int binary_search(int[] nums, int target) { int left = 0, right = nums.length - 1; while(left <= right) { int mid = left + (right - left) / 2; if (nums[mid] < target) { left = mid + 1; } else if (nums[mid.原创 2021-03-06 10:44:16 · 141 阅读 · 0 评论 -
回溯算法解题套路框架
1、路径:也就是已经做出的选择2、选择列表:也就是你当前可以做的选择3、结束条件:也就是到达决策树底层,无法再做选择的条件result = []def backtrack(路径, 选择列表): if 满足结束条件: result.add(路径) return for 选择 in 选择列表: 做选择 backtrack(路径, 选择列表) 撤销选择...原创 2021-03-05 16:55:03 · 108 阅读 · 0 评论 -
【Leetcode】330. 按要求补齐数组
题目:330题意:给定一个已排序的正整数数组 nums,和一个正整数n 。从[1, n]区间内选取任意个数字补充到nums中,使得[1, n]区间内的任何数字都可以用nums中某几个数字的和来表示。请输出满足上述要求的最少需要补充的数字个数。题解:贪心算法主要思想,对于任意x,如果 [1, x) 内所有数字都被覆盖,而且 z 在数组nums中,那么对于任意 1 <= y < x ,则y+z 也被覆盖。那么如果z小于x则 [z ,x+z)中的所有数字将被覆盖c...原创 2020-12-29 17:19:06 · 101 阅读 · 0 评论 -
【Leetcode】47. 全排列 II
题目:47题意:给定一个含有重复元素的数组,求出这个数组的全排列,并且使得任意排列不重复题解:回溯主体思想,和原题目46全排列类似,使用回溯算法,主要考虑两个子过程:递归出口:n(已经选择的数组中的元素个数) == len(数组长度)当已经选择的数组中的元素中的个数等于数组的大小就得到了一个排列 递归过程:n < len 如何选择下一个元素,下一个元素不能是之前已经选择过的,所以我们采用一个标记数组,标记数组中已经访问过的元素。目前这个过程和46题还是完全一致的,得到的结果会包含大原创 2020-12-22 21:02:46 · 106 阅读 · 0 评论 -
【Leetcode】46. 全排列
题目:46题意:给定一个无重复数字的数组序列,求出这个数组所有可能的排列情况题解:回溯法由题意可以看出,题目的本质需要求出这个数组的全排列,自然而然我们想到了穷举出所有的可能,即依次从数组中挑选出来一个元素组成新序列,我们使用回溯法来模拟这个过程。回溯法需要考虑以下两个方面:递归出口:当我们已经选择的个数 n 等于 len (数组的长度)时即得到了一个序列 递归过程:当 n < len 时,如何选择下一个元素,下一个元素不能是之前已经选择过的,所以我们采用一个标记数组,标记数组中原创 2020-12-21 21:10:42 · 99 阅读 · 0 评论 -
【Leetcode】416. 分割等和子集
题目:416题意:给定一个只包含正整数的非空数组。问是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。题解:动态规划dp[i][j]表示从数组的 [0, i] 这个子区间内挑选一些正整数,每个数只能用一次,使得这些数的和恰好等于j状态转移方程代码:class Solution {public: bool canPartition(vector<i...原创 2020-02-11 16:54:01 · 171 阅读 · 0 评论 -
【Leetcode】630. 课程表 III (优先队列)
题目:630题意:这里有 n 门不同的在线课程,他们按从 1 到 n编号。每一门课程有一定的持续上课时间(课程时间)t 以及关闭时间第 d天。一门课要持续学习 t 天直到第 d 天时要完成,你将会从第 1 天开始。给出 n 个在线课程用 (t, d) 对表示。你的任务是找出最多可以修几门课。题解:优先队列代码:class Solution {public: sta...原创 2020-02-11 16:04:25 · 281 阅读 · 0 评论 -
【Leetcode】621.任务调度(排序)
题目:621题意:给定一个用字符数组表示的 CPU 需要执行的任务列表。其中包含使用大写的 A - Z 字母表示的26 种不同种类的任务。任务可以以任意顺序执行,并且每个任务都可以在 1 个单位时间内执行完。CPU 在任何一个单位时间内都可以执行一个任务,或者在待命状态。然而,两个相同种类的任务之间必须有长度为n 的冷却时间,因此至少有连续 n 个单位时间内 CPU 在执行不同的任务,或...原创 2020-02-11 15:11:25 · 351 阅读 · 0 评论 -
【Leetcode】208. 实现Trie(前缀树)
题目:208原创 2020-02-11 14:33:34 · 121 阅读 · 0 评论 -
【Leetcode】315.计算右侧小于当前元素的个数(归并排序)
题目:315题意:给定一个整数数组 nums,按要求返回一个新数组counts。数组 counts 有该性质: counts[i] 的值是nums[i] 右侧小于nums[i] 的元素的数量。题解:归并排序采用求逆序对的方式计数参考:参考资料代码:class Solution {private: vector<int> cnt; int* tem...原创 2020-02-10 19:15:05 · 279 阅读 · 0 评论 -
【Leetcode】307. 区域和检索(线段树)
题目:307题意:给定一个整数数组,可以随时对某一数组元素值进行修改,设计一个算法求任意范围内数值和题解:线段树线段树是一种非常灵活的数据结构,它可以用于解决多种范围查询问题,比如在对数时间内从数组中找到最小值、最大值、总和、最大公约数、最小公倍数等。线段树可以分为以下三个步骤:从给定数组构建线段树的预处理步骤。 修改元素时更新线段树。 使用线段树进行区域和检索。代码:...原创 2020-02-10 15:07:09 · 254 阅读 · 0 评论 -
【Leetcode】56. 合并区间(排序)
题目:56题意:给定一个区间集合,合并所有重叠的区间题解:先将区间集合排序后,逐一比较当前区间左端点与前一区间右端点,如果比前一区间右端点小,则可以合并代码:class Solution {public: //注意,cmp函数写在类里面,需要加static static bool cmp(vector<int> a, vector<int> b) ...原创 2020-02-07 17:02:42 · 343 阅读 · 0 评论 -
【Leetcode】1036. 逃离大迷宫
题目:1036题意:在一个 10^6 x 10^6 的网格中,每个网格块的坐标为(x, y),其中0 <= x, y < 10^6。我们从源方格source开始出发,意图赶往目标方格target。每次移动,我们都可以走到网格中在四个方向上相邻的方格,只要该方格不在给出的封锁列表blocked上。只有在可以通过一系列的移动到达目标方格时才返回true。否则,返回 fa...原创 2020-02-07 16:15:58 · 434 阅读 · 0 评论 -
【Leetcode】312. 戳气球(DP + 分治)
题目:312题意:有N个气球,要求你戳破所有的气球,每戳破一个,你可以获得nums[left]*nums[i]*nums[right]个硬币,注意戳破一个气球后相邻顺序会改变。求戳破所有气球所能获得的最大硬币数量题解:DP + 分治,主要是想分解为重叠子问题,但是如果简单考虑一下,先随机选择一个气球,然后求左右两边的两个子问题,但是左右两边并不是独立的子问题,即左边的顺序会影响右边的计...原创 2020-02-06 17:30:52 · 223 阅读 · 0 评论 -
【Leetcode】120. 三角形最小路径
题目:120题意:给定一个三角形,找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点上。题解:方法一:动态规划,使用O(n)的额外辅助空间,自顶向下,从后往前,需要考虑边界方法二:动态规划,使用O(n)的额外辅助空间,自底向上,从前往后,不需要考虑边界代码一:class Solution {public: int minimumTotal(vector<...原创 2020-02-05 16:09:27 · 96 阅读 · 0 评论 -
【Leetcode】51. N皇后 (回溯)
题目:51题意:求解N皇后问题的所有解思路:回溯,对于每一行必须且只能放置一个皇后,于是只需要考虑列即可。对于每一行,按列进行循环,检查当前位置是否可以放置皇后,如果可以就把攻击范围的方格打上标记。如果row == current_row,意味着得到了一个可能的方案,回溯寻找下一个可能的方案,直到所有的情况都考虑到。攻击范围:因为每一行放一个,所以不产生冲突,列的情况也比较好考...原创 2020-02-05 15:16:37 · 165 阅读 · 2 评论 -
【Leetcode】37. 解数独
题目:解数独题意:给定一个9*9的不完全数独矩阵,需要在 ‘.’的地方填入合适的数字(1-9),使得每一行、每一列以及每一个子方块没有重复的数字出现思路:回溯 对每一行、每一列以及每一个子方块设置一个标志数组,标志已经存放过哪些数字。从矩阵的第一个格开始处理,直到最后一个格结束。代码:class Solution {private: int flag...原创 2019-12-20 16:49:12 · 114 阅读 · 0 评论 -
【Leetcode】218. 天际线问题
题目:天际线问题题意:给定n个矩形,求形成的轮廓解法一:分治,求解 n 栋楼的天际线:如果 n == 0:返回一个空列表如果 n == 1:返回一栋楼的天际线leftSkyline = 求解前 n/2 栋楼的天际线。rightSkyline = 求解后 n/2 栋楼的天际线。合并解法二:扫描线法使用扫描线,从左至右扫过。如果遇到左端点,将高度入堆,如果遇到右...原创 2019-11-28 19:08:12 · 435 阅读 · 0 评论 -
【Leetcode】329. 矩阵中的最长递增路径
题目:矩阵中的最长递增路径给定一个整数矩阵,找出最长递增路径的长度。对于每个单元格,你可以往上,下,左,右四个方向移动。 你不能在对角线方向上移动或移动到边界外(即不允许环绕)。解法一:可以看作一种拓扑排序过程,通过计算拓扑序列的长度计算最长长度,即剥洋葱算法class Solution {public: int dir[4][2] = { {0, 1}, {0, -1}...原创 2019-11-14 21:16:24 · 173 阅读 · 0 评论 -
【Leetcode】5. 最长回文子串
题目:最长回文子串给定一个字符串 s,找到 s 中最长的回文子串。你可以假设s 的最大长度为 1000。解题思路:方法一:中心扩展法,枚举给定字符串的回文中心,从中心向外扩展,求最大回文串及其长度方法二:动态规划, 递归边界,长度为1和2的回文串的长度,dp[ i ][ i ] = 1; if s[ i ]==s[ i + 1],dp[ i ]...原创 2019-08-25 22:36:02 · 157 阅读 · 0 评论 -
【Leetcode】399. 除法求值
题目:evaluate division给出方程式 A / B = k, 其中 A 和 B 均为代表字符串的变量, k 是一个浮点型数字。根据已知方程式求解问题,并返回计算结果。如果结果不存在,则返回 -1.0。示例 :给定 a / b = 2.0, b / c = 3.0问题: a / c = ?, b / a = ?, a / e = ?, a / a = ?, x / x = ...原创 2019-08-20 17:11:24 · 183 阅读 · 0 评论 -
【Leetcode】200. 岛屿数量(并查集/ BFS/ DFS)
题目:给定一个由 '1'(陆地)和 '0'(水)组成的的二维网格,计算岛屿的数量。一个岛被水包围,并且它是通过水平方向或垂直方向上相邻的陆地连接而成的。你可以假设网格的四个边均被水包围。输入:11110110101100000000输出:1解题思路:DFS,记录启动DFS的次数 BFS,记录启动BFS次数 并查集,对相邻陆地进行合并操作,计算集合数目代码...原创 2019-08-20 11:01:25 · 178 阅读 · 0 评论 -
【Leetcode】128. 最长连续序列
题目要求:给定一个未排序的整数数组,找出最长连续序列的长度。时间复杂度O(n)思路:使用Hash表,从连续序列的的第一个数字开始寻找最长序列,即 currentNum-1不在Hash表中的数字进行求取最长序列代码:#include <iostream>#include <vector>#include <map>#include <qu...原创 2019-08-19 22:04:53 · 116 阅读 · 0 评论