leetcode旋转数组 c语言,leetcode explore 初级算法第三题,旋转数组代码实现
leetcode explore 初級算法第三題,旋轉數組代碼實現。原題鏈接:
題目分析
因為題目不是很長,這里把題目貼出來:
給定一個數組,將數組中的元素向右移動 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) 的 原地 算法。
題目意思很簡單,就是將數組往后移動 k 個位置,超出數組長度的從頭開始計算。如果只是這個要求,題目特別簡單,新開一個數組,然后將原數組移動 k 保留到對應位置即可。而題目的難點在于需要“原地”移動,空間復雜度為 O(1),即不能新創建數組。
參考答案
首先分析題意,很容易想出移動位置公式:
target_pos = (pos + k) % nums_len
剩下的就是解決“原地”的問題,很容易想到一種思路,就是移動后,從移動后的位置再接著去移動,同時保留原來位置的數據。這樣只需要一個臨時變量去保存被替換的變量即可。但中間有一些坑,比如:有些數據移動 k 個會形成一個循環,比如 [-1,-100,3,99] 和 k = 2,-1 到 3, 3 又回到 -1,-1 又到 3。如何解決這些循環問題是關鍵。
我的參考代碼如下:
'''
@Author: demon
@Date: 2019-10-28 11:16:44
@LastEditors: demon
@LastEditTime: 2019-10-28 18:37:12
@Description: https://leetcode-cn.com/explore/featured/card/top-interview-questions-easy/1/array/23/ 旋轉數組
'''
class Solution(object):
def rotate(self, nums, k):
"""
:type nums: List[int]
:type k: int
:rtype: None Do not return anything, modify nums in-place instead.
"""
if not nums:
return
start_pos = 0
move_count = 0
nlen = len(nums)
for i in range(0, nlen):
if move_count == nlen:
break
pos = i
move_num = nums[pos]
while True:
target_pos = (pos + k) % nlen
tmp = nums[target_pos]
nums[target_pos] = move_num
move_count += 1
if target_pos == i or move_count == nlen:
break
pos = target_pos
move_num = tmp
if __name__ == "__main__":
s = Solution()
nums = [1, 2, 3, 4, 5, 6, 7]
s.rotate(nums, k=3)
print(nums) # [5, 6, 7, 1, 2, 3, 4]
nums = [-1, -100, 3, 99]
s.rotate(nums, k=2)
print(nums) # [3, 99, -1, -100]
nums = [-1, -100, 3, 99]
s.rotate(nums, k=4)
print(nums) # [-1, -100, 3, 99]
nums = [-1]
s.rotate(nums, k=4)
print(nums) # [-1]
nums = [-1]
s.rotate(nums, k=0)
print(nums) # [-1]
nums = [1, 2, 3, 4, 5, 6]
s.rotate(nums, k=3)
print(nums) # [4, 5, 6, 1, 2, 3]
nums = [1, 2, 3, 4, 5, 6]
s.rotate(nums, k=2)
print(nums) # [5, 6, 1, 2, 3, 4]
上面給出了一些測試用例,基本上能覆蓋一些比較坑的情況,如果你的代碼能過這些用例,基本也就能 AC 了
總結
以上是生活随笔為你收集整理的leetcode旋转数组 c语言,leetcode explore 初级算法第三题,旋转数组代码实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据结构(c语言版)笔记6,2020考研
- 下一篇: 摄像头线性矫正的c语言实现,摄影测量考试