
力扣
神山极客
C++入门
展开
-
打家劫舍 II
力扣地址动态规划:因为题目说到住户首尾相连,需要考虑的问题是,当偷了第一家,就不能偷最后一家,因此得出两个偷窃范围 0 到(n - 2),1 到 (n - 1),得出这两个范围的最大值,然后再比较最大值即为偷窃最高金额考虑特殊情况,当只有一家时直接返回当有两家或三家时,获取最大值超过三家则有如下状态转移方程:class Solution {public: int rob(vector<int>& nums) { int l.原创 2021-04-16 22:28:00 · 127 阅读 · 0 评论 -
寻找旋转排序数组中的最小值
力扣地址二分查找:先设置中间值 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 阅读 · 0 评论 -
搜索旋转排序数组 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 阅读 · 0 评论 -
笨阶乘
力扣地址栈:按照题目要求,乘除加减依次进行,那么我们只需要按照执行次序,定义一个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 阅读 · 0 评论 -
有效的括号
力扣地址栈:相同方向直接入栈,不同方向,只需匹配是否和当前栈顶字符匹配,不匹配直接返回 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 阅读 · 0 评论 -
柱状图中最大的矩形
力扣地址单调栈:按题目要求,需要知道每个位置的矩形可以扩展到的最远距离,由于比当前位置的值小的矩形是不可能与当前位置共同组成矩形的,所以题目可以理解为,寻找当前位置的左右两边第一个比自己小的值,用这两个位置的 index 相减得到宽度,再乘以当前位置的长度,如此得到当前位置的最大矩形面积,对每个位置都如此,寻找最大的矩形面积。如此,我们只需要对数组左右个遍历一次,就可以知道每个位置的左右第一个比自己小的值的位置。class Solution {public: int la原创 2021-03-30 22:18:08 · 132 阅读 · 0 评论 -
每日温度
力扣地址单调栈:分解题目意思,其实就是查找当前数字之后的第一个比自己大的数字的差值,如果没有则为0,暴力法可以一一向后遍历,其实我们可以像数组反向遍历,将数字入栈,始终保持栈顶元素比当前准备入栈元素大,否则出栈,并给当前元素记录差值class Solution {public: vector<int> dailyTemperatures(vector<int>& T) { stack<pair<int, int>原创 2021-03-25 23:08:21 · 107 阅读 · 0 评论 -
跳跃游戏 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 阅读 · 0 评论 -
单词的压缩编码
力扣地址首先明确解体思路,其实就是去除所有是后缀的单词,剩下的单词长度全部累加,再加上单词个数就是结果长度存储后缀:将所有字符串全部存入哈希 set 中,然后遍历所有字符的后缀,再去哈希 set 中查找是否有匹配的单词,如果匹配则删除class Solution {public: int minimumLengthEncoding(vector<string>& words) { std::unordered_set<std::strin原创 2021-03-21 20:52:30 · 224 阅读 · 0 评论 -
无重复字符的最长子串
力扣地址双指针滑动窗口:定义一个 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 阅读 · 0 评论 -
最大正方形
力扣地址原创 2021-03-17 23:09:16 · 109 阅读 · 0 评论 -
岛屿数量
力扣地址深度优先搜索:用 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 阅读 · 0 评论 -
最长回文子串
力扣地址暴力:(力扣过不了)直接两层 for 循环遍历穷举所有区间,判断所有区间是否是回文用了两种暴力法:第一种、通过左右指针判断是否相等,不相等就返回false第二种、通过字符串反转,因为回文的特性,左右、反转都相等需要注意的边界问题:1、是当字符串小于 2 时就是回文了,直接返回2、大于 2 时,最小的回文长度是 13、字串的长度是 j - i + 1class Solution {public: string longestPalindrome(st原创 2021-03-16 00:02:31 · 122 阅读 · 0 评论