LeetCode演算法個人解答 189 旋轉陣列

2021-08-30 04:46:02 字數 2935 閱讀 6973

給定乙個陣列,將陣列中的元素向右移動 k 個位置,其中 k 是非負數。

示例 1:

輸入: [1,2,3,4,5,6,7] 和 k = 3

輸出: [5,6,7,1,2,3,4]

解釋:向右旋轉 1 步: [7,1,2,3,4,5,6]

向右旋轉 2 步: [6,7,1,2,3,4,5]

向右旋轉 3 步: [5,6,7,1,2,3,4]

示例 2:

輸入: [-1,-100,3,99] 和 k = 2

輸出: [3,99,-1,-100]

解釋:向右旋轉 1 步: [99,-1,-100,3]

向右旋轉 2 步: [3,99,-1,-100]

說明:盡可能想出更多的解決方案,至少有三種不同的方法可以解決這個問題。

要求使用空間複雜度為 o(1) 的原地演算法。

1.通過示例,可以看出,每次旋轉都是將最後的元素取出再插入到第0位

2.陣列的 insert 操作可以指定元素的插入位置

3.陣列的 pop 操作可以刪去最右邊(最後一位)元素

注:直接 return 的話,返回的是乙個元組,而要求是得到陣列。

陣列是可變型別,記憶體位址指向陣列本身,即記憶體位址不會因為修改陣列內的元素而改變,所以不需要返回值。

class

solution

:def

rotate

(self, nums, k)

:"""

:type nums: list[int]

:type k: int

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

"""# 建立變數 i ,用來計算執行的次數

i =0# 執行 k 次

for i in

range

(k):

# 獲得陣列的最後一位的值

value = nums[-1

]# 刪去陣列的最後乙個元素

nums.pop(

)# 在第 0 位插入刪去的元素的值

nums.insert(

0, value)

# 返回 nums 的值

# return nums

1.通過示例,可以發現整個過程分為兩個部分

2.乙個部分是從尾部移到頭部的元素(要刪去的元素)

3.乙個部分是被移到頭部的元素往後擠的元素(只需要移動位置的元素)

4.陣列的切片可以將乙個陣列切成兩個部分

class

solution

:def

rotate

(self, nums, k)

:"""

:type nums: list[int]

:type k: int

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

"""# 獲取陣列的長度

num_len =

len(nums)

# 切片獲得兩組陣列,再重新組合

# nums[num_len - k:]獲得最後k位的元素(要刪去的元素)

# nums[:num_len - k]獲得其他元素(只需要移動位置的元素)

nums[:]

= nums[num_len - k:

]+ nums[

:num_len - k]

1.考慮到移動次數可能會多餘陣列本身的長度,消去多餘的部分,只留下實際移動的次數

2.其他和解2相同

class

solution

:def

rotate

(self, nums, k)

:"""

:type nums: list[int]

:type k: int

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

"""# 獲得元素實際移動的次數

k = k %

len(nums)

# 切片獲得兩組陣列,再重新組合

# nums[- k:]獲得最後k位的元素(要刪去的元素)

# nums[:- k]獲得其他元素(只需要移動位置的元素)

nums[:]

= nums[

-k:]

+ nums[

:-k]

1.考慮到移動次數可能會多餘陣列本身的長度,消去多餘的部分,只留下實際移動的次數

2.取得只需要移動位置的元素,並加入到陣列的尾部

3.刪去前面只需要移動位置的元素的部分

class

solution

:def

rotate

(self, nums, k)

:"""

:type nums: list[int]

:type k: int

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

"""# 獲去陣列 nums 的長度

l =len(nums)

# 判斷移動次數是否沒動或移動的次數等於陣列本身長度

if k ==

0or k == l:

# 若符合條件,不需要執行

return

k = k % l

# 將只需要移動位置的元素新增到陣列 nums 的尾部

nums.extend(nums[

:l-k]

)# 刪除前l-k位的元素(只需要移動位置的元素)

del nums[

:l-k]

LeetCode演算法個人解答 7 反轉整數

給定乙個 32 位有符號整數,將整數中的數字進行反轉。示例 1 輸入 123輸出 321示例 2 輸入 123 輸出 321示例 3 輸入 120輸出 21注意 假設我們的環境只能儲存 32 位有符號整數,其數值範圍是 231 231 1 根據這個假設,如果反轉後的整數溢位,則返回 0。1.先判斷整...

LeetCode演算法題解答

leetcode演算法題解答 第四題 尋找兩個有序陣列的中位數 給定兩個大小為 m 和 n 的有序陣列 nums1 和 nums2。請你找出這兩個有序陣列的中位數,並且要求演算法的時間複雜度為 o log m n 你可以假設 nums1 和 nums2 不會同時為空。def findmedianso...

LeetCode題目1 C解答

題目 給定乙個整數陣列 nums 和乙個目標值 target,請你在該陣列中找出和為目標值的那 兩個 整數,並返回他們的陣列下標。你可以假設每種輸入只會對應乙個答案。但是,你不能重複利用這個陣列中同樣的元素。示例 給定 nums 2,7,11,15 target 9 因為 nums 0 nums 1...