元素』a』是否存在,通常用set:集合
set只儲存鍵,而不需要對應其相應的值。
set中的鍵不允許重複
元素』a』出現了幾次:dict–>字典
dict中的鍵不允許重複
通過將原有序列的關係對映統一表示為其他
演算法應用
leetcode 349 intersection of two arrays 1
題目描述
給定兩個陣列nums,求兩個陣列的公共元素。
如nums1 =
[1,2,2,1],nums2 =
[2,2]
結果為[2]
結果中每個元素只能出現一次
出現的順序可以是任意的
分析實現
由於每個元素只出現一次,因此不需要關注每個元素出現的次數,用set的資料結構就可以了。記錄元
素的有和無。
把nums1記錄為set,判斷nums2的元素是否在set中,是的話,就放在乙個公共的set中,最後公共的
set就是我們要的結果。
**如下
class solution:
def intersection(self, nums1: list[int], numlist[int]
) -> list[int]:
nums1 = set(nums1)
return set(
[i for i in nums2 if i in nums1]
)
也可以通過set的內建方法來實現,直接求set的交集:
class solution:
def intersection(self, nums1: list[int], nums2: list[int]
) -> list[int]:
set1 = set(nums1)
set2 = set(nums2)
return set2 & set1
leetcode 350 intersection of two arrays 2
題目描述
給定兩個陣列nums,求兩個陣列的交集。
如nums1=
[1,2,2,1],nums=
[2,2
結果為[2,2]
出現的順序可以是任意的
分析實現
元素出現的次數有用,那麼對於儲存次數就是有意義的,所以選擇資料結構時,就應該選擇dict的結
構,通過字典的比較來判斷;
記錄每個元素的同時要記錄這個元素的頻次。
記錄num1的字典,遍歷nums2,比較nums1的字典的nums的key是否大於零,從而進行判斷。
**如下:
class solution:
def intersect(self, nums1: list[int], nums2: list[int]
) -> list[int]:
from collections import counter
nums1_dict = counter(nums1)
res =
for num in nums2:
if nums1_dict[num]
> 0:
# 說明找到了乙個元素即在num1也在nums2
nums1_dict[num] -= 1
return res
示例:
輸入: 19
輸出: true
解釋:1^2 + 9^2 = 82
8^2 + 2^2 = 68
6^2 + 8^2 = 100
1^2 + 0^2 + 0^2 = 1
class solution:
already = set(
)while n != 1:
sum= 0
while n > 0:
# 取n的最後一位數
tmp = n % 10
sum += tmp ** 2
# 將n的最後一位截掉
n //= 10
# 如果求的和在過程**現過
ifsum
in already:
return false
else:
already.add(sum)
n =sum
return true
leetcode題解 查詢表問題
查詢,是使用計算機處理問題時的乙個最基本的任務,因此也是面試中非常常見的一類問題。很多演算法問題的本質,就是要能夠高效查詢。學會使用系統庫中的map和set,就已經成功了一半。349.intersection of two arrays 時間複雜度 o nlogn 空間複雜度 o n class s...
查詢 有序表查詢
1 折半查詢 折半查詢又稱二分查詢,時間複雜度為 2 插值查詢 插值查詢是另一種有序表查詢演算法,其核心就在於插值公式 3 斐波那契查詢 4 三種有序表查詢演算法比較 三種有序表查詢本質上是分隔點的選擇不同,折半查詢分隔點是 折半查詢進行加法和除法運算 mid low high 2 插值查詢進行複雜...
查詢 雜湊表查詢(雜湊表)
1 雜湊表查詢定義 雜湊技術是在記錄的儲存位置和它的關鍵字之間建立乙個確定的對應關係f,使得每個關鍵字key對應乙個儲存位置f key 查詢時,根據這個確定的對應關係找到給定值key的對映f key 若查詢集合中存在這個記錄,則必定在f key 的位置上。採用雜湊技術將記錄儲存在一塊連續的儲存空間中...