給定乙個陣列,將陣列中的元素向右移動 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...