显然这个算法的复杂度太糟糕了,每移动1个0就放弃了上一次移动变化的所有信息,如同冒泡一样去移动0。现在可以从这个算法上改进。 观察发现,从最高位开始,在第t位遇到的第一个0称为首0,如果遇到00,则无条件变为10,首0向后了一位,如果遇到01,如果想把0->1则至少要找到形如0+x个1+0的结构变为10+x个1,对于n-t+1位已经达到最大,对于t+1位后的0取决于x个1后,如果遇到0,则变成1并让首0向后一位,如果遇到1,则x->x+1 function solution(int arr[],int size){ int t; for(t=0;t<size;t++){ if(arr[t]!=0) break; } for(int i=t;i<size;i++){ if(arr[i]==0){ if(i==size-1) break; if(arr[i+1]==0){ arr[i]=1; }else{ int t0=0,tp; for(int j=i+2;j<size;j++){ if(arr[j]==0){ t0++; arr[j]=1; tp=j; } } if(t0!=0){ swap(arr[min(i+t0,j)],arr[i]); } break; } } return arr; }
点赞 评论

相关推荐

04-25 18:13
五邑大学 Java
无面如何呢:用心包装一下自己的实习
点赞 评论 收藏
分享
牛客网
牛客企业服务