LeetCode Weekly Contest 6
leetcode现在每周末举办比赛,这是今天上午参加的比赛的题解。
题目难度不算大,两个easy,一个medium,一个hard。hard题之前接触过,所以做得比较顺利。
1. Sum of Left Leaves(Leetcode 404 Easy)
Find the sum of all left leaves in a given binary tree.
Example:
3
/ \
9 20
/ \
15 7 There are two left leaves in the binary tree, with values 9 and 15 respectively. Return 24.
分析:比较简单的二叉树问题。二叉树问题大部分用递归就能解决,本题就是traverse的变形,这里加一个flag判断是左子树还是右子树即可。
代码:
/**
* 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 {
private:
int result = ;
void traverse(TreeNode* root, int flag) {
if (root == nullptr) {
return;
}
if (root -> left == nullptr && root -> right == nullptr && flag == -) {
result += root -> val;
return;
}
traverse(root -> left, -);
traverse(root -> right, ); }
public:
int sumOfLeftLeaves(TreeNode* root) {
traverse(root, );
return result;
}
};
2. Convert a Number to Hexadecimal (Leetcode 405 Easy)
Given an integer, write an algorithm to convert it to hexadecimal. For negative integer, two’s complement method is used.
Note:
- All letters in hexadecimal (
a-f
) must be in lowercase. - The hexadecimal string must not contain extra leading
0
s. If the number is zero, it is represented by a single zero character'0'
; otherwise, the first character in the hexadecimal string will not be the zero character. - The given number is guaranteed to fit within the range of a 32-bit signed integer.
- You must not use any method provided by the library which converts/formats the number to hex directly.
Example 1:
Input:
26 Output:
"1a"
Example 2:
Input:
-1 Output:
"ffffffff"
分析:十六进制的转换,搞清楚负数补码的原理就可以(拿0x100000000 + x即可),注意存的时候用一下long long防止整数溢出。
代码:
class Solution {
public:
string toHex(int num) {
string result;
long long num2 = num;
char hex[] = {'','','','','','','','','','','a','b','c','d','e','f'};
if (num2 < ) {
num2 = 0x100000000 + num2;
}
if (num2 == ) {
result += '';
return result;
}
while (num2 != ) {
result = hex[num2 % ] + result;
num2 /= ;
}
return result;
}
};
3. Queue Reconstruction by Height (LeetCode406 Medium)
Suppose you have a random list of people standing in a queue. Each person is described by a pair of integers (h, k)
, where h
is the height of the person and k
is the number of people in front of this person who have a height greater than or equal to h
. Write an algorithm to reconstruct the queue.
Note:
The number of people is less than 1,100.
Example
Input:
[[7,0], [4,4], [7,1], [5,0], [6,1], [5,2]] Output:
[[5,0], [7,0], [5,2], [6,1], [4,4], [7,1]]
分析:题意是给出人的高度和该高度前面有多少个人,重拍序列满足这一要求。
把序列中的人按照高度从高到低排序,高度一样的前面人越少的越靠前。这样以此处理每一个点,
按照people[i].second中存的有几个比他高来判断他应该在第几个位置插入(比该点高的点已经都进入序列了),处理完毕后即满足要求。
代码:(比较函数用了C++11中的lambda表达式)
class Solution {
public:
vector<pair<int, int>> reconstructQueue(vector<pair<int, int>>& people) {
vector<pair<int, int>> result;
sort(people.begin(), people.end(), [](const pair<int, int>& p1, const pair<int, int>& p2)
{
if (p1.first == p2.first) {
return p1.second < p2.second;
}
else return p1.first > p2.first;
} );
for (int i = ; i < people.size(); ++i) {
result.insert(result.begin() + people[i].second, people[i]);
}
return result;
}
};
4. Trapping Rain Water II (Leetcode 407 Hard)
Given an m x n
matrix of positive integers representing the height of each unit cell in a 2D elevation map, compute the volume of water it is able to trap after raining.
Note:
Both m and n are less than 110. The height of each unit cell is greater than 0 and is less than 20,000.
Example:
Given the following 3x6 height map:
[
[1,4,3,1,3,2],
[3,2,1,3,2,4],
[2,3,3,2,3,1]
] Return 4.
The above image represents the elevation map [[1,4,3,1,3,2],[3,2,1,3,2,4],[2,3,3,2,3,1]]
before the rain.
After the rain, water are trapped between the blocks. The total volume of water trapped is 4.
分析:
维护一个最小堆和一个记录访问与否的数组flag[m][n], 把图中外层一圈元素存入堆中,flag相应标记。
然后开始如下循环:
拿出其中堆顶元素(temp),BFS的方法查看其四周的四个点,
如果存在高度比temp低的点(heightMap[nx][ny]),则temp.h - heightMap[nx][ny]这段高度肯定可以储水。
然后把nx,ny位置的点加入堆中(但其高度应改为temp.h,多出部分已经储水记录过),并更新flag。
对于高度比temp高的点,直接加入堆中,并更新flag即可。
这样当堆中为空处理完所有点后,结果即为储水的值。
代码:
class Solution {
private:
struct node {
int x, y, h;
node(int nx, int ny, int nh):x(nx), y(ny), h(nh){}
};
int dx[] = {-,,,};
int dy[] = {,,-,};
struct cmp {
bool operator() (const node &n1, const node &n2) {
return n1.h > n2.h;
}
};
public:
int trapRainWater(vector<vector<int>>& heightMap) {
if (heightMap.size() == ) {
return ;
}
int m = heightMap.size(), n = heightMap[].size();
int flag[m][n] = {};
int result = ;
priority_queue<node, vector<node>, cmp> que;
for (int i = ; i < m; ++i) {
que.push(node(i,, heightMap[i][]));
flag[i][] = ;
que.push(node(i,n - , heightMap[i][n - ]));
flag[i][n - ] = ;
}
for (int i = ; i < n - ; ++i) {
que.push(node(,i,heightMap[][i]));
flag[][i] = ;
que.push(node(m - , i,heightMap[m - ][i]));
flag[m - ][i] = ;
}
while (!que.empty()) {
node temp = que.top();
que.pop();
for (int i = ; i < ; ++i) {
int nx = temp.x + dx[i], ny = temp.y + dy[i];
if (nx >= && nx < m && ny >= && ny < n && !flag[nx][ny]) {
result += max(, temp.h - heightMap[nx][ny]);
que.push(node(nx, ny, max(temp.h, heightMap[nx][ny])) );
flag[nx][ny] = ;
}
}
}
return result;
}
};
LeetCode Weekly Contest 6的更多相关文章
- LeetCode Weekly Contest 8
LeetCode Weekly Contest 8 415. Add Strings User Accepted: 765 User Tried: 822 Total Accepted: 789 To ...
- leetcode weekly contest 43
leetcode weekly contest 43 leetcode649. Dota2 Senate leetcode649.Dota2 Senate 思路: 模拟规则round by round ...
- LeetCode Weekly Contest 23
LeetCode Weekly Contest 23 1. Reverse String II Given a string and an integer k, you need to reverse ...
- Leetcode Weekly Contest 86
Weekly Contest 86 A:840. 矩阵中的幻方 3 x 3 的幻方是一个填充有从 1 到 9 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等. 给定一个 ...
- LeetCode Weekly Contest
链接:https://leetcode.com/contest/leetcode-weekly-contest-33/ A.Longest Harmonious Subsequence 思路:hash ...
- 【LeetCode Weekly Contest 26 Q4】Split Array with Equal Sum
[题目链接]:https://leetcode.com/contest/leetcode-weekly-contest-26/problems/split-array-with-equal-sum/ ...
- 【LeetCode Weekly Contest 26 Q3】Friend Circles
[题目链接]:https://leetcode.com/contest/leetcode-weekly-contest-26/problems/friend-circles/ [题意] 告诉你任意两个 ...
- 【LeetCode Weekly Contest 26 Q2】Longest Uncommon Subsequence II
[题目链接]:https://leetcode.com/contest/leetcode-weekly-contest-26/problems/longest-uncommon-subsequence ...
- 【LeetCode Weekly Contest 26 Q1】Longest Uncommon Subsequence I
[题目链接]:https://leetcode.com/contest/leetcode-weekly-contest-26/problems/longest-uncommon-subsequence ...
- LeetCode Weekly Contest 47
闲着无聊参加了这个比赛,我刚加入战场的时候时间已经过了三分多钟,这个时候已经有20多个大佬做出了4分题,我一脸懵逼地打开第一道题 665. Non-decreasing Array My Submis ...
随机推荐
- JSP-response(HttpServletResponse)
1 HttpServletResponse概述 2 Response 运行过程 3 通过抓包工具抓取Http响应 4 响应行 5 设置响应头 set 和add的区别 6 重定向 需要完成分析‘ 6 ...
- case 和decode的区别
区别: decode是pl/sql语法,只能在oracle中使用,case when是标准SQL的语法,哪儿都能用,也就是说移植性更强. decode像是case when的精简版,当要实现的功能比较 ...
- python 处理缺失数据
- 【模板】tyvjP1520 树的直径 [2017年5月计划 清北学堂51精英班Day3]
P1520 树的直径 时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述 树的直径,即这棵树中距离最远的两个结点的距离.每两个相邻的结点的距离为1,即父亲结点与儿 ...
- 洛谷P1569属牛的抗议 超级强力无敌弱化版
P1569 [USACO11FEB]属牛的抗议Generic Cow Prote- 题目描述 约翰家的N头奶牛聚集在一起,排成一列,正在进行一项抗议活动.第i头奶牛的理智度 为Ai,Ai可能是负数.约 ...
- php中 重载的方法
php中 重载(一)这个文章,谢谢.作为初学者,大牛勿喷: 基本是两个方法 __call,当调用对一个不可访问的对象方法时,会自动执行该魔术方法!(对象调用) 典型的两种处理方式: 1,给出友好的提示 ...
- windows下maven的安装配置
什么是maven Maven是基于POM(工程对象模型),通过一小段描述来对项目的代码.报告.文件进管理的工具. Maven是一个跨平台的项目管理工具,它是使用java开发的,它要依赖于jdk1.6及 ...
- Faster RCNN算法训练代码解析(3)
四个层的forward函数分析: RoIDataLayer:读数据,随机打乱等 AnchorTargetLayer:输出所有anchors(这里分析这个) ProposalLayer:用产生的anch ...
- LintCode刷题笔记-- InterLeaving
标签: 动态规划 解题思路 1. 这道题最重要的是,存在三个字符串,但是并不需要两个二维矩阵来进行解,因为可以使用i+j-1来代表s3的下标,这样就可以通过i和j来遍历s3了.因为对于任何一个合法的交 ...
- Leetcode859.Buddy Strings亲密字符串
给定两个由小写字母构成的字符串 A 和 B ,只要我们可以通过交换 A 中的两个字母得到与 B 相等的结果,就返回 true :否则返回 false . 示例 1: 输入: A = "ab& ...