LeetCode 338 Counting Bits

  • 2019 年 12 月 29 日
  • 筆記

比特位計數

題意

給定一個非負整數 num. 對於 0 ≤ i ≤ num 範圍中的每個數字 i, 計算其二進位數中的 1 的數目並將它們作為數組返回.

示例 1:

輸入: 2  輸出: [0,1,1]

示例 2:

輸入: 5  輸出: [0,1,1,2,1,2]

解法

此題是 LeetCode 191 Number of 1 Bits 的拓展版, 可以利用那道題的兩種演算法, 只不過套個循環, 時間和空間複雜度都是 O(n).

那兩種解法就不說了. 這裡說下另一種解法.

這裡分為 2 的倍數非 2 的倍數 兩種數.

他們有一個區別就是二進位的最低位是否為 1.

2 的倍數其二進位最低位都是 0. 非 2 的倍數其二進位最低位都是 1.

除 2 或右移一位後, 等於是去掉最低位, 那麼既然 2 的倍數最後一位都是 0, 所以對於 2 的倍數 除 2 或右移一位後, 數字 1 的個數並不會變.

那麼對於非 2 的倍數 n, n 肯定比 n - 1 的二進位中 1 的個數多一位. 如 n = 1111, n – 1 = 1110.

class Solution {      public int[] countBits(int num) {          int[] arr = new int[num + 1];          for (int i = 0; i <= num; i++) {              if (i % 2 == 0) {                  arr[i] = arr[i >> 1];              } else {                  arr[i] = arr[i - 1] + 1;              }          }          return arr;      }  }

時間複雜度 O(n), 空間複雜度 O(n).

Exit mobile version