目錄
左移操作
右移操作
其他博主的理解
應用——力扣題目78. 子集
解法
深度優先搜索
位運算
參考文獻
左移操作
# 左移操作,左移一位相當于乘以b,a<<b,a' = a*(2^b)
print(2<<3) # 2*2^3 = 16,2的二進制10,向左移動3位后10000
print(2<<1) # 2*2^1 = 4
print(3<<4) # 3*2^4 = 48,3的二進制為11,向左移動四位后110000
16
4
48
右移操作
# 右移操作,右移一位相當于除以b,a<<b,a' = a//(2^b)注意這里是整除,當向右移動位數大于能移動的位數時,置為0【可以理解為會將尾巴截掉】
?
print(2>>3) # 2//2^3 = 0,2的二進制10,向右最多移動2位后,所以多移動無疑為0
print(2>>1) # 2*2^1 = 4,向右移動一位為01,
print(3>>4) # 3*2^4 = 48,3的二進制為11,向右移動四位后00
print(3>>1) # 3*2^4 = 48,3的二進制為11,向右移動一位后為01
0
1
0
1
其他博主的理解
?>> 和 <<都是位運算,對二進制數進行移位操作。
<< 是左移,末位補0,類比十進制數在末尾添0相當于原數乘以10,x<<1是將x的二進制表示左移一位,相當于原數x乘2。比如整數4在二進制下是100,4<<1左移1位變成1000(二進制),結果是8。
>>是右移,右移1位相當于除以2。
而>>=和<<=,就是對變量進行位運算移位之后的結果再賦值給原來的變量,可以類比賦值運算符+=和-=可以理解。
比如x>>=2, 就是把變量x右移2位,再保留x操作后的值。
應用——力扣題目78. 子集
78. 子集——力扣題目
給你一個整數數組 nums ,數組中的元素 互不相同 。返回該數組所有可能的子集(冪集)。
解集 不能 包含重復的子集。你可以按 任意順序 返回解集。
示例 1:
輸入:nums = [1,2,3]
輸出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]示例 2:
輸入:nums = [0]
輸出:[[],[0]]提示:
??? 1 <= nums.length <= 10
??? -10 <= nums[i] <= 10
??? nums 中的所有元素 互不相同
解法
https://leetcode-cn.com/problems/subsets/solution/hui-su-python-dai-ma-by-liweiwei1419/
深度優先搜索
class Solution:# 深度優先搜索# 執行用時:36 ms, 在所有 Python3 提交中擊敗了85.39% 的用戶def subsets(self, nums):res = []sub = []n = len(nums)def dfs(index,sub):if index == n:res.append(sub[:])return# 不選擇indexdfs(index+1,sub)# 選擇sub.append(nums[index])dfs(index+1,sub)sub.remove(nums[index])dfs(0,sub)return res
位運算
記原序列中元素的總數為 nnn。原序列中的每個數字 aia_iai? 的狀態可能有兩種,即「在子集中」和「不在子集中」。我們用 111 表示「在子集中」,000 表示不在子集中,那么每一個子集可以對應一個長度為 nnn 的 0/10/10/1 序列,第 iii 位表示 aia_iai? 是否在子集中。
例如,n=3,a={1,2,3}:
可以發現 0/1 序列對應的二進制數正好從 0 到2^(n - 1)。我們可以枚舉 mask∈[0,2^(n?1)],mask的二進制表示是一個 0/1 序列,我們可以按照這個 0/1 序列在原集合當中取數。當我們枚舉完所有 2n2^n2n 個 mask\textit{mask}mask,我們也就能構造出所有的子集。
?這里其實有規律,首先是如果一個集合是由n個無重復數字組成的,那么他的子集個數為2^n,因此我們可以通過兩次遍歷,一個用于遍歷子集數,一個用于遍歷每個子集代表的二進制
class Solution:def subsets(self, nums: List[int]) -> List[List[int]]:size = len(nums)n = 1 << sizeres = []for i in range(n):cur = []for j in range(size):if i >> j & 1:cur.append(nums[j])res.append(cur)return res
參考文獻
https://zhidao.baidu.com/question/310628609.html
https://www.zhihu.com/question/397471252