标签:ret bit etc nlogn span 时间复杂度 一个 二进制 ++
很容易想到时间复杂度为O(nlogn)的做法。可以做一个小优化,就是先找出小于num的2的次幂,然后ans[i] = 1 + ans[i-max2];就是i的二进制中1的个数等于1+i-小于i的最大的2次幂的1的个数。
class Solution { public int[] countBits(int num) { num++; int[] ans = new int[num], can = new int [num]; ans[0] = 0; if(num == 1) return ans; for(int i=2;i<num;i*=2) { can[i] = i; ans[i] = 1; } for(int i=3;i<num;i++){ if(can[i] == 0) can[i] = can[i-1]; } ans[1] = 1; for(int i=3;i<num;i++){ ans[i] = 1+ans[i-can[i]]; } return ans; } }
标签:ret bit etc nlogn span 时间复杂度 一个 二进制 ++
原文地址:https://www.cnblogs.com/ctqchina/p/10111636.html