数据结构与算法
lardoris928
这个作者很懒,什么都没留下…
展开
-
leetcode 3/剑指 48 最长不含重复字符的子字符串 哈希set的函数(count,insert)
https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/solution/wu-zhong-fu-zi-fu-de-zui-chang-zi-chuan-by-leetc-2/class Solution {public: int lengthOfLongestSubstring(string s) { // 哈希集合,记录每个字符是否出现过 uno...原创 2021-09-12 15:40:08 · 183 阅读 · 0 评论 -
链表专题(2/21/61)
文章目录2. 两数相加(中等)直观笨办法(稍微还有点问题)2. 两数相加(中等)直观笨办法(稍微还有点问题)/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public: ListNode*原创 2021-09-11 16:04:06 · 136 阅读 · 0 评论 -
bfs最短路径总结 未完
原文链接:https://blog.csdn.net/weixin_44965308/article/details/104928695广度优先搜索顾名思义就是以迷宫里的无向图某一个点,借助队列,一层一层以该点为中心散开进行搜索,简单的BFS只能显示出最短路径的长度,这里探讨的就是如何实现BFS对最短路径的输出简单的BFS通过队列来实现,找到迷宫的起点(S)入队,出队列里面的队首,把队首上下左右相邻的点入队列,一直重复此操作,直到队列里面的所有元素都出队表示该迷宫不存在解,如果在队清空之前找到终点.转载 2021-09-10 11:56:47 · 190 阅读 · 0 评论 -
leetcode 322. 零钱兑换 背包问题
(本来想的是dfs不加一的那种 其实是背包问题 看来有些生疏了 一会去看一下dfs)https://leetcode-cn.com/problems/coin-change/solution/dai-ma-sui-xiang-lu-dai-ni-xue-tou-wan-q-80r7/这个递推公式的意思就是 如果取coins[i],那么硬币数量就是dp[j - coins[i]] + 1,其中dp数组是存储当前容量的,凑足总额为j 的最少个数为dp[j]递推公式:dp[j] = min(dp[..原创 2021-09-09 17:30:55 · 122 阅读 · 0 评论 -
leetcode 73. 矩阵置零 趋势科技手撕 将额外空间压缩到O(1)
文章目录方法一:标记数组方法二:使用两个标记变量方法三:使用一个标记变量方法一:标记数组class Solution {public: void setZeroes(vector<vector<int>>& matrix) { int m = matrix.size(); int n = matrix[0].size(); vector<int> row(m), col(n); fo原创 2021-08-29 17:53:25 · 59 阅读 · 0 评论 -
什么时候要用虚析构函数 父类指针指向子类对象||子类指针指向父类对象 (未整理)
文章目录虚析构函数父类指针指向子类对象||子类指针指向父类对象总结:虚析构函数《Effective C++ 》当派生类(derived class)对象由一个基类(base class)指针删除时,若基类有一个非虚函数(non-virtual)的析构函数时,其结果是未定义的——实际执行时通常发生的是对象的派生类部分没有被销毁。例如下面的示例:#include <iostream>using namespace std;class Shape{public: Shape(原创 2021-08-27 12:11:31 · 459 阅读 · 0 评论 -
c++重载、覆盖、隐藏的区别和执行方式
原创 2021-08-27 10:42:02 · 58 阅读 · 0 评论 -
leetcode 40. 组合总和 II used数组有点点抽象
题解:https://leetcode-cn.com/problems/combination-sum-ii/solution/dai-ma-sui-xiang-lu-dai-ni-xue-tou-hui-s-ig29/回溯三部曲分析完了,整体C++代码如下:class Solution {private: vector<vector<int>> result; vector<int> path; void backtra...原创 2021-08-25 16:03:47 · 83 阅读 · 0 评论 -
leetcode 39. 组合总和
class Solution {private: vector<vector<int>> res; vector<int> path; //int sum=0;public: void dfs(vector<int>& candidates,int n,int target,int sum){ if (sum > target) { return;//这里第一次忽视了 ..原创 2021-08-25 15:43:38 · 68 阅读 · 0 评论 -
leetcode 155. 最小栈
我写的class MinStack {private: stack<int> minStack; vector<int> all;//之后找最小元素的public: /** initialize your data structure here. */ MinStack() { } void push(int val) { minStack.push(val); all.push..原创 2021-08-25 10:34:46 · 60 阅读 · 0 评论 -
leetcode 242. 有效的字母异位词
想到的第一个方法是排序后比较class Solution {public: bool isAnagram(string s, string t) { //排序 if(s.size()!=t.size()) return false; if(s.size()==0&&t.size()==0) return true; sort(s.begin(),s.end()); sort(t.begin(),.原创 2021-08-25 10:07:50 · 46 阅读 · 0 评论 -
leetcode 198. 打家劫舍 经典dp 注意dp数组的范围
dp数组的大小应该为(n+1),其中n为nums的长度,因为第0位要存放n=0的时候的值 最后结果返回的是dp[n] 因为dp数组的最后一位的下标是nint rob(vector<int>& nums) { if (nums.size() == 0) { return 0; } // 子问题: // f(k) = 偷 [0..k) 房间中的最大金额 // f(0) = 0 // f(1) = nums[0]...原创 2021-08-24 18:46:51 · 100 阅读 · 0 评论 -
结构体(struct)和共用体(union)的区别(union转换大端小端)
结构体结构体是用户自定义的类型,同一个结构可以存储多种类型的数据。大小是内存对齐之后的各变量大小和共用体各成员共用一块内存空间,并且同时只有一个成员可以得到这块内存的使用权(对该内存的读写),各变量共用一个内存首地址。因而,联合体比结构体更节约内存。一个union变量的总长度至少能容纳最大的成员变量,而且要满足是所有成员变量类型大小的整数倍。对比代码1:对比struct和union占用内存大小#include<stdio.h>//结构体struct u //u表示结构体类型名原创 2021-08-24 17:00:07 · 462 阅读 · 0 评论 -
leetcode 283. 移动零 方法二很好
空间换时间(但是不符合题意 题意不能有辅助数组)//自己写的class Solution {public: void moveZeroes(vector<int>& nums) { if(nums.size()==0||nums.size()==1) return; vector<int> res(nums.size(),0); for(int i=0,j=0;i<nums.size();){ .原创 2021-08-24 11:24:42 · 57 阅读 · 0 评论 -
leetcode 787. K 站中转内最便宜的航班 bellford 不会
class Solution {private: static constexpr int INF = 10000 * 101 + 1;public: int findCheapestPrice(int n, vector<vector<int>>& flights, int src, int dst, int k) { vector<vector<int>> f(k + 2, vector<int...原创 2021-08-24 10:00:44 · 106 阅读 · 0 评论 -
leetcode 189. 旋转数组 整体旋转后再分块旋转
k %= nums.size();这句好妙 就是说你移动的距离k有可能大于数组的长度class Solution {public: void reverse(vector<int>& nums, int start, int end) { while (start < end) { swap(nums[start], nums[end]); start += 1; end原创 2021-08-24 09:33:25 · 184 阅读 · 0 评论 -
leetcode 70. 爬楼梯 经典dp
方法一:class Solution {public: int climbStairs(int n) { if (n == 1) return 1; if (n == 2) return 2; vector<int> res(n + 1); res[0]=0; res[1]=1; res[2]=2; for (int i = 3; i <= n; i++){ res[i] = res[i - 1] + res[i - 2]; } retur.原创 2021-08-23 21:24:02 · 49 阅读 · 0 评论 -
超详细的kmp算法 C语言版
讲的比较清楚的b站视频 和这个代码一致https://www.bilibili.com/video/BV1Px411z7Yo?from=search&seid=13622329823413177709https://www.bilibili.com/video/BV1hW411a7ys文章目录思路写代码前缀表next数组kmp思路1.首先制作一个前缀表对于每一个字符串找到它的最长公共前后缀列表去掉最后一个 剩下的往后移一位 第一位补-1 做为next数组补上数组下.原创 2021-08-23 18:48:28 · 536 阅读 · 0 评论 -
989. 数组形式的整数加法 多做这个和笔记里上一个提
class Solution {public: vector<int> addToArrayForm(vector<int>& num, int k) { vector<int> res; int n = num.size(); for (int i = n - 1; i >= 0; --i) { int sum = num[i] + k % 10; ..原创 2021-08-17 17:04:31 · 65 阅读 · 0 评论 -
leetcode 66. 加一 加法进位 这题很好 vector的insert
class Solution {public: vector<int> plusOne(vector<int>& digits) { for(int i=digits.size()-1;i>=0;i--) { ++digits[i]; if(digits[i]!=10) //如果该位没有继续产生进位,则直接return 结果 ...原创 2021-08-17 12:24:20 · 111 阅读 · 0 评论 -
1446. 连续字符 双指针 滑动窗
class Solution {public: int maxPower(string s) { //子字符串必须连续 int maxnum=1; int curr=1; for(int i=0,j=1;i<s.size(),j<s.size();){ while(s[i]==s[j]){ curr++; j++; .原创 2021-08-17 09:54:09 · 42 阅读 · 0 评论 -
leetcode 141. 环形链表 (判断链表是否有环)
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public: bool hasCycle(ListNode *head) { if(head==nullptr) return fal原创 2021-08-15 16:58:21 · 54 阅读 · 0 评论 -
leetcode 8. 字符串转换整数 (atoi)
class Solution {public: int myAtoi(string s) { int i=0; while(s[i]==' '){ i++; } if(s.size() == i || (('0'>s[i] || s[i] > '9' )&& s[i] != '+' && s[i] != '-')) return 0; int ...原创 2021-08-15 16:47:14 · 186 阅读 · 0 评论 -
leetcode 7. 整数反转 int越界处理
这个题最开始的想法是存在字符串里 不过太麻烦了 就看答案了class Solution {public: int reverse(int x) { int rev = 0; while (x != 0) { if (rev < INT_MIN / 10 || rev > INT_MAX / 10) { return 0; } int digit..原创 2021-08-15 12:36:36 · 83 阅读 · 0 评论 -
leetcode 6. Z 字形变换 flag数组
这个flag反向也太强了 这个没做过根本是想不到class Solution {public: string convert(string s, int numRows) { if(numRows==1){ return s;} vector<string> store(numRows);//直接往进存string 几行最后就是几个string int j=0; int flag=1;...原创 2021-08-15 12:12:14 · 69 阅读 · 0 评论 -
leetcode 3. 无重复字符的最长子串 哈希map和哈希set的使用
文章目录unordered_set常用函数两者的公共接口map的返回值map中find函数的使用把题理解错了 最长无重复字符的子串 要用滑动窗口滑动窗口这个右指针的分析好棒啊!class Solution {public: int lengthOfLongestSubstring(string s) { // 哈希集合,记录每个字符是否出现过 unordered_set<char> occ; int n = s.size()原创 2021-08-14 18:37:31 · 80 阅读 · 0 评论 -
leetcode 62. 不同路径 动态规划经典题 二维数组的初始化
也就是说把第一行和第一列放在动态规划方程中时的值是1 但如果他们是终点的话就不是1了 这和剪绳子那个题是一样的class Solution {public: int uniquePaths(int m, int n) { vector<vector<int>> f(m, vector<int>(n)); for (int i = 0; i < m; ++i) { f[i][0] = 1; ...原创 2021-08-14 14:46:56 · 69 阅读 · 0 评论 -
leetcode 11. 盛最多水的容器 移动短板
若向内 移动短板 ,水槽的短板 min(h[i], h[j]) 可能变大,因此下个水槽的面积 可能增大 。若向内 移动长板 ,水槽的短板 min(h[i], h[j]) 不变或变小,因此下个水槽的面积 一定变小 。class Solution {public: int maxArea(vector<int>& height) { int i = 0, j = height.size() - 1, res = 0; wh..原创 2021-08-13 22:06:16 · 76 阅读 · 0 评论 -
leetcode 45. 跳跃游戏 II 贪心 有点燃
方法二:正向查找可到达的最大位置//每次在上次能跳到的范围(end)内选择一个能跳到的最远位置(max_far)作为新的范围(end)class Solution {public: int jump(vector<int>& nums) { int max_far = 0;// 目前能跳到的最远位置 int step = 0; // 跳跃次数 int end = 0; // 上次跳跃可达范围右边界..原创 2021-08-13 20:57:14 · 61 阅读 · 0 评论 -
leetcode 55. 跳跃游戏 实时更新数组
数组中的元素是能跳的最大长度 也就是说你也可以不跳这么多class Solution {public: bool canJump(vector<int>& nums) { int n = nums.size(); int rightmost = 0; for (int i = 0; i < n; ++i) {//这个地方用auto会计算错误 因为后面再用下标计算 //而auto直接读的是当前的值 .原创 2021-08-13 17:19:46 · 51 阅读 · 0 评论 -
leetcode 22. 括号生成 暴力/递归回溯 忘写return居然速度提高?
文章目录自己写的暴力法回溯法(有条件递归)记着要返回上一级递归 不然会内存泄露#include<iostream>#include<string>#include<algorithm>#include<vector>using namespace std;class Solution { bool valid(const string& str) { int balance = 0; for (char c : str) {原创 2021-08-13 16:27:06 · 533 阅读 · 0 评论 -
leetcode 5. 最长回文子串 中心扩展法 while判断语句的顺序
class Solution {public: string longestPalindrome(string s) { int size=s.size(); int length=0; string ans; for(int i=0;i<size;i++){ int l1=i-1; int r1=i+1;//奇数中心 while(l1>=0&am..原创 2021-08-13 14:20:21 · 56 阅读 · 0 评论 -
leetcode 88. 合并两个有序数组
暴力sort的解法就不说了class Solution {public: void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) { int p1 = m - 1, p2 = n - 1; int tail = m + n - 1; int cur; while (p1 >= 0 || p2 >= 0) .原创 2021-08-12 15:14:24 · 142 阅读 · 0 评论 -
leetcode 417. 太平洋大西洋水流问题 dfs
class Solution {public: vector<vector<int>> P, A, ans; int n, m; vector<vector<int>> pacificAtlantic(vector<vector<int>>& M) { n = M.size(), m = M[0].size(); P = A = vector<vector...原创 2021-08-09 23:01:16 · 66 阅读 · 0 评论 -
leetcode 130. 被围绕的区域 dfs bfs
dfsclass Solution {public: int n, m; void dfs(vector<vector<char>>& board, int x, int y) { if (x < 0 || x >= n || y < 0 || y >= m || board[x][y] != 'O') { return; } board[x][y] = ..原创 2021-08-09 00:15:52 · 61 阅读 · 0 评论 -
leetcode 200. 岛屿数量 -走地图问题 bfs+dfs
DFSclass Solution {public: void dfs(vector<vector<char>>& grid, int i, int j) { if(i < 0 || i >= grid.size() || j < 0 || j >= grid[0].size() || grid[i][j] == '0')return; grid[i][j] = '0'; // miss d.原创 2021-08-08 23:16:14 · 71 阅读 · 0 评论 -
迷宫问题 bfs
(规定从右下左上的顺时针方向搜),如下,现在把起点的方向都扩展完了此时将队首节点出队然后再找队首的可扩展点 扩展到(2,2)然后将无法扩展的队首出列#includebits/stdc++.husing namespace std;int a【100】【100】;//a【i】【j】=1表示是空地可以走,为0表示不是空地int v【100】【100】;//v【i】【j】=1表示已经被访问了,为0表示未被访问struct point{ int x; int y; int step;/..原创 2021-08-06 20:34:36 · 68 阅读 · 0 评论 -
平衡点问题(shoppee笔试题)
#include<iostream>#include<vector>#include<string>using namespace std;int find(vector<int>& inputarray){ int sum = 0; int length = inputarray.size(); for (int i : inputarray){ sum += i; } int r = sum - inputarray[0];.原创 2021-08-02 20:05:08 · 154 阅读 · 0 评论 -
哈希表相关题
文章目录5804. 检查是否所有字符出现次数相同5804. 检查是否所有字符出现次数相同class Solution {public: bool areOccurrencesEqual(string s) { unordered_map<char,int> temp; for(char i:s){//这里如果用auto 则轮询的是{char,int}这个组合 temp[i]++; } int原创 2021-07-25 10:25:37 · 51 阅读 · 0 评论 -
剑指 Offer 46. 把数字翻译成字符串(动态规划)(和青蛙跳台阶相似)
(这个0的情况是用来递归的 真正输入只有0个的时候输出是0->看代码)class Solution {public: int translateNum(int num) { string str = to_string(num); int len = str.size(); if(len < 2) return len; vector<int> dp(len+1); dp[1] = 1...原创 2021-07-24 17:24:31 · 53 阅读 · 0 评论