![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
刷题
samoyan
分享技术成长的日常
展开
-
leetcode:反转链表II 和k个一组反转链表的C++实现
此代码通过迭代的方式,反转了单链表的一部分。它首先使用一个哑节点简化操作,然后通过两个循环移动节点,逐步实现链表的局部反转。最终返回新链表的头节点。此代码通过迭代的方式,每次反转链表中的k个节点。它首先使用一个哑节点简化操作,然后通过两个循环,一是计算链表长度,二是进行分组反转。最终返回新链表的头节点。原创 2024-03-08 17:08:00 · 1263 阅读 · 0 评论 -
leetcode:二叉树的左右子树反转的递归和迭代的C++实现
在迭代方法中,我们使用一个队列来存储那些需要交换子节点的树节点。在队列不为空的情况下,我们不断地从队列中取出节点,交换它们的左右子节点,然后将它们的子节点(如果存在的话)加入队列中继续处理。这个过程会持续到队列为空,即所有节点都被处理过为止。上述解决方案使用了递归方法,它是简洁且易于理解的。然而,也可以使用迭代方法来反转二叉树,通常使用队列或栈来实现。给定一个二叉树,将其每个节点的左右子树进行反转。// 交换当前节点的左右子树。// 将子节点加入队列。// 交换当前节点的左右子树。// 递归反转左右子树。原创 2024-03-08 16:49:31 · 770 阅读 · 0 评论 -
leetcode:反转链表II,用C++ 实现
的链表节点,返回反转后的链表。原创 2024-03-07 11:35:13 · 460 阅读 · 0 评论 -
LeetCode: 数组中的第K个最大元素以及寻找最小/最大的K个数
在未排序的数组中找到第k个最大的元素。请注意,你需要找的是数组排序后的第k个最大的元素,而不是第k个不同的元素。快速选择的平均时间复杂度为O(N),最坏情况下的时间复杂度为O(N^2),空间复杂度为O(1)。这种方法的时间复杂度为O(NlogN),空间复杂度为O(1)(如果使用的是原地排序算法)。这种方法的时间复杂度为O(NlogK),空间复杂度为O(K)。原创 2024-03-01 14:54:36 · 661 阅读 · 0 评论 -
leetcode 使用栈方法和动态规划解决[32] 最长有效括号 C++
/* * @lc app=leetcode.cn id=32 lang=cpp * * [32] 最长有效括号 * * https://leetcode-cn.com/problems/longest-valid-parentheses/description/ * * algorithms * Hard (35.41%) * Likes: 1396 * Dislikes: 0 * Total Accepted: 173.1K * Total Submissions: .原创 2022-01-10 18:11:27 · 189 阅读 · 0 评论 -
搜索旋转排序数组-使用二分法
这类题核心点是将mid 跟右侧点进行比较,这样可以得到mid左侧还是右侧是有序的,然后跟缩小检测空间,当相等的时候,没有办法确定左侧还是右侧是有序的,这个时候进行r--。搜索旋转排序数组- 无重复数字* [33] 搜索旋转排序数组* 力扣 int search(vector<int>& nums, int target) { int n = nums.size(); int l = 0; int r = n-1;...原创 2021-11-03 11:11:02 · 91 阅读 · 0 评论 -
二叉树的前序遍历,中序遍历,后序遍历的递归和非递归实现
class TreeNode{public: int val; TreeNode * left; TreeNode * right; TreeNode(int num) { val = num; left = NULL; right = NULL; }}void PreOrderTraversalRecursive(TreeNode* root,vector<int> &res).原创 2021-09-14 15:00:25 · 131 阅读 · 0 评论 -
leetcode 146 LRU C++ 实现
LRU :1、整体使用哈希双向链表,哈希用于快速找到需要处理的链表节点链表用于表示各个节点的顺序LRU (最近最少使用) 缓存机制。class Node{public: int key,value; Node *next,*pre; Node(int k, int v) { key = k; value = v; }};struct DoubleList{private: Node...原创 2021-05-07 16:10:08 · 147 阅读 · 0 评论 -
leetcode 45 跳跃游戏II 的动态规划和贪心算法实现
leetcode 45 跳跃游戏II方法一:动态规划 int jump(vector<int>& nums) { int n = nums.size(); vector<int> dp(n,n); // 达到i需要的步数dp[i] dp[0] = 0; for(int i = 0; i<n; i++) { for(int k = 0; k<i;k++)原创 2021-04-02 10:05:10 · 113 阅读 · 0 评论 -
使用bitmap处理海量数据的统计问题
bitmap是使用int型的byte位来表示某个数字是否存在。一个int型占4个字节,共有32位,可以表示32个数字。通过判断某一位是否为1来确定某一个数是否存在。 vector<unsigned int> bitVec(INT_MAX>>5+1,0);//全部的数子需要多少个int数字表示 void bitmapSet(int val) { int index = val>>5;//获取第几个数字 int原创 2021-03-03 13:50:46 · 458 阅读 · 0 评论 -
union_find算法实现——以leetcode 200 岛屿数量为例(也可以dfs实现)
1、 定义一个全局变量存储每个点的parent以及实现unorder_map<int,int>p;int find(int x){ if(p[x]!= x) { p[x] = find(p[x]); return p[x]; } return x;}void unionxy(int x,int y ){ p[find(x)] = find(y);}bool isConnect(int x, int y){ return find(x) == find原创 2021-02-26 15:09:00 · 166 阅读 · 0 评论 -
迭代法 c++ 实现 二叉树的前序遍历,后续遍历,中序遍历
vector<int> preorderTraversal(TreeNode* root) { vector<int> res; stack<TreeNode*> st; TreeNode *p = root; while(p|| !st.empty()) { while(p) { res.push_back(p->val); st.push(p.原创 2021-02-23 17:26:36 · 175 阅读 · 0 评论 -
leetcode 接雨水问题 双指针解法和单调栈解法
int trap(vector<int>& height) {// 单调栈解法 int n = height.size(); int ans = 0; stack<int> st; for(int i = 0;i<n;i++) { while(!st.empty() and height[i] > height[st.top()]) .原创 2021-02-23 15:38:28 · 109 阅读 · 0 评论 -
c++ 堆排序 以及堆排序比快排慢的原因
void heap_build(vector<int>& nums, int root,int length)// 某个节点为k,那么他的父节点下标为(k-1)/2,左右子节点下标为2k+1,2k+2{ int l_child = root * 2 + 1; if (l_child < length) { int flag = l_child; int r_child = l_child + 1; if (r_child < length and n.原创 2020-12-01 17:14:37 · 293 阅读 · 0 评论 -
C++ 堆排序 leetcode
void heap_build(vector<int>& nums, int root,int length)// 某个节点为k,那么他的父节点下标为(k-1)/2,左右子节点下标为2k+1,2k+2{ int l_child = root * 2 + 1; if (l_child < length) { int flag = l_child; int r_child = l_child + 1; if (r_child < length and n.原创 2020-11-17 16:38:46 · 123 阅读 · 0 评论 -
leetcode C++ 地图分析 bfs框架解析
序号:1162难度:中等题目:地图分析开发语言:python或C++链接:https://leetcode-cn.com/problems/as-far-from-land-as-possible1、bfs框架while queue 非空: node = queue.pop() for node 的所有相邻节点m: If m没有被访问过: queue.push(m)2、题解:classSolution{publ...原创 2020-11-11 17:04:20 · 373 阅读 · 0 评论 -
leetcode C++ 动态规划解决 买卖股票的最佳时机含手续费
序号:714地址: https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-with-transaction-fee开发语言:python或C++题目:买卖股票的最佳时机含手续费难度: 中等规则:给定一个整数数组prices,其中第i个元素代表了第i天的股票价格 ;非负整数fee 代表了交易股票的手续费用。你可以无限次地完成交易,但是你每笔交易都需要付手续费。如果你已经购买了一个股票,在卖出...原创 2020-11-06 14:47:47 · 227 阅读 · 0 评论 -
C++ 给定一个数组和目标值,输出子集和为目标值的所有可能 使用dfs回溯法
vector<vector<int>> res;vector<int> seq;vector<vector<int>> freq;void combine_sum_dfs(int pos, int rest){ if (rest == 0) { res.push_back(seq); return; } if (pos == freq.size() or rest < freq[pos][0]) return;.原创 2020-11-05 16:51:44 · 624 阅读 · 0 评论 -
C++ 迭代法和递归法 实现归并排序
void merge_sort_recursive(vector<int> & nums, int low, int high){ if (low >= high) return; int n = nums.size(); int mid = low + (high - low) /2; merge_sort_recursive(nums, low, mid); merge_sort_recursive(nums, mid+1, high); vector&.原创 2020-11-05 11:18:48 · 234 阅读 · 0 评论 -
leetcode C++ 使用dfs解决 岛屿数量问题
序号:200地址:https://leetcode-cn.com/problems/number-of-islands/开发语言:python或C++题目:岛屿数量难度: 中等规则:给你一个由'1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量。岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。此外,你可以假设该网格的四条边均被水包围。classSolution{public:voiddfs_...原创 2020-11-04 16:30:27 · 228 阅读 · 0 评论 -
leetcode C++ 回溯法求 子集I(无重复元素) 子集II(有重复元素)
序号:78难度:中等题目:子集开发语言:python或C++链接:https://leetcode-cn.com/problems/subsets/规则:给定一组不含重复元素的整数数组nums,返回该数组所有可能的子集(幂集)。vector<vector<int>> res;void backtrack(vector<int>nums, vector<int>&path, int start){ res.push_..原创 2020-11-02 16:44:49 · 335 阅读 · 0 评论 -
LeetCode C++ 判断n的阶乘后有多少个0,以及满足阶乘后K个0的数的个数
long trailingZeroes(long n) //判断n!结果末尾有多少个0{ long res = 0; for (long d = n; d / 5 > 0; d = d / 5) { res += d / 5; } return res;}long leftBound(long target){ long low = 0; long high = LONG_MAX - 1; while (low <= high) { long mid = lo.原创 2020-11-02 10:41:20 · 373 阅读 · 0 评论 -
LeetCode C++ 两种方法使用dfs求解朋友圈的个数(最大联通分量的个数?)
int findCircleNum(vector<vector<int>>& M) { int n = M.size(); vector<vector<int>> map_n(n); vector<bool> visit(n, false); for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { if (M[i][j] == 1 and .原创 2020-10-30 11:12:04 · 446 阅读 · 0 评论 -
C++中queue和deque的区别以及使用deque实现单调队列,进行求滑动窗口最大值
C++中queue和deque的区别queue只能从队尾插入,对头弹出queue<int> q;q.push(0); // 插入q.pop(); // 弹出int tmp = q.front(); // 取对头元素int tmp = q.back(); // 取队尾元素deque 能从对头插入弹出,还可以从队尾插入弹出deque<int> dq;dq.push_front(0);//对头插入dq.push_back(0);//对尾插入d原创 2020-10-30 10:35:53 · 550 阅读 · 0 评论 -
C++ 使用bfs求从起点到目标点的最短距离,使用了队列queue
//计算从起点start到目标点target 的最短距离int bfs(node start, node target){ queue<node> q; set<node> visit; q.push(start); visit.inset(start); int step = 0; //记录步数 while (!q.empty()) { int sz = q.size(); // 将队列中的所有节点向四周扩散 for (int i = 0; i...原创 2020-10-29 14:00:12 · 600 阅读 · 0 评论 -
c++ leetcode 使用动态规划,循环,马拉车算法 三种方法 求解最长回文子串
// 马拉车算法string Manacher(string & query){ string ss = "^#"; for (auto s : query) ss = ss + s + '#'; ss += '$'; vector<int> p(ss.length(), 0); int center = 0; int mx = 0; string max_str = ""; cout << ss << endl; for...原创 2020-10-26 17:35:12 · 134 阅读 · 0 评论 -
LeetCode c++ 使用二分法搜索左边界 求h 指数
序号:275地址:https://leetcode-cn.com/problems/h-index-ii/开发语言:python或C++题目:H 指数难度: 中等规则:给定一位研究者论文被引用次数的数组(被引用次数是非负整数),数组已经按照升序排列。编写一个方法,计算出研究者的 h 指数。h 指数的定义: “h 代表“高引用次数”(high citations),一名科研人员的 h 指数是指他(她)的 (N 篇论文中)总共有 h 篇论文分别被引用了至少 h 次。(其余的N ...原创 2020-10-26 15:39:04 · 160 阅读 · 0 评论 -
leetcode 374 猜数字游戏 C++ 使用二分法(多种解法)
序号:374 (二分)地址:https://leetcode-cn.com/problems/guess-number-higher-or-lower/开发语言:python或C++猜数字游戏的规则如下:每轮游戏,我都会从1到n 随机选择一个数字。 请你猜选出的是哪个数字。如果你猜错了,我会告诉你,你猜测的数字比我选出的数字是大了还是小了。你可以通过调用一个预先定义好的接口 int guess(int num) 来获取猜测结果,返回值一共有 3 种可能的情况(-1,1或 0)...原创 2020-10-19 17:41:16 · 805 阅读 · 0 评论 -
c++ leetcode 使用单调栈O(n),寻找一个数组的下一个大于当前值的值和位置
vector<int> nextGreaterNum(const vector<int> &nums){ vector<int> res(nums.size(), 0); stack<int> s; for (int i = nums.size() - 1; i >= 0; i--) { while (!s.empty() and s.top() <= nums[i]) s.pop(); res[i] = s.em.原创 2020-10-19 11:06:40 · 191 阅读 · 0 评论 -
使用O(1)空间,O(n)时间复杂度 去除有序数组中的重复数字 C++
int removeDuplicates(vector<int> &nums){ int len = sizeof(nums) / sizeof(int); if (len == 0) return 0; int slow = 0, fast = 0; while (fast < len) { if (nums[fast] != nums[slow]) { slow++; nums[slow] = nums[fast]; } fas.原创 2020-10-13 10:28:22 · 526 阅读 · 0 评论 -
c++ 刷题 字符串相乘
给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。string multiply(const string & num1, const string & num2){ if (num1 == "0" or num2 == "0") { return "0"; } int len1 = num1.length(); int len2 = num2.length(); cout <&.原创 2020-10-13 10:09:35 · 473 阅读 · 0 评论 -
leetcode 刷题, 删除被覆盖区间 C++ 实现
bool comp(const vector<int> & a, const vector<int> & b){ if (a.size() != 2 or b.size() != 2) return false; if (a[0] < b[0]) return true; else if (a[0] == b[0] and a[1] > b[1]) return true; return false;}int main() {.原创 2020-09-30 11:09:54 · 161 阅读 · 0 评论 -
KMP 文本字符串匹配算法
1. 首先将pattern_str模式串预处理,生成next数组2. 进入主循环,遍历query字符串的每一个字符2.1. 比较query和pattern_str的字符2.2. 当发现不匹配字符时,查询next数组,得到匹配前缀所对应的最长可匹配前缀子串,移动pattern_str到对应位置2.3.if 当前字符匹配,则继续循环void get_next(const string& pattern_str, vector<int> &...原创 2020-09-30 10:01:49 · 176 阅读 · 0 评论 -
求解强联通分量(网易2020校招)
//求解相连通分量int dfn[101]; // 记录每个节点的访问顺序int low[101]; // 记录所属强连通的数组lowbool instack[101]; // 每个节点是否在表中stack<int> sta;vector<int> edge[101]; // 表示每个节点的邻接节点表vector<int> belong[101]; // belong[1] 表示第一组,最多每个不想连,有101组int cnt = 0, cntb = 0;.原创 2020-08-12 18:16:48 · 101 阅读 · 0 评论 -
最小覆盖子串,求s 覆盖 t的最短子串
string getAnwser(string s, string t){ unordered_map<char,int> need,window; // window里包含need中的字符以及数量和need拥有的字符以及数量 for(auto i:t) need[i]++; int left = 0, right = 0; int valid = 0;int len = INT_MAX,start = 0; while(right<s.size.原创 2020-08-12 09:40:33 · 135 阅读 · 0 评论 -
刷题之 快速排序 c++实现
void getAnswer(int left,int right, vector<int>&height) //快排{ if (left >= right) return ; int i = left, j = right; int base = height[left]; while (i < j) { while (height[j] >= base and i < j) j--; while (height[i] <= b.原创 2020-08-11 20:56:50 · 140 阅读 · 0 评论 -
c++ 实现 归并排序
// // 归并排序void mergeSort(vector<int> &array, int left,int right,vector<int>& new_array){ if(left >= right) return; int mid = left + (right - left)/2; mergeSort(array, left, mid, new_array); mergeSort(array,.原创 2020-08-11 20:51:31 · 141 阅读 · 0 评论 -
求最大直方图面积
int getAnswer(int n,vector<int>&height){ int ans = 0; stack<int> sta; sta.push(0); for(int i = 0;i <=n+1;i++) { while(height[sta.top()] >height[i]) { int now_height = height[sta.top()].原创 2020-08-11 20:48:24 · 195 阅读 · 0 评论 -
LCS 求最长公共子序列
int LCS(const string &a,const string &b){ int m = a.length(); int n = b.length(); vector<vector<int>> dp(m,vector<int>(n,0)); for(int i = 0; i < m;i++) { for(int j= n-1; j >= 0; j++) { .原创 2020-08-11 20:45:56 · 126 阅读 · 0 评论 -
输出一个数组的全排列,考虑重复数组
#include <iostream>#include <string>#include<vector>#include<algorithm>using namespace std;void swap(int &i, int &j){ int c=i; i= j; j=c;}void coutAll(vector<int> vec, int cur, int len){ if.原创 2020-08-11 20:43:01 · 265 阅读 · 0 评论