1. 特殊数组的特征值
思路
懒得思考,直接暴力
代码
class Solution {
public:
int specialArray(vector<int>& nums) {
for(int i=1;i<1010;i++)
{
int cnt = 0;
for(int j=0;j<nums.size();j++)
{
if(nums[j]>=i)
cnt++;
}
if(cnt==i)
return cnt;
}
return -1;
}
};
2. 奇偶树
思路
层序遍历(bfs)。设置一些必要的标记,遍历一遍,判断一下就行了。
代码
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
typedef struct P
{
TreeNode* node;
int level;
}P;
class Solution {
public:
bool isEvenOddTree(TreeNode* root) {
queue<P> que;
que.push({root,0});
int prevlevel = -1;
int lastval = 0;
while(que.size())
{
TreeNode* nex = que.front().node;
int level = que.front().level;
que.pop();
if(level!=prevlevel)
{
//奇数层 奇数则false
if(level%2==1&&nex->val%2==1)
return false;
if(level%2==0&&nex->val%2==0)
return false;
prevlevel = level;
lastval = nex->val;
}
else{
//奇数层 为奇数或递增则false
if(level%2==1)
{
if(nex->val%2==1||nex->val>=lastval)
return false;
lastval = nex->val;
}
//偶数层 为偶数或递减
else{
if(nex->val%2==0||nex->val<=lastval)
return false;
lastval = nex->val;
}
}
if(nex->left)
que.push({nex->left,level+1});
if(nex->right)
que.push({nex->right,level+1});
}
return true;
}
};
3. 可见点的最大数目
思路
是个几何题,比赛时WA了8次过了前103个点(共120)。需要注意的细节很多。代码参考https://leetcode-cn.com/problems/maximum-number-of-visible-points/solution/atan2jiu-wan-shi-liao-by-time-limit/
代码
const double PI = 3.1415926;
class Solution {
public:
int visiblePoints(vector<vector<int>>& points, int angle, vector<int>& location) {
int ans = 0;
vector<double> angles;
int x = location[0];
int y = location[1];
for(auto point : points)
{
int dx = point[0] - x;
int dy = point[1] - y;
if(dx==0&&dy==0)
ans++;
else
angles.emplace_back(atan2(dy,dx));
}
sort(angles.begin(),angles.end());
int n = angles.size();
for(int i=0;i<n;i++)
angles.emplace_back(angles[i]+2*PI);
//int add = 0;
int res = 0;
double angg = angle*PI/180;
for(int i=0,j=0;i<angles.size();i++)
{
while(j<angles.size()&&(fabs(angles[j]-angles[i]-angg)<1e-8||angles[j]-angles[i]<angg))
j++;
res = max(j-i+ans,res);
}
return res;
}
};