Leetcode
vector6_
linux c++/java
展开
-
区域和检索——数组不可变
区域和检索——数组不可变给定一个整数数组 nums,处理以下类型的多个查询:计算索引 left 和 right (包含 left 和 right)之间的 nums 元素的 和 ,其中 left <= right实现 NumArray 类:NumArray(int[] nums) 使用数组 nums 初始化对象int sumRange(int i, int j) 返回数组 nums 中索引 left 和 right 之间的元素的 总和 ,包含 left 和 right 两点(也就是 num原创 2022-05-01 20:48:40 · 267 阅读 · 0 评论 -
滑动窗口最大值
滑动窗口最大值给你一个整数数组 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 31 [3 -1 -3] 5 3 6 7原创 2022-04-30 14:15:05 · 104 阅读 · 0 评论 -
单调栈——每日温度
每日温度请根据每日 气温 列表 temperatures ,请计算在每一天需要等几天才会有更高的温度。如果气温在这之后都不会升高,请在该位置用 0 来代替。示例 1:输入: temperatures = [73,74,75,71,69,72,76,73]输出: [1,1,4,2,1,1,0,0]class Solution {public: vector<int> dailyTemperatures(vector<int>& temperatures原创 2022-04-30 14:14:38 · 566 阅读 · 0 评论 -
下一个更大元素II
下一个更大元素II给定一个循环数组(最后一个元素的下一个元素是数组的第一个元素),输出每个元素的下一个更大元素。数字 x 的下一个更大的元素是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地搜索它的下一个更大的数。如果不存在,则输出 -1。示例 1:输入: [1,2,1]输出: [2,-1,2]解释: 第一个 1 的下一个更大的数是 2;数字 2 找不到下一个更大的数;第二个 1 的下一个最大的数需要循环搜索,结果也是 2。与下一个更大元素相似,现在给定的数组是个环原创 2022-04-30 14:13:39 · 100 阅读 · 0 评论 -
下一个更大元素
下一个更大元素nums1 中数字 x 的 下一个更大元素 是指 x 在 nums2 中对应位置 右侧 的 第一个 比 x 大的元素。给你两个 没有重复元素 的数组 nums1 和 nums2 ,下标从 0 开始计数,其中nums1 是 nums2 的子集。对于每个 0 <= i < nums1.length ,找出满足 nums1[i] == nums2[j] 的下标 j ,并且在 nums2 确定 nums2[j] 的 下一个更大元素 。如果不存在下一个更大元素,那么本次查询的答案是原创 2022-04-30 14:12:53 · 317 阅读 · 0 评论 -
数据流的中位数
数据流的中位数中位数是有序列表中间的数。如果列表长度是偶数,中位数则是中间两个数的平均值。例如,[2,3,4] 的中位数是 3[2,3] 的中位数是 (2 + 3) / 2 = 2.5设计一个支持以下两种操作的数据结构:void addNum(int num) - 从数据流中添加一个整数到数据结构中。double findMedian() - 返回目前所有元素的中位数。示例:addNum(1)addNum(2)findMedian() -> 1.5addNum(3) fin原创 2022-04-30 14:12:12 · 154 阅读 · 0 评论 -
最大频率栈
最大频率栈设计一个类似堆栈的数据结构,将元素推入堆栈,并从堆栈中弹出出现频率最高的元素。实现 FreqStack 类:FreqStack() 构造一个空的堆栈。void push(int val) 将一个整数 val 压入栈顶。int pop() 删除并返回堆栈中出现频率最高的元素。如果出现频率最高的元素不只一个,则移除并返回最接近栈顶的元素。class FreqStack {public: FreqStack() { } void p原创 2022-04-30 14:11:41 · 307 阅读 · 0 评论 -
数据结构&算法——二叉搜索树
数据结构&算法——二叉搜索树BST 的特性:1、对于 BST 的每一个节点 node,左子树节点的值都比 node 的值要小,右子树节点的值都比 node 的值大。2、对于 BST 的每一个节点 node,它的左侧子树和右侧子树都是 BST。整体上BST也是基于递归的思想和方法,但额外的特性是中序遍历即有序二叉搜索树中第K小的元素给定一个二叉搜索树的根节点 root ,和一个整数 k ,请你设计一个算法查找其中第 k 个最小元素(从 1 开始计数)。/** * Definitio原创 2022-04-30 11:09:57 · 462 阅读 · 0 评论 -
数据结构&算法——二叉树
数据结构&算法——二叉树很多经典算法都是二叉树的变形。比如说快速排序就是个二叉树的前序遍历,归并排序就是个二叉树的后序遍历。快速排序的逻辑是,若要对 nums[lo..hi] 进行排序,我们先找一个分界点 p,通过交换元素使得 nums[lo..p-1] 都小于等于 nums[p],且 nums[p+1..hi] 都大于 nums[p],然后递归地去 nums[lo..p-1] 和 nums[p+1..hi] 中寻找新的分界点,最后整个数组就被排序了。快速排序的算法框架:void sort(原创 2022-04-30 11:09:24 · 249 阅读 · 0 评论 -
二叉树中的最大路径和
二叉树中的最大路径和路径 被定义为一条从树中任意节点出发,沿父节点-子节点连接,达到任意节点的序列。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点,且不一定经过根节点。路径和 是路径中各节点值的总和。给你一个二叉树的根节点 root ,返回其 最大路径和 。/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * Tr原创 2022-04-30 10:40:10 · 274 阅读 · 0 评论 -
在二叉树中找到两个节点的最近公共祖先
在二叉树中找到两个节点的最近公共祖先描述给定一棵二叉树(保证非空)以及这棵树上的两个节点对应的val值 o1 和 o2,请找到 o1 和 o2 的最近公共祖先节点。注:本题保证二叉树中每个节点的val值均不相同。示例1输入:[3,5,1,6,2,0,8,#,#,7,4],5,1返回值:3/** * struct TreeNode { * int val; * struct TreeNode *left; * struct TreeNode *right; * }; */原创 2021-10-07 22:26:54 · 176 阅读 · 0 评论 -
链表中环的入口结点
链表中环的入口结点描述给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,返回null。输入描述:输入分为2段,第一段是入环前的链表部分,第二段是链表环的部分,后台将这2个会组装成一个有环或者无环单链表返回值描述:返回链表的环的入口结点即可。而我们后台程序会打印这个节点示例1输入:{1,2},{3,4,5}返回值:3说明:返回环形链表入口节点,我们后台会打印该环形链表入口节点,即3 /*struct ListNode { int val; stru原创 2021-10-07 22:26:16 · 67 阅读 · 0 评论 -
未排序数组中累加和为给定值的最长子数组长度
未排序数组中累加和为给定值的最长子数组长度描述给定一个无序数组arr, 其中元素可正、可负、可0。给定一个整数k,求arr所有子数组中累加和为k的最长子数组长度输入描述:第一行两个整数N, k。N表示数组长度,k的定义已在题目描述中给出第二行N个整数表示数组内的数输出描述:输出一个整数表示答案示例1输入:5 01 -2 1 1 1输出:3#include<iostream>#include<unordered_map>using namespace原创 2021-10-07 22:25:18 · 52 阅读 · 0 评论 -
用递归函数和栈逆序一个栈
用递归函数和栈逆序一个栈描述一个栈依次压入1,2,3,4,5,那么从栈顶到栈底分别为5,4,3,2,1。将这个栈转置后,从栈顶到栈底为1,2,3,4,5,也就是实现栈中元素的逆序,但是只能用递归函数来实现,不能用其他数据结构。输入描述:输入数据第一行一个整数N为栈中元素的个数。接下来一行N个整数表示从栈顶依次到栈底的每个元素。输出描述:输出一行表示栈中元素逆序后的每个元素#include<iostream>#include<stack>using namespac原创 2021-10-07 22:21:09 · 72 阅读 · 0 评论 -
二叉树中和为某一值的路径
二叉树中和为某一值的路径输入一颗二叉树的根节点和一个整数,按字典序打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。Input: {10,5,12,4,7},22Output: [[10,5,7],[10,12]]/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x),原创 2021-10-07 22:01:27 · 66 阅读 · 0 评论 -
翻转单词序列
翻转单词序列牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“nowcoder. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a nowcoder.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?Input: “nowcoder. a am I”Output: “I am a nowcoder.”class S原创 2021-10-07 22:00:34 · 74 阅读 · 0 评论 -
合并k个已排序的链表
合并k个已排序的链表合并 k 个已排序的链表并将其作为一个已排序的链表返回。分析并描述其复杂度。Input : [{1,2,3},{4,5,6,7}]Output : {1,2,3,4,5,6,7}/*合并 k 个已排序的链表并将其作为一个已排序的链表返回。*/#include<vector>#include<list>#include<iostream>#include<queue>using namespace std;s原创 2021-10-07 21:39:14 · 93 阅读 · 0 评论 -
把数组排成最小的数
把数组排成最小的数输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。Input: [3,32,321]Output : “321323”class Solution {public: //自定义一个比较大小的函数,比较两个字符串s1, s2大小的时候,先将它们拼接起来,比较s1+s2,和s2+s1那个大,如果s1+s2大,那说明s2应该放前面原创 2021-10-07 21:38:01 · 75 阅读 · 0 评论 -
树的子结构
树的子结构输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)Input: {8,8,#,9,#,2,#,5},{8,9,#,2}Return: true子树和子结构的区别:子树的意思是包含了一个结点,就得包含这个结点下的所有节点,一棵大小为n的二叉树有n个子树,就是分别以每个结点为根的子树。子结构的意思是包含了一个结点,可以只取左子树或者右子树,或者都不取。/*struct TreeNode { int val; struct TreeN原创 2021-06-14 08:15:33 · 324 阅读 · 2 评论 -
连续子数组的最大和
连续子数组的最大和输入一个整型数组,数组里有正数也有负数。数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为 O(n).[1,-2,3,10,-4,7,2,-5]18输入的数组为{1,-2,3,10,—4,7,2,一5},和最大的子数组为{3,10,一4,7,2},因此输出为该子数组的和 18。class Solution {public: int FindGreatestSumOfSubArray(vector<int> array原创 2021-06-14 08:15:05 · 134 阅读 · 1 评论 -
复杂链表的复制
复杂链表的复制输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针random指向一个随机节点),请对此链表进行深拷贝,并返回拷贝后的头结点。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)/*struct RandomListNode { int label; struct RandomListNode *next, *random; RandomListNode(int x) : labe原创 2021-06-14 08:14:20 · 118 阅读 · 0 评论 -
栈的压入、弹出序列
栈的压入、弹出序列输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)[1,2,3,4,5],[4,3,5,1,2]falseclass Solution {public: bool IsPopOrder(vector<int&g原创 2021-06-14 08:13:50 · 138 阅读 · 0 评论 -
数组中只出现一次的数(其它数出现k次)
数组中只出现一次的数(其它数出现k次)给定一个整型数组 arr 和一个整数 k(k>1)。已知 arr 中只有 1 个数出现一次,其他的数都出现 k 次。请返回只出现了 1 次的数。class Solution {public: /** * @param arr intvector * @param k int * @return int */ /* 出现k次就不能再用异或的方法了,因为k(奇数)个相同的数异或还是得到本原创 2021-06-14 08:13:14 · 501 阅读 · 0 评论 -
字符串表达式加减乘法求值
字符串表达式加减乘法求值请写一个整数计算器,对于输入的字符串,支持加减乘三种运算和括号。示例1:“1+2”3示例2:“(2*(3-4))*5”-10class Solution {public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * 返回表达式的值 * @param s string字符串 待计算的表达式 * @return int整型 */ int solve原创 2021-06-05 19:13:34 · 856 阅读 · 6 评论 -
二叉树的之字形层序遍历
二叉树的之字形层序遍历给定一个二叉树,返回该二叉树的之字形层序遍历,(第一层从左向右,下一层从右向左,一直这样交替)/** * struct TreeNode { * int val; * struct TreeNode *left; * struct TreeNode *right; * }; */class Solution {public: /** * * @param root TreeNode类 * @return int整型ve原创 2021-06-05 19:12:07 · 116 阅读 · 1 评论 -
字符串出现次数的TopK问题
字符串出现次数的TopK问题给定一个字符串数组,再给定整数k,请返回出现次数前k名的字符串和对应的次数。返回的答案应该按字符串出现频率由高到低排序。如果不同的字符串有相同出现频率,按字典序排序。对于两个字符串,大小关系取决于两个字符串从左到右第一个不同字符的 ASCII 值的大小关系。比如"ah1x"小于"ahb",“231”<”32“字符仅包含数字和字母class Solution {public: /** * return topK string *原创 2021-06-05 19:10:02 · 297 阅读 · 0 评论 -
给定三角形ABC和一点P(x,y,z),判断点P是否在ABC内
给定三角形ABC和一点P(x,y,z),判断点P是否在ABC内给定三角形ABC和一点P(x,y,z),判断点P是否在ABC内根据面积法,如果P在三角形ABC内,那么三角形ABP的面积+三角形BCP的面积+三角形ACP的面积应该等于三角形ABC的面积。算法如下:#include <iostream>#include <math.h>using namespace std;#define ABS_FLOAT_0 0.0001struct point_float{ flo原创 2021-05-16 11:08:54 · 283 阅读 · 0 评论 -
最长公共子串
最长公共子串给定两个字符串str1和str2,输出两个字符串的最长公共子串题目保证str1和str2的最长公共子串存在且唯一。class Solution {public: /** * longest common substring * @param str1 string字符串 the string * @param str2 string字符串 the string * @return string字符串 */ string L原创 2021-05-16 11:08:22 · 80 阅读 · 0 评论 -
分糖果问题
分糖果问题一群孩子做游戏,现在请你根据游戏得分来发糖果,要求如下:每个孩子不管得分多少,起码分到一个糖果。任意两个相邻的孩子之间,得分较多的孩子必须拿多一些糖果。(若相同则无此限制)给定一个数组arr代表得分数组,请返回最少需要多少糖果。class Solution {public: /** * 遍历两次,先从左往右遍历一遍,如果右边孩子的评分比左边的高,则右边孩子的糖果数更新为左边孩子的糖果数加 1; * 再从右往左遍历一遍,如果左边孩子的评分比右边的高原创 2021-05-16 11:06:45 · 1886 阅读 · 0 评论 -
寻找第K大
寻找第K大有一个整数数组,找出数组中第K大的数。给定一个整数数组a,同时给定它的大小n和要找的K(K在1到n之间),请返回第K大的数,保证答案存在。class Solution {public: //使用优先队列(默认大顶堆)// int findKth(vector<int> a, int n, int K) {// priority_queue<int,vector<int>,greater<int>> pque原创 2021-05-16 11:05:49 · 777 阅读 · 2 评论 -
旋转数组的最小数字
旋转数组的最小数字把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。class Solution {public: int minNumberInRotateArray(vector<int> rotateArray) { if(rotateArray.size()==0) return 0;原创 2021-05-16 11:05:05 · 55 阅读 · 0 评论 -
LC-交换链表节点
交换链表节点/*将给定的链表中每两个相邻的节点交换一次,返回链表的头指针例如,给出1->2->3->4,你应该返回链表2->1->4->3。你给出的算法只能使用常量级的空间。你不能修改列表中的值,只能修改节点本身。*/ struct ListNode { int val; struct ListNode *next; ListNode(int val_) :val(val_) {} };class Solution {public: /**原创 2021-01-24 00:52:40 · 119 阅读 · 0 评论 -
LC-链表中的节点每k个一组翻转
链表中的节点每k个一组翻转/*将给出的链表中的节点每k 个一组翻转,返回翻转后的链表如果链表中的节点数不是k 的倍数,将最后剩下的节点保持原样你不能更改节点中的值,只能更改节点本身。要求空间复杂度O(1)例如:给定的链表是1→2→3→4→5对于 k=2, 你应该返回 2→1→4→3→5对于 k=3, 你应该返回 3→2→1→4→5*/struct ListNode { int val; struct ListNode *next; ListNode(int val) :val(v原创 2021-01-24 00:51:29 · 123 阅读 · 0 评论 -
LC-有序数组删除重复数字
有序数组删除重复数字/*给定一个已排序的数组,使用就地算法将重复的数字移除,使数组中的每个元素只出现一次,返回新数组的长度。 不能为数组分配额外的空间,你必须使用常熟级空间复杂度的就地算法。 例如,给定输入数组 A=[1,1,2],你给出的函数应该返回length=2,A数组现在是[1,2]。*/#include<iostream>using namespace std;class Solution {public: int removeDuplicates(int A[]原创 2021-01-24 00:49:53 · 120 阅读 · 0 评论 -
LC-删除元素
删除元素class Solution {public: int removeElement(int A[], int n, int elem) { if (n == 0) return 0; for (int i = 0; i < n; ++i) { if (A[i] == elem) { swap(A[i], A[n - 1]); n--; --i; } } return n; }};...原创 2021-01-24 00:49:31 · 84 阅读 · 0 评论 -
LC-实现函数 strStr
实现函数 strStr/*实现函数 strStr函数声明如下:char *strStr(char *str, char *dest)返回一个指针,指向dest第一次在str中出现的位置,如果dest不是str的子串,则返回null*/#include<string>#include<algorithm>#include<iostream>using namespace std;class Solution {public: char *strStr(原创 2021-01-24 00:48:15 · 213 阅读 · 0 评论 -
LC-两数相除
两数相除/*在不使用乘法运算符,除法运算符和取余运算符的情况下对两个数进行相除操作*/#include<math.h>#include<iostream>using namespace std;class Solution {public: /** * * 直接减遇到大数时容易超时,使用位移<<1(成倍加)来降低复杂度,需要注意符号 */ int divide(int dividend, int divisor) { bool minus = f原创 2021-01-24 00:47:44 · 391 阅读 · 0 评论 -
LC-下一个排列
下一个排列/*实现函数next permutation(下一个排列):将排列中的数字重新排列成字典序中的下一个更大的排列。将排列中的数字重新排列成字典序中的下一个更大的排列。如果不存在这样的排列,则将其排列为字典序最小的排列(升序排列)需要使用原地算法来解决这个问题,不能申请额外的内存空间下面有机组样例,左边是输入的数据,右边是输出的答案1,2,3→1,3,23,2,1→1,2,31,1,5→1,5,1*/#include<vector>#include<algorit原创 2021-01-24 00:47:21 · 96 阅读 · 0 评论 -
最长的括号子串
最长的括号子串/*给出一个仅包含字符'('和')'的字符串,计算最长的格式正确的括号子串的长度。对于字符串"(()"来说,最长的格式正确的子串是"()",长度为2.再举一个例子:对于字符串")()())",来说,最长的格式正确的子串是"()()",长度为4.*/#include<stack>#include<algorithm>using namespace std;class Solution {public: /** * * indexStack中保存左括弧原创 2021-01-24 00:46:14 · 202 阅读 · 0 评论 -
在转动过的有序数组中寻找目标值
在转动过的有序数组中寻找目标值//旋转排序数组搜索/*给出一个转动过的有序数组,你事先不知道该数组转动了多少(例如,0 1 2 4 5 6 7可能变为4 5 6 7 0 1 2).在数组中搜索给出的目标值,如果能在数组中找到,返回它的索引,否则返回-1。假设数组中不存在重复项。*/class Solution {public: /** * * @param A int整型一维数组 * @param n int A数组长度 * @param target int整型 * @retur原创 2021-01-24 00:45:49 · 159 阅读 · 0 评论