初级农民-请到新手上路获取积分
- 积分
- 8
- 大米
- 颗
- 鳄梨
- 个
- 水井
- 尺
- 蓝莓
- 颗
- 萝卜
- 根
- 小米
- 粒
- 学分
- 个
- 注册时间
- 2020-6-19
- 最后登录
- 1970-1-1
|
本帖最后由 NEVERNEVERLAND 于 2020-7-9 03:45 编辑
82题:删除排序链表中的重复数字
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
if(!head || !head->next) return head;
auto dummy = new ListNode(-1);
dummy->next = head;
ListNode* p = dummy;
/**
-1->1->2->4->4->5
p q
*/
while(p->next) {
auto q = p->next->next;
while(q && p->next->val == q->val) q = q->next;
// p和q质检只间隔了一个数字,且是不同数字,所以 p 向右移动一位
if(p->next->next == q) p = p->next;
//否则p的下一个节点指向q:下一个无相同数字的节点
else p->next = q;
}
return dummy->next;
}
}
84题:柱状图中最大矩形面积- class Solution {
- public:
- int largestRectangleArea(vector<int>& heights) {
- int n = heights.size();
- stack<int>stk; // 放左边或右边最小的元素的栈,其中最小元素是heigths数组的坐标
- vector<int>left(n, 0), right(n, 0);
- //从左往右遍历
- for(int i = 0;i < n;++i) {
- //找到第一个比heights[i]小的数
- while(!stk.empty() && heights[stk.top()] >= heights[i]) stk.pop();
- //如果不存在,最左为-1
- if(stk.empty()) left[i] = -1;
- //找到的这个位置为 栈顶元素
- else left[i] = stk.top();
- //将i放进栈中
- stk.push(i);
- }
- //从右往左遍历
- stk = stack<int>();
- for(int i = n-1;i >= 0;--i) {
- //找到第一个比heights[i]小的数
- while(!stk.empty() && heights[stk.top()] >= heights[i]) stk.pop();
- //如果不存在,则最右为n
- if(stk.empty()) right[i] = n;
- //找到的这个位置为 栈顶元素
- else right[i] = stk.top();
- //将i放进栈中
- stk.push(i);
- }
- int res = 0;
- for(int i = 0; i < n;++i) {
- res = max(res, heights[i] * (right[i]-left[i]-1));
- }
- return res;
- }
- };[/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][i][i][i][i][i][i][i][i][i][/i][/i][/i][/i][/i][/i][/i][/i][/i]
- [i][i][i][i][i][i][i][i][i][i][i]85.最大矩形面积[/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i]
- [i][i][i][i][i][i][i][i][i][i][i]class Solution {[/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i]
- [i][i][i][i][i][i][i][i][i][i][i]public:[/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i]
- [i][i][i][i][i][i][i][i][i][i][i] int func(vector<int>& h) {[/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i]
- [i][i][i][i][i][i][i][i][i][i][i] if(h.empty()) return 0;[/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i]
- [i][i][i][i][i][i][i][i][i][i][i] int n = h.size();[/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i]
- [i][i][i][i][i][i][i][i][i][i][i] vector<int> left(n, 0), right(n, 0);[/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i]
- [i][i][i][i][i][i][i][i][i][i][i] stack<int>stk;[/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i]
- [i][i][i][i][i][i][i][i][i][i][i] for(int i = 0; i < n;++i) {[/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i]
- [i][i][i][i][i][i][i][i][i][i][i] while(!stk.empty() && h[stk.top()] >= h[i]) stk.pop();[/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i]
- [i][i][i][i][i][i][i][i][i][i][i] if(stk.empty()) left[i] = -1;[/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i]
- [i][i][i][i][i][i][i][i][i][i][i] else left[i] = stk.top();[/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i]
- [i][i][i][i][i][i][i][i][i][i][i] stk.push(i);[/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i]
- [i][i][i][i][i][i][i][i][i][i][i] }[/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i]
- [i][i][i][i][i][i][i][i][i][i][i] stk = stack<int>();[/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i]
- [i][i][i][i][i][i][i][i][i][i][i] for(int i = n-1; i >= 0;--i) {[/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i]
- [i][i][i][i][i][i][i][i][i][i][i] while(!stk.empty() && h[stk.top()] >= h[i]) stk.pop();[/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i]
- [i][i][i][i][i][i][i][i][i][i][i] if(stk.empty()) right[i] = n;[/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i]
- [i][i][i][i][i][i][i][i][i][i][i] else right[i] = stk.top();[/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i]
- [i][i][i][i][i][i][i][i][i][i][i] stk.push(i);[/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i]
- [i][i][i][i][i][i][i][i][i][i][i] }[/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i]
- [i][i][i][i][i][i][i][i][i][i][i] int res = 0;[/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i]
- [i][i][i][i][i][i][i][i][i][i][i] for(int i = 0;i<n;++i) {[/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i]
- [i][i][i][i][i][i][i][i][i][i][i] res = max(res, h[i] * (right[i] - left[i] - 1));[/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i]
- [i][i][i][i][i][i][i][i][i][i][i] }[/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i]
- [i][i][i][i][i][i][i][i][i][i][i] return res;[/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i]
- [i][i][i][i][i][i][i][i][i][i][i] }[/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i]
- [i][i][i][i][i][i][/i][/i][/i][/i][/i][/i]
- [i][i][i][i][i][i][i][i][i][i][i] int maximalRectangle(vector<vector<char>>& matrix) {[/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i]
- [i][i][i][i][i][i][i][i][i][i][i] if(matrix.empty() || matrix[0].empty()) return 0;[/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i]
- [i][i][i][i][i][i][i][i][i][i][i] int m = matrix.size(), n = matrix[0].size();[/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i]
- [i][i][i][i][i][i][/i][/i][/i][/i][/i][/i]
- [i][i][i][i][i][i][i][i][i][i][i] //考虑成柱状图中,最大面积的问题[/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i]
- [i][i][i][i][i][i][i][i][i][i][i] //h表示,以第i层,往上看,的柱状图的h一维数组为多少[/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i]
- [i][i][i][i][i][i][i][i][i][i][i] vector<vector<int>>h(m, vector<int>(n, 0));[/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i]
- [i][i][i][i][i][i][i][i][i][i][i] for(int i = 0;i < m;++i) {[/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i]
- [i][i][i][i][i][i][i][i][i][i][i] for(int j = 0;j < n;++j)[/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i]
- [i][i][i][i][i][i][i][i][i][i][i] if(matrix[i][j] == '1') {[/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i]
- [i][i][i][i][i][i][i][i][i][i][i] if(i == 0)[/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i]
- [i][i][i][i][i][i][i][i][i][i][i] h[i][j] = 1;[/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i]
- [i][i][i][i][i][i][i][i][i][i][i] else[/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i]
- [i][i][i][i][i][i][i][i][i][i][i] h[i][j] = h[i-1][j] + 1;[/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i]
- [i][i][i][i][i][i][i][i][i][i][i] }[/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i]
- [i][i][i][i][i][i][i][i][i][i][i] }[/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i]
- [i][i][i][i][i][i][i][i][i][i][i] int res = 0;[/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i]
- [i][i][i][i][i][i][i][i][i][i][i] for(int i = 0; i < m;++i) [/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i]
- [i][i][i][i][i][i][i][i][i][i][i] res = max(res, func(h[i]));[/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i]
- [i][i][i][i][i][i][i][i][i][i][i] return res;[/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i]
- [i][i][i][i][i][i][i][i][i][i][i] }[/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i]
- [i][i][i][i][i][i][/i][/i][/i][/i][/i][/i]
- [i][i][i][i][i][i][i][i][i][i][i]};[/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i]
- [i][i][i][i][i][i][/i][/i][/i][/i][/i][/i]
- [i][i][i][i][i][i][i][i][i][i][i]
复制代码 [/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i]
|
|