一、題目
給定乙個陣列,將陣列中的元素向右移動 k 個位置,其中 k 是非負數。
例1:輸入: [1,2,3,4, 和 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]
說明:1.盡可能想出更多的解決方案,至少有三種不同的方法可以解決這個問題。
2.要求使用空間複雜度為 o(1) 的原地演算法。
二、解法
解法一以倒數第 k 個值為分界線,把 nums 截成兩組再組合lbfni。因為 k 可能大於 nums 的長度(當這兩者相等的時候,就相當於 nums 沒有移動),所以我們取k % len(nums),k 和 nums 的長度取餘,就是最終我們需要移動的位置
**如下:
if nums:
k = k % len(nums)
nums[:]=nums[-k:]+nums[:-k]
時間:64ms,擊敗了98%
附:本機測試示例**:
# -*- coding:utf-8 -*-
nums= [1,2,3,4,5,6,7]
k =3
if nums:
k = k % len(nums)
nums[:]=nums[-k:]+nums[:-k]
print(nums)
執行結果:
[5, 6, 7, 1, 2, 3, 4]
解法二先把 nums 最後一位移動到第一位,然後刪除最後一位,迴圈k次。k = k % len(nums),取餘
**如下:
if nums:
k = k % len(nums)
while k > 0:
k -= 1
nums.insert(0, nums
nums.pop()
時間:172ms,擊敗了16%
附:本機測試示例**:
# -*- coding:utf-8 -*-
nums= [1,2,3,4,5,6,7]
k =3
if nums:
k = k % len(nums)
while k > 0:
k -= 1
nums.insert(0, nums[-1])
nums.pop()
print(nums)
執行結果:
[5, 6, 7, 1, 2, 3, 4lbfni]
解法三先把 nums 複製到 old_nums ,然後 nums 中索引為 x 的元素移動 k 個位置後,當前索引為 x+k,其值為old_nums[x]。,所以我們把 x+k 處理成(x+k)%len(nums),取餘操作,減少重複的次數。
**如下:
if nums:
old_nums = nums[:]
l = len(nums)
for x in range(l):
nums[(x+k) % l] = old_nums[x]
時間:64ms,擊敗了98%
附:本機測試示例**:
# -*- coding:utf-8 -*-
nums= [1,2,3,4,5,6,7]
k =3
if nums:
old_nums = nums[:]
l = len(nums)
for x in range(l):
nums[(x+k) % l] = old_nums[x]
print(nums)
執行結果:
[5, 6, 7, 1, 2, 3, 4]
旋轉陣列(python)
給定乙個陣列,將陣列中的元素向右移動 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...
LeetCode 旋轉陣列(Python版本)
給定乙個陣列,將陣列中的元素向右移動 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,...
33 搜尋旋轉陣列 python
假設按照公升序排序的陣列在預先未知的某個點上進行了旋轉。例如,陣列 0,1,2,4,5,6,7 可能變為 4,5,6,7,0,1,2 搜尋乙個給定的目標值,如果陣列中存在這個目標值,則返回它的索引,否則返回 1 你可以假設陣列中不存在重複的元素。你的演算法時間複雜度必須是 o log n 級別。示例...