LeetCode刷题
weixin_45794299
这个作者很懒,什么都没留下…
展开
-
leetcode-44. 通配符匹配-支持 ‘?‘ 和 ‘*‘ 的通配符匹配
一、题目二、思路三、代码class Solution {public: bool isMatch(string s, string p) { int m = s.size(); int n = p.size(); vector<vector<int>> dp(m + 1, vector<int>(n + 1)); dp[0][0] = true; for (int i原创 2022-04-24 10:14:17 · 1545 阅读 · 0 评论 -
leetcode-1721. 交换链表中的节点-双指针方式找到两个节点
一、题目二、思路1、采用双指针方式找到两个节点2、交换两个节点的值三、代码class Solution {public: ListNode* swapNodes(ListNode* head, int k) { ListNode *fast=head; ListNode *cur=head; for(int i=0;i<k-1;++i){ cur=cur->next; }原创 2022-04-23 23:07:41 · 1382 阅读 · 0 评论 -
leetcode-2095. 删除链表的中间节点-双指针-慢指针新建一个头指针(要删除下一个)
一、题目二、思路1、双指针,快指针指向空时,慢指针指向中间节点2、慢指针新建一个头指针,方便删除下一个三、代码class Solution {public: ListNode* deleteMiddle(ListNode* head) { ListNode *fast=head; ListNode *slow=new ListNode(0); ListNode *node=slow; slow->next=head;原创 2022-04-23 16:01:55 · 632 阅读 · 0 评论 -
leetcode-剑指 Offer 46. 把数字翻译成字符串-0到25翻译成子母,有几种不同的法翻译
一、题目二、思路1、采用dfs2、传入加判断条件,比如不能超过25,传两个数时第一个数不能为0三、代码class Solution {public: int Count; int translateNum(int num) { Count=0; string str=to_string(num); int len=str.length(); dfs(str,len,0); return Count;原创 2022-04-23 14:37:46 · 150 阅读 · 0 评论 -
leetcode-剑指 Offer II 119. 最长连续序列的长度(连续序列是指0123456一直连续,数组顺序可以是乱的)
一、题目二、思路1、添加到哈希容器中2、遍历,找到当前数的前一个,如果不在哈希容器中,就从当前数while遍历到后面,找到长度三、代码class Solution {public: int longestConsecutive(vector<int>& nums) { unordered_set<int> dic; int size=nums.size(); for(int i=0;i<size;++原创 2022-04-21 23:03:21 · 297 阅读 · 1 评论 -
leetcode-牛客-最长上升子序列(三)-最长递增子序列(求出具体的递增子序列,不是个数)-动态规划
一、题目二、思路1、动态规划,在求出最长递增子序列个数的基础上,找到具体的值2、先求出长度3、找到dp[i]等于当前长度的值,添加到输出容器三、代码class Solution {public: /** * retrun the longest increasing subsequence * @param arr int整型vector the array * @return int整型vector */ vector<int&原创 2022-04-21 22:32:08 · 216 阅读 · 0 评论 -
leetcode-牛客网-最长公共子序列-II-找出具体的最长公共子序列(不是长度)
一、题目二、思路1、动态规划找到最长公共序列的长度1、构建二维数组dp[s1.size()+1][s2.size()+1];(注意+1)2、令dp[i][0]、dp[0][i]都为03、两个for循环,s[i]和s[j]当相等时,在左上角的dp上+1;不相等时取左边和上边的最大者2、回溯找到具体的字符从右下角开始,退出条件为dp[i][j]>=1;当s[i]和s[j]相等时,记录字符,然后i–,j–跳到左上角当s[i]和s[j]不相等时,如果上面的dp[i-1][j]>=d原创 2021-05-26 11:08:31 · 299 阅读 · 0 评论 -
leetcode-剑指 Offer II 095. 最长公共子序列--求长度
一、题目二、思路二维动态规划dp[i][j]表示的text1的i-1和text2的j-1之间的公共子序列的长度三、代码class Solution {public: int longestCommonSubsequence(string text1, string text2) { int len1=text1.length(); int len2=text2.length(); vector<vector<int>&原创 2022-04-21 20:32:30 · 126 阅读 · 0 评论 -
leetcode-674. 最长连续递增子序列的个数
一、题目二、思路方法一先对arr进行排序从第二个开始遍历,判断当前的值是否是等于前一个值+1,TempLen++;判断当前值是否和前一个值相等,如果相等则continue其他情况,TempLen=1;考虑到最后一个可能和上一个值相等,所以最后再将MaxLen和TempLen比较下。方法二:利用set去重三、代码class Solution {public: /** * max increasing subsequence * @param arr in原创 2021-08-06 23:52:24 · 59 阅读 · 0 评论 -
二叉树前序、中序、后续的迭代遍历
一、前序遍历注意:先添加右子树,再添加左子树class Solution {public: vector<int> preorderTraversal(TreeNode* root) { stack<TreeNode*> st; vector<int> result; if (root == NULL) return result; st.push(root); while (!原创 2021-08-04 12:20:55 · 66 阅读 · 0 评论 -
leetcode-在二叉树中找到两个节点的最近公共祖先
一、题目描述给定一棵二叉树以及这棵树上的两个节点 o1 和 o2,请找到 o1 和 o2 的最近公共祖先节点。示例1输入:[3,5,1,6,2,0,8,#,#,7,4],5,1返回值:3二、思路1、dfs深度搜索,然后加返回条件2、条件:root为空或者==o1、o2,返回;深搜完后返回条件见代码/** * struct TreeNode { * int val; * struct TreeNode *left; * struct TreeNode *right; * };原创 2021-06-08 09:39:45 · 131 阅读 · 0 评论 -
leetcode-二叉树中和为某一值的路径-从根节点到叶子节点的每一条路径
一、题目二、思路这道题和求二叉树所有路径的那道题相似方法:dfs深度搜索1)定义一个变量等于总和,定义一个vector容器接收这个总和;传入参数为根节点,vector容器,总和变量2)root==nullptr,直接返回3)根节点不为空,然后判断左右子树是否为空;左右子树都为空,则添加根节点的值到总和中,然后添加到容器中;其中一个为空,则result累加,再进行另一个子树的dfs递归;都不为空,则result累加,左右子树都dfs递归;4)最后判断sum是否在vector容器中,是则返回tr原创 2021-06-11 11:23:48 · 80 阅读 · 2 评论 -
leetcode-543. 二叉树的直径-最长路径的长度减一
一、题目二、思路1、和最长路径相似,不一定从根节点开始2、指的是这条路径上有多少个节点,再减去1三、代码class Solution {public: int ans; int diameterOfBinaryTree(TreeNode* root) { ans=1; depth(root); return ans-1; } int depth(TreeNode* root){ if(root==n原创 2022-04-20 15:57:53 · 345 阅读 · 0 评论 -
leetcode-119. 杨辉三角 II-返回「杨辉三角」的第 rowIndex 行。
一、题目二、思路三、代码class Solution {public: vector<int> getRow(int rowIndex) { vector<vector<int>>res(rowIndex+1); for(int i=0;i<=rowIndex;++i){ res[i].resize(i+1); res[i][0]=1; res[原创 2022-03-24 15:31:05 · 887 阅读 · 0 评论 -
leetcode-118. 杨辉三角-生成「杨辉三角」的前 numRows 行
一、题目二、思路res[i].resize(i+1)重设元素个数三、代码class Solution {public: vector<vector<int>> generate(int numRows) { vector<vector<int>>res(numRows); for(int i=0;i<numRows;++i){ res[i].resize(i+1);原创 2022-03-24 11:54:46 · 1113 阅读 · 0 评论 -
01背包-完全背包问题--每个物体可以多次选取
一、题目有N件物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。每件物品都有无限个(也就是可以放入背包多次),求解将哪些物品装入背包里物品价值总和最大。二、思路三、代码// 先遍历物品,在遍历背包void test_CompletePack() { vector<int> weight = {1, 3, 4}; vector<int> value = {15, 20, 30}; int bagWe原创 2022-03-24 11:01:00 · 727 阅读 · 0 评论 -
01背包问题-每个物品只能选一次-动态规划dp[i][j]
一、题目有N件物品和一个最多能被重量为W 的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。每件物品只能用一次,求解将哪些物品装入背包里物品价值总和最大。二、思路三、代码void test_2_wei_bag_problem1() { vector<int> weight = {1, 3, 4}; vector<int> value = {15, 20, 30}; int bagWeight = 4; /原创 2022-03-24 10:33:33 · 1834 阅读 · 0 评论 -
leetcode-两个链表的第一个公共结点--相交链表--双指针(a+b=b+a)、哈希
一、题目描述输入两个无环的单链表,找出它们的第一个公共结点。(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的)二、思路1、有公共节点的概念有公共节点是指两个链表从第一个公共节点开始,剩下的节点都是相同的2、把两个链表转换为相同长度的链表。然后用双指针找到第一个节点转换方法:a+b=b+a三、代码/*struct ListNode { int val; struct ListNode *next; ListNode(int x) :原创 2021-06-07 10:03:02 · 72 阅读 · 0 评论 -
leetcode-链表中环的入口节点-第一次判断是否有环,第二次两个指针从(head,fast)同时开始遍历
一、题目题目描述对于一个给定的链表,返回环的入口节点,如果没有环,返回null拓展:你能给出不利用额外空间的解法么?二、思路1、一个快指针、一个慢指针2、再跑第二次3、注意fast!=NULL && fast->next!=NULL,如果没有后面那个,将会报出越界的错误三、代码/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *原创 2022-03-24 09:39:14 · 594 阅读 · 0 评论 -
leetcode-349. 两个数组的交集--公共部分--通过两个set数组去重,判断是否在set容器里
一、题目二、思路1、通过两个set数组去重2、判断是否在set容器里三、代码class Solution {public: vector<int> intersection(vector<int>& nums1, vector<int>& nums2) { int size1=nums1.size(); int size2=nums2.size(); set<int>dic1原创 2022-03-21 22:12:26 · 303 阅读 · 0 评论 -
leetcode-搜索旋转数组中指定值--返回指定值下标--有重复元素
一、题目二、思路三、代码class Solution {public: int search(vector<int>& arr, int target) { int size=arr.size(); int left=0,right=size-1; int mid=0; while(left<=right){ mid=(left+right)/2; /原创 2022-03-21 21:59:18 · 288 阅读 · 0 评论 -
leetcode-81. 搜索旋转排序数组 II--查找指定值在不在--bool--有重复的元素
一、题目二、思路三、代码class Solution {public: bool search(vector<int> &nums, int target) { int n = nums.size(); if (n == 0) { return false; } if (n == 1) { return nums[0] == target;原创 2022-03-21 20:43:56 · 510 阅读 · 0 评论 -
leetcode-153. 寻找旋转排序数组中的最小值-平移数组--不含重复元素
一、题目二、思路三、代码class Solution {public: int findMin(vector<int>& nums) { int low = 0; int high = nums.size() - 1; while (low < high) { int pivot = low + (high - low) / 2; if (nums[pivot]原创 2022-03-20 19:59:03 · 223 阅读 · 0 评论 -
leetcode-154. 寻找旋转排序数组中的最小值 II--平移数组--有重复的数组
一、题目二、思路三、代码class Solution {public: int findMin(vector<int>& nums) { int low = 0; int high = nums.size() - 1; while (low < high) { int pivot = low + (high - low) / 2; if (nums[pivot]原创 2022-03-20 19:48:33 · 730 阅读 · 0 评论 -
leetcode-189. 轮转数组-旋转数组-平移数组
一、题目二、思路三、代码一class Solution {public: void rotate(vector<int>& nums, int k) { int size=nums.size(); k=k%size; reverse(nums.begin(),nums.end()); reverse(nums.begin(),nums.begin()+k); reverse(nums.be原创 2022-03-20 19:14:48 · 514 阅读 · 0 评论 -
leetcode-Lazada-输入多组数据,查找范围内的质数个数
一、题目输入多组数据,查找范围内的质数二、思路1、找到一个最大的右范围2、设置一个dp[maxnum+1],1表示是质数,0表示非质数;初始化都为13、当一个数是1,即为质数,那么从ii开始,每加一个i都是非质数,置为0for(int j=ii;j<=right;j+=i){dp[j]=0;}4、统计dp数组,动态规划ans[i]三、代码#include <iostream>#include <string.h>#include <string&原创 2022-03-18 11:02:57 · 419 阅读 · 0 评论 -
leetcode-剑指 Offer 54. 二叉搜索树的第k大节点
一、题目二、思路先遍历右子节点,在中,再左,。这样就从大到小排序了。十分简单。需要注意的是k值需要提出来,不要作为参数传,因为会导致数据不同步。三、代码class Solution { int max,k; public int kthLargest(TreeNode root, int k) { this.k = k; maxValue(root); return max; } void maxValue(Tree原创 2022-03-16 14:56:12 · 338 阅读 · 0 评论 -
leetcode-230. 二叉搜索树中第K小的元素-中序遍历
一、题目二、思路1、采用二叉树的中序遍历,先把所有的左子树添加进去,再开始计数到k三、代码/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {} * TreeNode(int原创 2022-03-16 14:52:49 · 1112 阅读 · 0 评论 -
LeetCode 694. 不同岛屿的数量(DFS+set)
一、题目二、思路请你计算这个网格中共有多少个形状不同的岛屿。两个岛屿被认为是相同的,当且仅当一个岛屿可以通过平移变换(不可以旋转、翻转)和另一个岛屿重合。记录开始BFS或DFS的起点,后续点跟起点做差,存储路径到set中去重,返回 set 的大小三、代码class Solution { vector<vector<int>> dir = {{1,0},{0,1},{0,-1},{-1,0}}; int m, n; set<vector&原创 2022-03-16 09:52:32 · 240 阅读 · 0 评论 -
leetcode-剑指 Offer 32 - III. 从上到下打印二叉树 III-之字形打印二叉树
一、题目二、思路打印奇数层: 从左向右 打印,先左后右 加入下层节点;(根节点为奇数层)打印偶数层: 从右向左 打印,先右后左 加入下层节点;三、代码/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), righ原创 2022-03-13 19:34:44 · 1568 阅读 · 0 评论 -
LeetCode-面试题32 - I. 从上到下打印二叉树-层序遍历二叉树-从左到右
一、题目二、思路直接用层序遍历即可三、代码/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {public: vecto原创 2022-03-13 18:46:34 · 462 阅读 · 0 评论 -
LeetCode-买卖股票的最好时机-买卖股票的最佳时机-实时维护一个最小值-只能买卖一次
一、题目二、思路首先是动态规划:问题的实质是第i天-前面的天数值最大两个for循环,dp[i][j]记录差值,然后用result实时比较最大的三、代码class Solution {public: /** * * @param prices int整型vector * @return int整型 */ int maxProfit(vector<int>& prices) { int dp[price原创 2021-06-08 17:19:01 · 79 阅读 · 0 评论 -
vector扩容时间复杂度
一、题目考虑vector每次内存扩充两倍的情况,插入n个数二、时间复杂度时间复杂度:扩容log(n)次,扩容时间复杂度2N,拷贝时间复杂度N,总的时间复杂度3N次扩充引起的元素拷贝次数为:原创 2022-03-13 12:01:13 · 1335 阅读 · 2 评论 -
leetcode-215. 数组中的第K个最大元素-topk-数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。
一、题目二、思路三、代码class Solution {public: int findKthLargest(vector<int>& nums, int k) { int size=nums.size(); priority_queue<int>Que; for(int i=0;i<size;++i){ Que.push(nums[i]); } w原创 2022-03-13 11:14:13 · 570 阅读 · 0 评论 -
leetcode-347. 前 K 个高频元素-topk
一、题目二、思路1、用unordered_map容器统计个数2、将统计好的个数放入到优先队列,按个数排序3、从优先队列取出k个数到输出数组res中三、代码struct cmp{ bool operator()(pair<int,int>&a,pair<int,int>&b){ return a.first<b.first; }};class Solution {public: vector<int原创 2022-03-13 11:08:46 · 8547 阅读 · 0 评论 -
leetcode-二叉树的最大深度
一、题目二、思路1、层序遍历,记录深度2、递归,前序遍历当root==nullptr,返回0然后返回1+max(左子树,右子树)三、代码一/** * struct TreeNode { * int val; * struct TreeNode *left; * struct TreeNode *right; * }; */class Solution {public: /** * * @param root TreeNode类 *原创 2021-06-08 17:41:03 · 38 阅读 · 0 评论 -
auto和decltype的配合使用
auto和decltype的配合使用template<typename T, typename U>auto add(T t, U u) -> decltype(t + u) { return t + u;}原创 2022-03-11 09:02:39 · 136 阅读 · 0 评论 -
快速排序-完整实现-快排-递归-非递归
一、思路1、采用递归方法,然后采用两个指针移动的方法2、快速排序思路:第一步:选定一个初始值(一般为第一个);第二步:从右边开始找起,找到第一个比初始值低的值,将两个交换第三步:从左边开始找起,找到第一个比初始值高的值,将两者交换第四步:当两个指针相遇的时候,第一轮快排完成第五步:递归,传入数组,开始的两个指针二、代码#include <iostream>#include <string>#include <vector>#include <原创 2021-05-20 21:00:29 · 179 阅读 · 0 评论 -
leetcode-合并两个有序的数组-C++-双指针-从后面开始添加到A的最后(大的)
一、题目题目描述给出两个有序的整数数组 和 ,请将数组 合并到数组 中,变成一个有序的数组注意:可以假设 数组有足够的空间存放 数组的元素, 和 中初始的元素数目分别为 和二、思路1、这个和归并排序还是有点相似,归并排序是把两个数组每次取出一个相互比较存入到另一个数组2、这个是把B数组添加到A数组中,从后往前插入,即每次比较A、B数组最大的那个,然后插入到A数组的最后一个,依次往前推三、代码class Solution {public: void merge(int A[], i原创 2021-05-07 15:34:09 · 80 阅读 · 0 评论 -
LeetCode-27. 移除元素-原地删除数组中指定值的元素-双指针
一、题目二、思路二、思路1、双指针2、右指针不等于时,左右指针同时往右移动;相等时,移动右指针三、代码class Solution {public: int removeElement(vector<int>& nums, int val) { //双指针解法 int left=0; int size=nums.size(); for(int i=0;i<size;++i){原创 2022-03-10 19:57:35 · 159 阅读 · 0 评论