201. 數字範圍按位與

中等 位運算

思路

現在的右邊界是 right\text{right},跟 right - 1&\text{right - 1}\& 之後,right\text{right}的最後一個 1 就會被捨棄。
找到 right\text{right}最右邊的 11 所在的位置。
然後減去這個數值,就能將無法活下來的位數給抹掉。

right010100010000right &(right)000000010000010100000000\begin{array}{} \text{right} & 0101000\blue10000 \\\text{right}~\&(-\text{right}) & 0000000\blue10000 & - \\\hline & 0101000\blue00000 \end{array}

只有前面的 1 才有機會活下來,最後一個 1 已經沒有機會了。
重複操作直到 leftright\text{left}\geq\text{right},也就是讓 right\text{right}無法再往下減。

程式碼

位運算

class Solution {
public:
    int rangeBitwiseAnd(int left, int right) {
        while(left < right) {
            right -= right & -right;
        }
        return right;
    }
};

複雜度分析

  • 時間複雜度:O(logn)O(\log{n})
  • 空間複雜度:O(1)O(1)

顯示設定

背景線條
顯示背景網格線條
懸停發光
滑鼠懸停時顯示霓虹效果
聚光燈
跟隨滑鼠的聚光燈效果
背景透明度
開啟透明玻璃效果
主題顏色
自訂主要顏色