- 博客(66)
- 问答 (1)
- 收藏
- 关注
原创 打家劫舍 II
力扣地址动态规划:因为题目说到住户首尾相连,需要考虑的问题是,当偷了第一家,就不能偷最后一家,因此得出两个偷窃范围 0 到(n - 2),1 到 (n - 1),得出这两个范围的最大值,然后再比较最大值即为偷窃最高金额考虑特殊情况,当只有一家时直接返回当有两家或三家时,获取最大值超过三家则有如下状态转移方程:class Solution {public: int rob(vector<int>& nums) { int l.
2021-04-16 22:28:00
126
原创 寻找旋转排序数组中的最小值
力扣地址二分查找:先设置中间值 mid,查看 nums[mid] < nums[right] 是否成立,如果成立则表明从 mid 到 left 都是顺序的,因此 mid 之后的数都不可能是最小值,因此 right= mid。当nums[mid] < nums[right] 不成立时,说明最小数在 mid 和 right 的中间,此时 mid 肯定不是最小数,因为所有数字都不相等,因此 left = mid + 1。通过上述两个条件的夹逼,最终 right 会等于 left,这样.
2021-04-08 22:00:01
147
原创 搜索旋转排序数组 II
力扣地址二分查找:由于数组中的值会重复,所以需要考虑二分时,开头中间和结尾的值相等的问题,已经一些边界问题class Solution {public: bool search(vector<int>& nums, int target) { int len = nums.size(); if (!len) return false; if (1 == len) return nums[0] == target;
2021-04-07 23:16:00
105
原创 笨阶乘
力扣地址栈:按照题目要求,乘除加减依次进行,那么我们只需要按照执行次序,定义一个index变量记录执行次序,依次进行以上操作,并且入栈,最后将所有结果全部相加返回即可class Solution {public: int clumsy(int N) { vector<int> s; s.push_back(N); --N; int index = 0; while (N) {
2021-04-01 23:00:36
122
原创 有效的括号
力扣地址栈:相同方向直接入栈,不同方向,只需匹配是否和当前栈顶字符匹配,不匹配直接返回 falseclass Solution {public: bool isValid(string s) { vector<char> st; for (auto c : s) { if (st.size()) { if ('(' == c || '[' == c || '{' == c) st.
2021-03-31 23:17:28
117
原创 柱状图中最大的矩形
力扣地址单调栈:按题目要求,需要知道每个位置的矩形可以扩展到的最远距离,由于比当前位置的值小的矩形是不可能与当前位置共同组成矩形的,所以题目可以理解为,寻找当前位置的左右两边第一个比自己小的值,用这两个位置的 index 相减得到宽度,再乘以当前位置的长度,如此得到当前位置的最大矩形面积,对每个位置都如此,寻找最大的矩形面积。如此,我们只需要对数组左右个遍历一次,就可以知道每个位置的左右第一个比自己小的值的位置。class Solution {public: int la
2021-03-30 22:18:08
132
原创 多道批处理调度
题目描述:某多处理器多道批处理系统一次允许将所有作业调入内存,且能并行执行,其并行数等于处理机个数。该系统采用SJF的调度方式(最短作业优先,系统在调度时,总是优先调度执行处理时间最短的作业)。现给定处理器个数m,作业数n,每个作业的处理时间分别为t1,t2 ... tn。当 n > m时,首先处理时间短的 m 个作业进入处理器处理,其他的进入等待,当某个作业处理完成时,依次从等待队列中取出处理时间最短的作业进入处理。求系统处理完所有作业的耗时为多少?注:不考虑作业切换的消耗。.
2021-03-29 20:49:19
1658
3
原创 每日温度
力扣地址单调栈:分解题目意思,其实就是查找当前数字之后的第一个比自己大的数字的差值,如果没有则为0,暴力法可以一一向后遍历,其实我们可以像数组反向遍历,将数字入栈,始终保持栈顶元素比当前准备入栈元素大,否则出栈,并给当前元素记录差值class Solution {public: vector<int> dailyTemperatures(vector<int>& T) { stack<pair<int, int>
2021-03-25 23:08:21
107
原创 跳跃游戏 II
力扣地址贪心:每次都在可跳跃的范围内寻找下一个最远的跳跃点,最远的跳跃点就是可跳跃范围内,当前位置加上当前位置的值的最大值:max_pos = max(i + nums[i], max_pos)class Solution {public: int jump(vector<int>& nums) { int len = nums.size(); int cnt = 0; int end = 0; in
2021-03-24 22:07:39
124
原创 单词的压缩编码
力扣地址首先明确解体思路,其实就是去除所有是后缀的单词,剩下的单词长度全部累加,再加上单词个数就是结果长度存储后缀:将所有字符串全部存入哈希 set 中,然后遍历所有字符的后缀,再去哈希 set 中查找是否有匹配的单词,如果匹配则删除class Solution {public: int minimumLengthEncoding(vector<string>& words) { std::unordered_set<std::strin
2021-03-21 20:52:30
224
原创 无重复字符的最长子串
力扣地址双指针滑动窗口:定义一个 set 集合,通过 left 和 right 两个指针,right 不断向后移动,将字符放入 set 集合,当有重复值时,将 left 右移,并删除 set 中的重复值,每次加入新的无重复值时,再次比较最大值class Solution {public: int lengthOfLongestSubstring(string s) { if (s.empty()) return 0; int len = s.l
2021-03-18 22:57:06
112
原创 linux 设置代理地址
gsettings set org.gnome.system.proxy mode 'manual'gsettings set org.gnome.system.proxy.http host '127.0.0.1'gsettings set org.gnome.system.proxy.http port 7890
2021-03-18 17:33:00
571
原创 岛屿数量
力扣地址深度优先搜索:用 record 记录数量两层 for 循环开始遍历找到一个为 1 的值后,将 record加 1,并将对当前值进行深度优先搜索,将周围所有为 1 的值全部置为 0。class Solution {public: int numIslands(vector<vector<char>>& grid) { if (grid.empty() || grid[0].empty()) return 0; .
2021-03-16 22:38:35
103
原创 最长回文子串
力扣地址暴力:(力扣过不了)直接两层 for 循环遍历穷举所有区间,判断所有区间是否是回文用了两种暴力法:第一种、通过左右指针判断是否相等,不相等就返回false第二种、通过字符串反转,因为回文的特性,左右、反转都相等需要注意的边界问题:1、是当字符串小于 2 时就是回文了,直接返回2、大于 2 时,最小的回文长度是 13、字串的长度是 j - i + 1class Solution {public: string longestPalindrome(st
2021-03-16 00:02:31
122
原创 重建二叉树
力扣地址递归:利用二叉树的特性,先序遍历的先遍历父节点,再遍历左子树,再遍历右子树,中序遍历,是先遍历左子树,再遍历头结点,再遍历右子树,如此先序遍历的数组的第一个数字,就是中序遍历数组的中间某个数字,并且这个数字将中序遍历数组一分为二,左边为左子树,右边为右子树,如此,我们只需要一个 hash map 存储中序遍历数组的每一个值的下标,就可以快速定位中序遍历数组的父节点位置,快速区分左右子树/** * Definition for a binary tree node. *
2021-03-11 23:21:57
123
原创 二维数组中的查找
力扣地址线性查找:从数组的右上角开始查找,数组当前值比 target 大则下标左移,数组当前值比 target 小则下标下移,如此就能找到 target ,或者跳出循环class Solution {public: bool findNumberIn2DArray(vector<vector<int>>& matrix, int target) { if (!matrix.size() || !matrix[0].size()) {
2021-03-10 22:55:08
96
原创 字符串的排列
力扣地址回溯 + set集合:选择一个位置的字符后向后互换,遇到相同的字符直接跳过,通过 set 判断字符是否相同,递归到最后一个字符则成为一个字符串class Solution {public: vector<string> permutation(string s) { dfs(s, 0); return res; } void dfs(string& s, int index) { if (i
2021-03-09 21:47:52
126
原创 对称的二叉树
力扣地址对称二叉树性质:左右子树值相等或者都为空左子树的左子树(即LL)的值等于右子树的右子树(即RR)的值左子树的右子树(即LR)的值等于右子树的左子树(即RL)的值/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), le
2021-03-06 21:55:48
131
原创 在排序数组中查找数字-1
力扣地址二分查找:class Solution {public: int search(vector<int>& nums, int target) { if (!nums.size()) return 0; int low = 0; int high = nums.size() - 1; int pivot; while (low <= high) { p
2021-03-06 14:35:52
483
原创 打印从1到最大的n位数
力扣地址输入的数字代码需要打印的位数,当前位数的最大值则全部是 9,先用10来进位,最后减一则是当前位数的最大值class Solution {public: vector<int> printNumbers(int n) { int res = 10; for (int i = 1; i < n; ++i) { res = res * 10; } vector&l
2021-03-05 00:27:44
147
1
原创 数组中出现次数超过一半的数字
力扣地址摩尔投票法:用变量 votes 记录变量 mode 的票数,当票数为 0 时,mode 更新为当前值当前值与 mode 不相等,则将 votes 减一class Solution {public: int majorityElement(vector<int>& nums) { int mode = 0; int votes = 0; for (int n : nums) { if
2021-03-05 00:19:59
143
1
原创 包含min函数的栈
力扣地址用两个栈去接受数据,其中一个栈在入栈时,只更新比他小的值,这样保证栈顶最小,在出栈时,比较两个栈的栈顶元素,相同一起出栈,代码用 vector 模拟栈class MinStack {public: /** initialize your data structure here. */ MinStack() { } void push(int x) { s1.push_back(x); if (s2.empty
2021-03-04 22:42:00
135
1
原创 删除链表的节点
力扣地址典型链表题目判断第一个节点是不是符合要求的,如果是,直接返回下一个节点,不是,则需要 pre 和 cur 变量来控制/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public:
2021-03-04 22:24:03
192
1
原创 二进制中1的个数
力扣地址直接使用gcc内建函数:class Solution {public: int hammingWeight(uint32_t n) { return __builtin_popcount(n); }};自己写判断方法一:逐个移位判断class Solution {public: int hammingWeight(uint32_t n) { int cnt = 0; while (n) {
2021-03-03 23:50:51
113
1
原创 二叉树的镜像
力扣地址递归:将左右子树递归调换即可实现镜像/*** 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: TreeNode*
2021-03-03 23:26:18
96
1
原创 不用加减乘除做加法
力扣地址移位:因为C++负数移位会报错,所以在与之前将负数转换为 unsigned int 类型class Solution {public: int add(int a, int b) { return b == 0 ? a : add(a^b, (unsigned int)(a&b) << 1); }};...
2021-03-02 22:50:38
87
原创 从上到下打印二叉树-2
力扣地址使用队列,开始入队前,判断当前队列长度,作为接下来需要打印的节点数量/** * 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 {
2021-03-02 22:32:32
77
原创 扑克牌中的顺子
力扣地址排序+遍历:判断条件:最大最小值相差不超过4,且其中除了 0 之外不能有重复class Solution {public: bool isStraight(vector<int>& nums) { sort(nums.begin(), nums.end()); int joker = 0; for (int i = 0; i < nums.size() - 1; ++i) { i
2021-03-02 22:20:36
194
原创 二叉树的最近公共祖先
力扣地址最近公共祖先,就是同时包含两个节点,且离得最近的,其中包括自己包含另一个节点递归:通过递归判断当前节点是否就是我需要判断的节点,如果是则返回 true,且一路返回,包含这个节点的父节点也为 true ,通过左右两个变量来判断当前节点是否就是我需要的节点/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNo
2021-03-02 21:57:43
364
原创 二叉搜索树的第k大节点
力扣地址递归:中序反向遍历,先遍历右子树,再遍历左子树,因为中序正向遍历时得到的二叉搜索树的结果集是升序数组,反向则是降序,符合题目的第k大的节点/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), rig
2021-03-02 21:11:46
145
原创 平衡二叉树-2
力扣地址后序遍历/** * 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: bool isBalanced(Tr
2021-03-02 00:07:55
99
原创 层序遍历
利用队列,入队出队按层输出#include <iostream>#include <vector>#include <algorithm>#include <iterator>#include <queue>struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode(int x) : val(x), left(nullpt
2021-03-01 23:27:48
279
原创 后序遍历
利用栈和一个visit变量,visit用来记录当前节点是否被拜访过#include <iostream>#include <vector>#include <algorithm>#include <iterator>#include <stack>struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode(int x) :
2021-03-01 23:22:34
769
原创 中序遍历
利用栈实现非递归遍历,先压栈,压到空时,再弹栈,实现左中右遍历#include <iostream>#include <vector>#include <algorithm>#include <iterator>#include <stack>struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode(int x) : v
2021-03-01 22:46:29
1198
原创 先序遍历
非递归通过压栈来实现遍历#include <iostream>#include <vector>#include <algorithm>#include <iterator>#include <stack>struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode(int x) : val(x), left(nullptr
2021-03-01 22:22:19
205
1
原创 圆圈中最后剩下的数字
力扣地址约瑟夫环问题:用数组模拟约瑟夫环:(力扣超时,牛客可以通过,主要力扣输入的n和m都太大了)主要有一个数组和三个变量数组 visit 表示是否被访问过cur 表示当前真实走过的位置step 表示值拜访过的步数record 表示当前拜访了多少个class Solution {public: int lastRemaining(int n, int m) { vector<bool> visit(n, false);
2021-03-01 00:46:38
89
空空如也
关于sqlite3.24版本对数据库做更新操作被锁的问题
2018-08-03
TA创建的收藏夹 TA关注的收藏夹
TA关注的人