一个dp问题(我又菜起来了)
curSum记录当前遇到的连续的1。 curSumF记录翻转过后最长的连续1。
遇到0
curSum置0。
curSumF置为curSum+1,表示连接了前面一段。
遇到1
curSum和curSumF都加1。
因为curSum始终记录这前面一段连续1,所以设置为curSum+1后,如果后面还连续,就会自动更新连接这两段,如果后面为1,那就会清空为仅翻转当前位。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| class Solution { public: int reverseBits(int num) { int curSum = 0; int curSumF = 0; int ret = 0; int i = 0; while(i++ < 32) { if(num & 1) { ++curSum; ++curSumF; }else { curSumF = curSum + 1; curSum = 0; } num >>= 1; ret = max(ret, curSumF); } return ret; } };
|
类似滑动窗口