leetcode
文章平均质量分 51
做自己的事儿
玦☞
心事浩茫连广宇,于无声处听惊雷
展开
-
精选面试题
1. 有效的数独https://leetcode-cn.com/problems/valid-sudoku/思路:哈希表class Solution {public: bool isValidSudoku(vector<vector<char>>& board) { int row[9][10] = {0};// 哈希表存储每一行的每个数是否出现过,默认初始情况下,每一行每一个数都没有出现过 // 整个board有9行,第二维的转载 2021-11-22 11:44:04 · 189 阅读 · 0 评论 -
百度笔试题10.18
最短路径为了做一项关于“爱护环境,从小做起”的公益调查,新司机小明决定开老爸的车从家中前往市第一小学。从小明家到义市第一小学的交通网络图一共有n个顶点(包括起点小明家和终点市第一小学)和m条无向边。每条边都有一个碳排放量和一个行驶时间(单位:分钟) 。现在需要你编写一个程序帮助小明实现低碳出行,即寻找一条碳排放量最少的路径,一条路径的碳排放量等于该路径上所有边的碳排放量之和。如果存在两条碳排放量相同的路径,则找出总的行驶时间最少的路径,并输出该路径的总碳排放量和总的时间(分钟)输入描述单组输入。在每组原创 2021-10-20 10:45:04 · 203 阅读 · 0 评论 -
最佳直线~
给定一个二维平面及平面上的N个点列表Points,其中第i个点的坐标为Points[i] = [Xi, Yi]。找出一条直线,其通过的点的数目最多。设穿过最多点的直线所穿过的全部点编号从小到大排序的列表为S,你仅需返回[S[0],S[1]]作为答案,若有多条直线穿过了相同数量的点,则选择S[0]值较小的直线返回,S[0]相同则选择S[1]值较小的直线返回。思路:暴力哈希表class Solution {public: vector<int> bestLine(vector<原创 2021-09-11 11:45:33 · 166 阅读 · 0 评论 -
平分正方形
给定两个正方形及一个二维平面。请找出将这两个正方形分割成两半的一条直线。假设正方形顶边和底边与 x 轴平行。每个正方形的数据square包含3个数值,正方形的左下顶点坐标[X,Y] = [square[0],square[1]],以及正方形的边长square[2]。所求直线穿过两个正方形会形成4个交点,请返回4个交点形成线段的两端点坐标(两个端点即为4个交点中距离最远的2个点,这2个点所连成的线段一定会穿过另外2个交点)。2个端点坐标[X1,Y1]和[X2,Y2]的返回格式为{X1,Y1,X2,Y2},要原创 2021-09-11 09:58:09 · 496 阅读 · 0 评论 -
模式匹配~
你有两个字符串,即pattern和value。 pattern字符串由字母"a"和"b"组成,用于描述字符串中的模式。例如,字符串"catcatgocatgo"匹配模式"aabab"(其中"cat"是"a",“go"是"b”),该字符串也匹配像"a"、"ab"和"b"这样的模式。但需注意"a"和"b"不能同时表示相同的字符串。编写一个方法判断value字符串是否匹配pattern字符串。输入: pattern = “abba”, value = “dogcatcatdog”输出: true思路:原创 2021-09-09 17:50:17 · 388 阅读 · 0 评论 -
跳水板~~
你正在使用一堆木板建造跳水板。有两种类型的木板,其中长度较短的木板长度为shorter,长度较长的木板长度为longer。你必须正好使用k块木板。编写一个方法,生成跳水板所有可能的长度。返回的长度需要从小到大排列。输入:shorter = 1longer = 2k = 3输出: [3,4,5,6]解释:可以使用 3 次 shorter,得到结果 3;使用 2 次 shorter 和 1 次 longer,得到结果 4 。以此类推,得到最终结果。思路然后考虑一般情况,即 \textit原创 2021-09-09 17:36:51 · 190 阅读 · 0 评论 -
生存游戏!
给定N个人的出生年份和死亡年份,第i个人的出生年份为birth[i],死亡年份为death[i],实现一个方法以计算生存人数最多的年份。思路:和区间问题一样,进入一个区间,在左端点+1,离开区间,在右端点的下一个点减去1。class Solution {public: int maxAliveYear(vector<int>& birth, vector<int>& death) { sort(birth.begin(), birth.原创 2021-09-09 17:25:40 · 123 阅读 · 0 评论 -
整数的英语表示
给定一个整数,打印该整数的英文描述。输入: 123输出: “One Hundred Twenty Three”输入: 1234567891输出: “One Billion Two Hundred Thirty Four Million Five Hundred Sixty Seven Thousand Eight Hundred Ninety One”思路:分治的算法倒序将数字拆分成3个数字,这里考虑到到整数,所以billion已经足够3个数字考虑如下情况0-20以内比较特别,原创 2021-09-08 21:53:04 · 524 阅读 · 0 评论 -
面试题 16.07. 最大数值
面试题 16.07. 最大数值编写一个方法,找出两个数字a和b中最大的那一个。不得使用if-else或其他比较运算符。输入: a = 1, b = 2输出: 2思路如何取出int类型的符号位如果超过int类型怎么办long类型。符号位都是在第一位上的,也就是说long类型右移63位就可以拿到。正数右移高位补0,负数右移高位补1。所以,本题的关键点,就在于我们目标是得到一个标志ans,当a大的时候ans为1,b大的时候ans为0。如果我们能得到ans,则最终的答案是 ans * a原创 2021-09-08 21:29:20 · 116 阅读 · 0 评论 -
单词转换~
给定字典中的两个词,长度相等。写一个方法,把一个词转换成另一个词, 但是一次只能改变一个字符。每一步得到的新词都必须能在字典中找到。编写一个程序,返回一个可能的转换序列。如有多个可能的转换序列,你可以返回任何一个。思路:DFS使用DFS从beginWord开始往endWord搜索,同时定义一个visted哈希表把已经遍历过的字符串标记下以免重复遍历减少计算量。class Solution {private: void dfs(string& beginWord, string&am原创 2021-08-06 11:46:56 · 128 阅读 · 0 评论 -
最大子矩阵
给定一个正整数和负整数组成的 N × M 矩阵,编写代码找出元素总和最大的子矩阵。返回一个数组 [r1, c1, r2, c2],其中 r1, c1 分别代表子矩阵左上角的行号和列号,r2, c2 分别代表右下角的行号和列号。若有多个满足条件的子矩阵,返回任意一个均可。思路相比于最大子序和问题,该问题从一维变成了二维,但实质是一样的,同样是再求最大子序和,我们需要将二维转化为一维,对于矩阵的每一列,我们将其加在一起,成为了一维上的一个数,二维矩阵的和转化为了一维数组的和。我们以第i行为第一行,向下原创 2021-08-06 11:31:32 · 337 阅读 · 0 评论 -
访问所有节点的最短路径
存在一个由n个节点组成的无向联通图,图中的节点按从0到n-1编号。给你一个数组graph表示这个图。其中,graph[i]是一个列表,由所有与节点i直接相连的节点组成。返回能够访问所有节点的最短路径的长度。你可以在任一节点开始和停止,也可以多次重复访问节点,并且可以重用边。输入:graph = [[1,2,3],[0],[0],[0]]输出:4解释:一种可能的路径为 [1,0,2,0,3]思路:状态压缩 + 广度优先搜索由于题目中需要求出“访问所有节点的最短路径的长度”,并且图中每一条边原创 2021-08-06 11:18:05 · 1088 阅读 · 0 评论 -
稀疏相似度
稀疏相似度两个(具有不同单词的)文档的交集(intersection)中元素的个数除以并集(union)中元素的个数,就是这两个文档的相似度。例如,{1, 5, 3} 和 {1, 7, 2, 3} 的相似度是 0.4,其中,交集的元素有 2 个,并集的元素有 5 个。给定一系列的长篇文档,每个文档元素各不相同,并与一个 ID 相关联。它们的相似度非常“稀疏”,也就是说任选 2 个文档,相似度都很接近 0。请设计一个算法返回每对文档的 ID 及其相似度。只需输出相似度大于 0 的组合。请忽略空文档。为简单起原创 2021-08-05 16:30:34 · 211 阅读 · 0 评论 -
二叉树中所有距离为K的节点
给定一个二叉树(具有根节点root),一个目标节点target,和一个整数值K。返回到目标节点target距离为K的所有节点的值的列表。输入:root = [3,5,1,6,2,0,8,null,null,7,4], target = 5, K = 2输出:[7,4,1]解释:所求结点为与目标结点(值为 5)距离为 2 的结点,值分别为 7,4,以及 1思路:dfs + 哈希若将target当做树的根节点,我们就能从target出发,使用dfs寻找与target距离为k的所有节点,即深原创 2021-07-28 18:41:38 · 678 阅读 · 0 评论 -
翻转数位~
给定一个32位整数 num,你可以将一个数位从0变为1。请编写一个程序,找出你能够获得的最长的一串1的长度。输入: num = 1775(11011101111)输出: 8思路:滑动窗口首先通过位运算将原数字从低位到高位取出来。接着定义三个变量,分别是滑动窗口的左右边界和滑动窗口中第一个0之后的位置next。当遇到取出的数字是0时,计算窗口长度,对答案进行更新,并将下一个窗口的起点设置为next即可。对于第一个0,可以通过一个标志位flag来特殊处理,跳过上述操作。这里因为有负数和0的存在,原创 2021-07-27 20:37:30 · 196 阅读 · 0 评论 -
特定深度节点链表
给定一棵二叉树,设计一个算法,创建含有某一深度上所有节点的链表(比如,若一棵树的深度为 D,则会创建出 D 个链表)。返回一个包含所有深度的链表的数组。输入:[1,2,3,4,5,null,7,8] 1 / \ 2 3 / \ \ 4 5 7/8输出:[[1],[2,3],[4,5,7],[8]]思路:简单层序遍历/** * Definition for a binary tree node. * struct TreeNode { *原创 2021-07-26 18:56:46 · 118 阅读 · 0 评论 -
堆箱子问题
思路:动态规划先将数组按照任何一条边降序重排,目的是降低里层循环次数。使用dp一维数组,记录以序号i箱子为项时的最大高度。计算每个箱子i时,在约束条件下,找到所有箱子k,并计算以k为顶最大高度与i的高度之和,取最大值。所有箱子都操作完成后,取dp数组元素最大值class Solution {public: // 降序 static bool width_bigger( const vector<int> &b1, const vector<int>原创 2021-07-25 11:14:10 · 440 阅读 · 0 评论 -
从相邻元素对还原数组
存在一个由 n 个不同元素组成的整数数组nums,有nums中,每一对相邻元素。给你一个二维整数数组adjcentPairs,adjcentPairs[i] = [ui, vi]表示两元素相邻。输入:adjacentPairs = [[2,1],[3,4],[3,2]]输出:[1,2,3,4]解释:数组的所有相邻元素对都在 adjacentPairs 中。特别要注意的是,adjacentPairs[i] 只表示两个元素相邻,并不保证其 左-右 顺序。思路:哈希表定义map< int,原创 2021-07-25 11:06:35 · 126 阅读 · 1 评论 -
节点间通路
给定有向图,设计一个算法,找出两个节点之间是否存在一条路径。输入:n = 5, graph = [[0, 1], [0, 2], [0, 4], [0, 4], [0, 1], [1, 3], [1, 4], [1, 3], [2, 3], [3, 4]], start = 0, target = 4输出 true思路:用vector<vector< int > 记录有向图,构造完后,尝试DFS遍历。需要额外使用一个vector< bool >来记录当前节点是否原创 2021-07-21 17:42:26 · 140 阅读 · 0 评论 -
栈排序~~
对栈进行排序使最小元素位于栈顶。最多只能使用一个其他的临时栈存放数据,但不得将元素复制到别的数据结构(如数组)中。该栈支持如下操作:push、pop、peek 和 isEmpty。当栈为空时,peek 返回 -1。思路:双栈维护两个栈,原栈为降序,辅助栈为升序比如s1 = {8, 7, 5} s2 = {}插入5,因为比s1.top大,把3插入s2中,然后5插入s1中。s1 = {8, 7, 5} s2 = {3}这样既能保证s1中的元素一定大于s2中的元素,也可以使得两个栈都是按顺序排列cl原创 2021-07-21 16:32:42 · 125 阅读 · 0 评论 -
化栈为队~
实现一个MyQueue类,用两个栈来实现一个队列。MyQueue queue = new MyQueue();queue.push(1);queue.push(2);queue.peek(); // 返回 1queue.pop(); // 返回 1queue.empty(); // 返回 false思路:经典解法s1用于每次插入使用。s2用于每次获取使用,而一旦s2为空,则会从s1里获取并插入,那么这个时候s2就变成queue的FIFO的顺序。class MyQueue {原创 2021-07-21 16:23:40 · 71 阅读 · 0 评论 -
三合一~~
描述如何只用一个数组来实现三个栈。实现push(stackNum, value)、pop(stackNum)、isEmpty(stackNum)、peek(stackNum)方法。stackNum表示栈下标,value表示压入的值。构造函数会传入一个stackSize参数,代表每个栈的大小。思路:3合1的栈,就是说1个数组里面有3个栈,通过stackNum来区分我们现在具体的要操作哪一个栈。class TripleInOne {private: //这里是我们的私有数据,我们设置一个ve转载 2021-07-21 16:06:11 · 135 阅读 · 0 评论 -
区域和检索 - 数组可修改
给你一个数组nums,请你完成两类查询,其中一类查询要求更新数组下标对应的值,另一类查询要求返回数组中某个范围内元素的总和。实现 NumArray 类:NumArray(int[] nums) 用整数数组 nums 初始化对象void update(int index, int val) 将 nums[index] 的值更新为 valint sumRange(int left, int right) 返回子数组 nums[left, right] 的总和(即,nums[left] + nums[le原创 2021-07-20 21:18:09 · 88 阅读 · 0 评论 -
数组中最大数对和的最小值
一个数对 (a,b) 的 数对和 等于 a + b 。最大数对和 是一个数对数组中最大的 数对和 。比方说,如果我们有数对 (1,5) ,(2,3) 和 (4,4),最大数对和 为 max(1+5, 2+3, 4+4) = max(6, 5, 8) = 8 。给你一个长度为 偶数 n 的数组 nums ,请你将 nums 中的元素分成 n / 2 个数对,使得:nums 中每个元素 恰好 在 一个 数对中,且最大数对和 的值 最小 。请你在最优数对划分的方案下,返回最小的 最大数对和 。输入:原创 2021-07-20 14:55:03 · 480 阅读 · 0 评论 -
前k个高频元素
给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。输入: nums = [1,1,1,2,2,3], k = 2输出: [1,2]思路:哈希表class Solution {public: vector<int> topKFrequent(vector<int>& nums, int k) { unordered_map<int, int> hashmap;原创 2021-07-19 18:16:12 · 74 阅读 · 0 评论 -
将 x 减到 0 的最小操作数
给你一个整数数组nums和一个整数x。每一次操作时,应当移除数组nums最左边或最右边的元素,然后从x中减去该元素的值。如果可以将x恰好减到0,返回最小操作数;否则返回-1。输入:nums = [1,1,4,2,3], x = 5输出:2解释:最佳解决方案是移除后两个元素,将 x 减到 0 。思路:操作数 双指针将问题转化为求和为sum(nums) - x的最长连续子数组的长度为什么要这样想呢,这是因为,sum(nums)之后,如果去掉某个滑动窗口中的元素的话(这样可以保证滑动窗口之外的元原创 2021-07-19 18:15:29 · 1446 阅读 · 0 评论 -
链表求和~
给定两个用链表表示的整数,每个节点包含一个数位。这些数位是反向存放的,也就是个位排在链表头部。编写求和,链表形式返回结果。输入:(7 -> 1 -> 6) + (5 -> 9 -> 2),即617 + 295输出:2 -> 1 -> 9,即912思路:一步步来class Solution {public: ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) { // head是不移动的,p是在移原创 2021-07-19 17:11:30 · 133 阅读 · 0 评论 -
移除重复节点
移除链表中重复节点。保留最开始出现的节点。输入:[1, 2, 3, 3, 2, 1]输出:[1, 2, 3]思路:哈希表class Solution {public: ListNode* removeDuplicateNodes(ListNode* head) { if (head == nullptr) { return head; } unordered_set<int> ocurred = {head -> val}; ListNode* pos原创 2021-07-19 15:09:44 · 154 阅读 · 0 评论 -
移除重复节点
思路:哈希表对链表进行一次遍历,用一个哈希集合(HashSet)来存储所有出现过的节点。从链表的头结点head开始原创 2021-07-18 22:33:24 · 96 阅读 · 2 评论 -
零矩阵~~
编写一种算法,若M × N矩阵中某个元素为0,则将其所在的行与列清零。示例输入:[[0,1,2,0],[3,4,5,2],[1,3,1,5]]输出:[[0,0,0,0],[0,4,5,0],[0,3,1,0]]开辟一个新的bool数组class Solution {public: void setZeroes(vector<vector<int>>& matrix) { int mRow = matrix.size(原创 2021-07-17 15:56:44 · 219 阅读 · 0 评论 -
一次编辑~
字符串有三种编辑操作:插入一个字符、删除一个字符或者替换一个字符。给定两个字符串,编写一个函数判定它们是否只需要一次(或者零次)编辑。输入:first = “pale”second = “ple”输出: True思路:动态规划...原创 2021-07-17 15:20:50 · 76 阅读 · 0 评论 -
简单面试题
回文排列给定一个字符串,编写一个函数判定其是否为某个回文串的排列之一。回文串是指正反两个方向都一样的单词或短语。排列是指字母的重新排列。回文串不一定是字典当中的单词输入:“tactcoa”输出:true(排列有"tacocat"、“atcocta”,等等)思路:要满足字串重排后可成回文,则只能有一个字符出现奇数次,其余都必须为偶数次。用set记录字符是否出现过,如果当前字符在set中已存在,则表示当前字符出现了2次,直接将set中,该字符删除。class Solution {publ原创 2021-07-17 11:52:06 · 85 阅读 · 0 评论 -
完全二叉树的节点个数
给你一棵完全二叉树的根节点root,求出该树的节点个数。完全二叉树的定义如下:在完全二叉树中,除了最底层节点可能没有填满之外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第h层,则该层包含1~2h个节点。满二叉树的定义如下:二叉树除了叶结点外所有节点都有两个子节点。是完全二叉树的特例。输入:root = [1,2,3,4,5,6]输出:6思路一:层序遍历递归递归法class Solution {private: int getNodeN转载 2021-07-17 11:28:04 · 2769 阅读 · 0 评论 -
字符的最短距离
给你一个字符串s和一个字符c,且c是s中出现过的字符。返回一个整数数组answer,其中answer.length == s.length且answer[i]是s中从下标i到离它最近的字符c的距离。两个下标 i 和 j 之间的距离为abs(i - j)输入:s = “loveleetcode”, c = “e”输出:[3,2,1,0,1,0,0,1,2,2,1,0]解释:字符 ‘e’ 出现在下标 3、5、6 和 11 处(下标从 0 开始计数)。距下标 0 最近的 ‘e’ 出现在下标 3 ,所原创 2021-07-16 15:36:59 · 162 阅读 · 0 评论 -
汇总区间~
给定一个无重复元素的有序整数数组nums。返回 恰好覆盖数组中所有数字 的 最小有序 区间范围列表。也就是说,nums 的每个元素都恰好被某个区间范围所覆盖,并且不存在属于某个范围但不属于 nums 的数字 x 。输入:nums = [0,1,2,4,5,7]输出:[“0->2”,“4->5”,“7”]解释:因为缺3,缺6,所以分成了三个区间区间范围是:[0,2] --> “0->2”[4,5] --> “4->5”[7,7] --> “7”思原创 2021-07-15 16:57:54 · 108 阅读 · 0 评论 -
长度最小的子数组
给定一个含有n个正整数的数组和一个正整数target。找出该数组中满足其和 >= target的长度最小的连续子数组,并返回长度。思路:暴力class Solution {public: int minSubArrayLen(int s, vector<int>& nums) { int result = INT32_MAX; //最终的结果 int sum = 0; // 子序列的数值之和 int subLength = 0; // 子序列的长度 for转载 2021-07-15 15:05:26 · 816 阅读 · 2 评论 -
存在重复元素III
给你一个整数数组nums和两个整数k和t。判断是否存在两个不同下标 i 和 j使得abs(nums[i] - nums[j]) <= t,同时又满足abs(i - j) <= k。如果存在,则返回true,否则false。输入:nums = [1, 2, 3, 1],k = 3,t = 0、输出:true输入:nums = [1,5,9,1,5,9], k = 2, t = 3输出:false思路:滑动窗口 + 有序集合对于序列中每一个元素x左侧的至多k个元素,如果这k个元原创 2021-07-14 15:01:14 · 101 阅读 · 0 评论 -
O(1)时间插入、删除和获取随机元素
设计一个支持在平均时间复杂度O(1)下,执行以下操作的数据结构。insert(val):当元素 val 不存在时,向集合中插入该项。remove(val):元素 val 存在时,从集合中移除该项。getRandom:随机返回现有集合中的一项。每个元素应该有相同的概率被返回。思路:利用动态数组的下标索引实现常数时间内的插入和随机元素的访问,再利用哈希表实现常数时间的删除操作。class RandomizedSet {private: unordered_map<int,int>原创 2021-07-13 19:24:34 · 281 阅读 · 0 评论 -
四数相加II
给定四个包含整数的数组列表A, B, C, D,计算有多少个元组class Solution {public: int fourSumCount(vector<int>& A, vector<int>& B, vector<int>& C, vector<int>& D) { unordered_map<int, int> umap; //key:a+b的数值,value:a+b数值出现的转载 2021-07-13 12:09:16 · 159 阅读 · 0 评论 -
搜索旋转排序数组II
已知存在一个按非降序排列的整数数组nums,数组中的值不必互不相同。思路:二分法class Solution {public: bool search(vector<int>& nums, int target) { int n = nums.size(); int left = 0, right = n - 1; while(left <= right){ // 重复数字原创 2021-07-13 11:54:31 · 63 阅读 · 0 评论