LeetCode Contest 177
Posted Shendu.cc
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode Contest 177相关的知识,希望对你有一定的参考价值。
Number of Days Between Two Dates
计算两个日期的相差天数
public class Solution {
public int DaysBetweenDates(string date1, string date2) {
DateTime time1 = DateTime.Parse(date1);
DateTime time2 = DateTime.Parse(date2);
return Math.Abs((time2-time1).Days);
}
}
给你一些点和边,判断是否是一颗二叉树。只需要判断所有点的入度<=1 ,并且入度为0的点只有一个,就可以了。
class Solution {
public:
int b[10005];
bool validateBinaryTreeNodes(int n, vector<int>& leftChild, vector<int>& rightChild) {
for(int i=0;i<n;i++)
{
if(leftChild[i]!=-1)
{
b[leftChild[i]]++;
if(b[leftChild[i]]>1)
return false;
}
}
for(int i=0;i<n;i++)
{
if(rightChild[i]!=-1)
{
b[rightChild[i]]++;
if(b[rightChild[i]]>1)
return false;
}
}
int pos =0;
int num=0;
for(int i=0;i<n;i++)
{
if(b[i]==0)
{
pos=i;
num++;
}
}
if(num!=1)
return false;
return true;
}
};
从sqrt(x)往前找就可以了,找到的第一个一定是最优的。
class Solution {
public:
vector<int> closestDivisors(int num) {
vector<int> ans;
vector<int> ans2;
int res=0;
int res2=0;
int x = num+1;
int i;
i = (int)sqrt(x);
for(;i>=1;i--)
{
if(x%i==0)
{
ans.push_back(i);
ans.push_back(x/i);
res = abs(i-x/i);
break;
}
}
x = num+2;
i = (int)sqrt(x);
for(;i>=1;i--)
{
if(x%i==0)
{
ans2.push_back(i);
ans2.push_back(x/i);
res2 = abs(i-x/i);
break;
}
}
if(res<=res2)
return ans;
else
return ans2;
}
};
被三整除的数,每个数位上的数字之和能被3整除。
也就是在这个数列里找到一个子数列,之和能被3整除,并且这个数列长度是最长的,最后按照数列的倒序输出成字符串。
我们把数列里的数字分成三种,c[]被3整除的,b[]被3除余1的,a[]被三除余2的,倒序排序,越大的数字越优先。
答案中肯定包含所有c[]里的数字,其次就是b[]和a[]的组合。
一个b和a的和可以被三整除,3个b和3个a也可以分别被三整除。
关键就是怎么可以从a和b中拿出最多的数字。
思路就是首先,两个数组的长度都大于等于3的话,那么从第一个元素开始,每三个元素都是一定会被选中的。直到剩下的元素不足三个。而且两个数组必须同时满足剩下的元素大于3个这个条件。
经过第一次筛选之后,剩下的分情况讨论。假设剩下的元素多的个数为x,剩下元素个数少的个数为y,其中0<=y<=2,x>y
如果 x>3 把x数组里的元素组合起来,最后剩余的是x=x%3
x=3,y=2 选择把x,y搭配
x=3,y=1 把x元素组合起来
x<3 选择把x,y搭配
y==0 只选择x
class Solution {
public:
vector<int> a;
vector<int> b;
vector<int> c;
vector<int> d;
string largestMultipleOfThree(vector<int>& digits) {
for(int i=0;i<digits.size();i++)
{
if(digits[i]%3==0)
c.push_back(digits[i]);
if(digits[i]%3==2)
a.push_back(digits[i]);
if(digits[i]%3==1)
b.push_back(digits[i]);
}
sort(a.begin(),a.end());
sort(b.begin(),b.end());
int i,j;
i=a.size()-1;
j=b.size()-1;
for(;i>=2&&j>=2;i-=3,j-=3)
{
d.push_back(a[i]);
d.push_back(a[i-1]);
d.push_back(a[i-2]);
d.push_back(b[j]);
d.push_back(b[j-1]);
d.push_back(b[j-2]);
}
if(i<j)
fun(b,a,j,i);
else
fun(a,b,i,j);
i=0;
for(;i<c.size();i++)
{
d.push_back(c[i]);
}
sort(d.begin(),d.end());
string ans="";
i=d.size()-1;
for(;i>=0;i--)
{
ans+='0'+d[i];
}
if(ans[0]=='0'&&ans[ans.length()-1]=='0')
ans="0";
return ans;
}
void fun(vector<int>& nums1,vector<int>& nums2,int i,int j)
{
if(j==-1)
{
for(;i>=2;i-=3)
{
d.push_back(nums1[i]);
d.push_back(nums1[i-1]);
d.push_back(nums1[i-2]);
}
}
for(;i>2;i-=3)
{
d.push_back(nums1[i]);
d.push_back(nums1[i-1]);
d.push_back(nums1[i-2]);
}
if(j==0&&i==2)
{
d.push_back(nums1[i]);
d.push_back(nums1[i-1]);
d.push_back(nums1[i-2]);
}
else
{
for(;i>=0&&j>=0;j--,i--)
{
d.push_back(nums1[i]);
d.push_back(nums2[j]);
}
}
}
};
以上是关于LeetCode Contest 177的主要内容,如果未能解决你的问题,请参考以下文章