天天看点

leetcode:927. 三等分(贪心)

题目:

leetcode:927. 三等分(贪心)

分析:

这么难的题,作为菜鸡的我,当然是果断选择放弃。

题解:

有无的判断:可以根据1的个数是否是3的倍数。这是二进制数的特征!

那么思路就很清晰了。分1的个数。

1.首先同时到三份的最后一个位置。

2.根据最后一份的零开始对第一二份开始补零。

3.补零完成,那么剩余的0放在首部,对数的大小没影响。

4.逐个位置判断3份的对应的数是否相等。

代码:

int main()
{
 vector<int> A;
 int all=0;
 vector<int> v(2,-1);
 int ok=1;
 //判断全零的情况 
 for(int i=0;i<A.size();i++)
 if(A[i]) {
  ok=0;
  break;
 }
 if(ok)
 {
  v[0]=0;
  v[1]=2;
  return v;
 }
 for(int i=0;i<A.size();i++) 
 {
  if(A[i]) all++;
 }
 if(all%3!=0) return v;
 int a1;//从头开始数,停在第一份的结束位置。第一份的最后一个一处
 int a2;//倒着来,先停在第三份的第一个1,再停在第二份的最后一个1处。
 int a3;//停在第三份的最后一个1处。
 int t=all/3;
 //a3
 for(int i=A.size()-1;i>=0;i--)
 {
  if(A[i]) {
   a3=i;
   break;
  }
 } 
 all=0;
 //a2
 for(int i=A.size()-1;i>=0;i--)
 {
  if(A[i])
  {
   all++;
   if(all==t+1) {
    a2=i;
    break;
   }
  }
 }
 all=0;
 //a1
 for(int i=0;;i++)
 {
  if(A[i])
  {
   all++;
   if(all==t) {
    a1=i;
    break;
   }
  }
 }
 //补零 
 for(int k=0;k<A.size()-a3-1;k++)
 {
  if(A[a1+1]||A[a2+1]) return v;
  a1++;
  a2++;
 }
 //判断三者是否相等。  相等  a1  a2+1  就是答案。
 int aa1=a1;
 int aa2=a2; 
 int aa3=A.size()-1;
 for(int i=0;i<t;)
 {
  if(A[aa1]==A[aa2]&&A[aa3]==A[aa2])
  {
   if(A[aa1]) i++;
  }
  else return v;
   aa1--;
  aa2--;
  aa3--;
 } 
 v[0]=a1;
 v[1]=a2+1;
 return v;
}
           

继续阅读