leetcode刷題筆記 陣列3

2021-10-04 17:29:24 字數 4819 閱讀 7751

給定乙個整數陣列,判斷是否存在重複元素。

如果任何值在陣列**現至少兩次,函式返回 true。如果陣列中每個元素都不相同,則返回 false。

這裡的解答用到了投機取巧的一種方法,使用set函式:

class

solution

:def

containsduplicate

(self, nums: list[

int])-

>

bool

: n =

len(nums)

c =len(

set(nums)

)if n>c:

return

true

else

:return

false

介紹:

set() 函式建立乙個無序不重複元素集,可進行關係測試,刪除重複資料,還可以計算交集、差集、並集等。下面說說傳統方法,即雜湊表的python實現:

class

solution

:def

containsduplicate

(self, nums: list[

int])-

>

bool

: dic =

for i in nums:

if dic.get(i)

:return

true

dic[i]=1

return

false

這裡可以看到,實際我們就是使用了字典,字典正是使用雜湊表實現的。

我們這裡使用了get()方法:

介紹:python 字典 get() 函式返回指定鍵的值,如果值不在字典中返回預設值。

返回:返回指定鍵的值,如果值不在字典中返回預設值 none。

給定乙個整數陣列和乙個整數 k,判斷陣列中是否存在兩個不同的索引 i 和 j,使得 nums [i] = nums [j],並且 i 和 j 的差的 絕對值 至多為 k。

這裡仍然是使用雜湊表,也就是字典完成題目,但是我們這次改變鍵值對的配置方法,將數字設定成key,而將數字對應的陣列下標設定為value。然後:

每次檢查新的數字是否存在於這個字典中,若存在,則將當前的陣列下標與字典中相應的key對應的value相減,結果為cha。

比較cha與k的大小,如果大於,就更新這個key的value,如果小於則直接返回true。

下面貼上**:

class

solution

:def

containsnearbyduplicate

(self, nums: list[

int]

, k:

int)

->

bool

: n =

len(nums)

dic=

for i in

range

(n):

if nums[i]

notin dic:

dic[nums[i]]=i

continue

if nums[i]

in dic:

cha=i-dic[nums[i]

]if cha<=k:

return

true

if cha>k:

dic[nums[i]]=i

return

false

這裡發現乙個神奇的用法,就是if nums[i] not in dic,原來字典也可以使用not in這類語句。

乙個「快樂數」定義為:對於乙個正整數,每一次將該數替換為它每個位置上的數字的平方和,然後重複這個過程直到這個數變為 1,也可能是無限迴圈但始終變不到 1。如果可以變為 1,那麼這個數就是快樂數。

這個做法使用的是hashset,首先定義乙個函式用於更新n,然後每次更新n都檢查n是否在已經分配的乙個集合中,如果在,就把n加進集合中,最後檢查n是否為1。

class

solution

:def

(self, n:

int)

->

bool

:def

getnext

(n):

total_sum=

0while n>0:

n,yu =

divmod

(n,10

) total_sum += yu**

2return total_sum

seen =

set(

)while n !=

1and n not

in seen:

seen.add(n)

n=getnext(n)

return n ==

1

這裡學到乙個nb的寫法用於計算乙個數所有數字的平方和,那就是:

sum([

int(i)**2

for i in

str(n)

])

給你兩個有序整數陣列 nums1 和 nums2,請你將 nums2 合併到 nums1 中,使 num1 成為乙個有序陣列。

初始化 nums1 和 nums2 的元素數量分別為 m 和 n 。

你可以假設 nums1 有足夠的空間(空間大小大於或等於 m + n)來儲存 nums2 中的元素。

這個題目我初始想到的就是利用sort和del,但是這樣資源消耗比較多,下面是**:

class

solution

:def

merge

(self, nums1: list[

int]

, m:

int, nums2: list[

int]

, n:

int)

->

none

:"""

do not return anything, modify nums1 in-place instead.

"""for i in

range

(n):

nums1.insert(m,nums2[i]

)del nums1[m+n:

] nums1.sort(

)

class

solution

(object):

defmerge

(self, nums1, m, nums2, n)

:"""

:type nums1: list[int]

:type m: int

:type nums2: list[int]

:type n: int

:rtype: void do not return anything, modify nums1 in-place instead.

"""# make a copy of nums1.

nums1_copy = nums1[

:m]

nums1[:]

=[]# two get pointers for nums1_copy and nums2.

p1 =

0 p2 =

0# compare elements from nums1_copy and nums2

# and add the smallest one into nums1.

while p1 < m and p2 < n:

if nums1_copy[p1]

< nums2[p2]: )

p1 +=

1else:)

p2 +=

1# if there are still elements to add

if p1 < m:

nums1[p1 + p2:

]= nums1_copy[p1:

]if p2 < n:

nums1[p1 + p2:

]= nums2[p2:

]

但這裡有兩行很讓人迷惑,即:

nums1_copy = nums1[:m]

nums1[:] =

這裡學習到了乙個python的語言特性,關於陣列的複製,下面的例子說明了nums1和nums1[:]在被賦值時的區別,也正是為什麼官方這麼進行賦值的原因:

# 物件在記憶體中的位址與id 一一對應,可以使用 id() 檢視並判斷是否是同乙個物件

nums1 =[1

,2,4

,0,0

]print(id

(nums1)

)# 140125129895880

a =[1,

2,3,

4,5]

print(id

(a))

# 140125129856640

nums1[:]

= aprint(id

(nums1)))

# 140125129895880, 仍是原 list 物件, 只不過這一 list 物件的值發生了改變

# 若不執行 nums1[:] = a, 而執行

nums1 = a

print(id

(nums1)

)# 140125129856640, 不再是之前的那個 list 物件

leetcode刷題筆記 陣列2

給定乙個大小為 n 的陣列,找到其中的多數元素。多數元素是指在陣列 現次數大於 n 2 的元素。你可以假設陣列是非空的,並且給定的陣列總是存在多數元素。這道題主體思想是雜湊對映。python的字典就使用了hash的思想。直接貼 class solution def majorityelement s...

leetcode刷題筆記 陣列7

給定乙個排序陣列,你需要在 原地 刪除重複出現的元素,使得每個元素只出現一次,返回移除後陣列的新長度。不要使用額外的陣列空間,你必須在 原地 修改輸入陣列 並在使用 o 1 額外空間的條件下完成。class solution def removeduplicates self,nums list i...

C 刷題筆記 陣列

在乙個二維陣列中 每個一維陣列的長度相同 每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。利用該二維陣列的性質 所以,對於左下角的值 m,它是該行最小的數,又是該列最大的數。可以從這裡開始比較,按行按...