給定乙個排序陣列,你需要在 原地 刪除重複出現的元素,使得每個元素只出現一次,返回移除後陣列的新長度。
不要使用額外的陣列空間,你必須在 原地 修改輸入陣列 並在使用 o(1) 額外空間的條件下完成。
class
solution
:def
removeduplicates
(self, nums: list[
int])-
>
int:
n =len(nums)
i =0for j in
range
(n):
if nums[i]
!=nums[j]
: i+=
1 nums[i]
=nums[j]
nums[:]
=nums[
0:i+
1]
實現獲取下乙個排列的函式,演算法需要將給定數字序列重新排列成字典序中下乙個更大的排列。
如果不存在下乙個更大的排列,則將數字重新排列成最小的排列(即公升序排列)。
必須原地修改,只允許使用額外常數空間。
1,2,3 → 1,3,2
3,2,1 → 1,2,3
1,1,5 → 1,5,1
字典序如下: [1]
設p是1~n的乙個全排列:p=p1p2......pn=p1p2......pj-1pjpj+1......pk-1pkpk+1......pn
1)從排列的右端開始,找出第乙個比右邊數字小的數字的序號j(j從左端開始計算),即 j=max(右邊的數從右至左是遞增的,因此k是所有大於pj的數字中序號最大者)
3)對換pj,pk
4)再將pj+1......pk-1pkpk+1......pn倒轉得到排列p'=p1p2.....pj-1pjpn.....pk+1pkpk-1.....pj+1,這就是排列p的下乙個排列。
有了這個性質,這道題便迎刃而解:
class
solution
:def
nextpermutation
(self, nums: list[
int])-
>
none
:"""
do not return anything, modify nums in-place instead.
"""n =
len(nums)
for i in
range
(n-1,0
,-1)
:if nums[i-1]
: nums[i:]=
sorted
(nums[i:])
for j in
range
(i,n)
:if nums[j]
>nums[i-1]
: nums[j]
,nums[i-1]
=nums[i-1]
,nums[j]
break
return
nums.sort(
)
此外,這道題還讓我學到了sorted這個函式用於替代sort方法。 leetcode刷題筆記 陣列2
給定乙個大小為 n 的陣列,找到其中的多數元素。多數元素是指在陣列 現次數大於 n 2 的元素。你可以假設陣列是非空的,並且給定的陣列總是存在多數元素。這道題主體思想是雜湊對映。python的字典就使用了hash的思想。直接貼 class solution def majorityelement s...
leetcode刷題筆記 陣列3
給定乙個整數陣列,判斷是否存在重複元素。如果任何值在陣列 現至少兩次,函式返回 true。如果陣列中每個元素都不相同,則返回 false。這裡的解答用到了投機取巧的一種方法,使用set函式 class solution def containsduplicate self,nums list int...
C 刷題筆記 陣列
在乙個二維陣列中 每個一維陣列的長度相同 每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。利用該二維陣列的性質 所以,對於左下角的值 m,它是該行最小的數,又是該列最大的數。可以從這裡開始比較,按行按...