經典陣列應用題 右旋陣列元素 Rotate Array_Leetcode #189

閱讀時間約 5 分鐘
raw-image

這題的題目在這裡:

題目敘述

題目會給定我們一個陣列和參數k,要求我們將陣列右旋k次,然後輸出內容。

例如[1,2,3,4,5] 右旋 2次,輸出就是[4,5,1,2,3]


測試範例

Example 1:

Input: nums = [1,2,3,4,5,6,7], k = 3
Output: [5,6,7,1,2,3,4]
Explanation:
rotate 1 steps to the right: [7,1,2,3,4,5,6]
rotate 2 steps to the right: [6,7,1,2,3,4,5]
rotate 3 steps to the right: [5,6,7,1,2,3,4]

Example 2:

Input: nums = [-1,-100,3,99], k = 2
Output: [3,99,-1,-100]
Explanation:
rotate 1 steps to the right: [99,-1,-100,3]
rotate 2 steps to the right: [3,99,-1,-100]

約束條件

Constraints:

  • 1 <= nums.length <= 105
  • -231 <= nums[i] <= 231 - 1
  • 0 <= k <= 105

 Follow up:

  • Try to come up with as many solutions as you can. There are at least three different ways to solve this problem.
  • Could you do it in-place with O(1) extra space?

演算法

除了第一直覺的創造新array再搬移的方法之外;其實,還有另一個透過三次翻轉來in-place實現(不需要額外創造新array)的方法。

raw-image

原本的輸入,在右旋k次之後,會有下方的結果

  1. 原本頭部元素,包含頭部和之後的n-k個元素,移動到後端。
  2. 原本尾部元素,包含尾部和之前的k個元素,移動到前端。


因此,我們可以透過三次反轉(Reverse)來得到等價於右旋k次的效果。

  1. 第一次反轉,反轉整個array,目的是使頭尾顛倒。但是這一步有一個副作用,雖然頭尾顛倒了,但是次序也反轉了,因此我們需要第二次反轉和第三次反轉修正這個副作用
  2. 反轉前k項,這樣剛好原本尾巴的k個元素會剛好落在前端的位置。
  3. 反轉後n-k項,這樣剛好原本頭部的n-k的k個元素會剛好落在後端的位置。

程式碼

class Solution:
 def reverse(self, nums: List[int], start, end):
  
# reverse array elements within [start, end] interval
  while start < end:
   
   nums[start], nums[end] = nums[end], nums[start]
   
   start += 1
   end -= 1
   
   
 
 def rotate(self, nums: List[int], k: int) -> None:
  """
  Do not return anything, modify nums in-place instead.
  """
  size = len(nums)
  
  
  if k > size:
   # eliminate redundant rotation which is over size
   k = k % size
  
  
   # reverse all elements
  self.reverse( nums, 0, size-1)
  
   # reverse first k elements
  self.reverse( nums, 0, k-1)
  
   # reverse last (size - k) elements
  self.reverse( nums, k, size-1)
  
  return

複雜度分析

時間複雜度:

O( n ) 每次反轉,最多耗費的成本是O(n) ,總共三次反轉=O(3n) = O(n)。

空間複雜度:

O( 1 ) 都是固定尺寸的臨時變數,function call stack也固定只有一層。


關鍵知識點

矩陣右移這個操作有點像在程式語言中的 >> bitwise右移運算,或者組合語言中的Right shift,觀念上相通的。

實作部分,透過畫圖,可以聯想到用reverse反轉來時做in-place實現,不需要去額外創造新的array去複製搬移。


Reference:

[1] Python/JS/Go/C++ O(n) by reverse [ With comment ] - Rotate Array - LeetCode

88會員
425內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言0
查看全部
發表第一個留言支持創作者!
題目會給定我們一個陣列,要求我們找出裡面統計最多出現次數的偶數 。 假如有兩個偶數出現的次數一樣多,取最數字比較小的那個最為答案。
題目會給定我們一個陣列,陣列長度為n。 要求我們找出裡面出現次數超過 n / 3次的數字。
題目會給定我們一個輸入陣列,裡面的字母A和字母B分別代表兩種顏色的卡片。 假如某張卡片的左右都是相同的,例如AAA,Alice可以抽掉中間那張A。 同樣的,假如某張卡片的左右都是相同的,例如BBB,Bob可以抽掉中間那張B。 請問Alice和Bob輪流玩抽卡遊戲, 請問最後是誰贏?
題目給定一個已排序的輸入陣列,陣列裡面的數字自分別代表每篇論文的被引用數。 要求我們計算h-index。 h-index的定義: 找一個最大的h值,使得有h篇論文,個別論文的被引用數都 大於等於 h
題目給定一個輸入陣列,陣列裡面的數字自分別代表每篇論文的被引用數。 要求我們計算h-index。 h-index的定義: 找一個最大的h值,使得有h篇論文,個別論文的被引用數都 大於等於 h
題目會給定兩個參數,一個是底數x,一個是次方n。要求我們計算出x^n。 要求實作myPow(self, x: float, n: int) -> float 函數的內部邏輯。 也就是說,不可以呼叫程式語言內建計算指數的library
題目會給定我們一個陣列,要求我們找出裡面統計最多出現次數的偶數 。 假如有兩個偶數出現的次數一樣多,取最數字比較小的那個最為答案。
題目會給定我們一個陣列,陣列長度為n。 要求我們找出裡面出現次數超過 n / 3次的數字。
題目會給定我們一個輸入陣列,裡面的字母A和字母B分別代表兩種顏色的卡片。 假如某張卡片的左右都是相同的,例如AAA,Alice可以抽掉中間那張A。 同樣的,假如某張卡片的左右都是相同的,例如BBB,Bob可以抽掉中間那張B。 請問Alice和Bob輪流玩抽卡遊戲, 請問最後是誰贏?
題目給定一個已排序的輸入陣列,陣列裡面的數字自分別代表每篇論文的被引用數。 要求我們計算h-index。 h-index的定義: 找一個最大的h值,使得有h篇論文,個別論文的被引用數都 大於等於 h
題目給定一個輸入陣列,陣列裡面的數字自分別代表每篇論文的被引用數。 要求我們計算h-index。 h-index的定義: 找一個最大的h值,使得有h篇論文,個別論文的被引用數都 大於等於 h
題目會給定兩個參數,一個是底數x,一個是次方n。要求我們計算出x^n。 要求實作myPow(self, x: float, n: int) -> float 函數的內部邏輯。 也就是說,不可以呼叫程式語言內建計算指數的library
你可能也想看
Google News 追蹤
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
11/20日NVDA即將公布最新一期的財報, 今天Sell Side的分析師, 開始調高目標價, 市場的股價也開始反應, 未來一週NVDA將重新回到美股市場的焦點, 今天我們要分析NVDA Sell Side怎麼看待這次NVDA的財報預測, 以及實際上Buy Side的倉位及操作, 從
Thumbnail
Hi 大家好,我是Ethan😊 相近大家都知道保濕是皮膚保養中最基本,也是最重要的一步。無論是在畫室裡長時間對著畫布,還是在旅途中面對各種氣候變化,保持皮膚的水分平衡對我來說至關重要。保濕化妝水不僅能迅速為皮膚補水,還能提升後續保養品的吸收效率。 曾經,我的保養程序簡單到只包括清潔和隨意上乳液
Thumbnail
重點摘要: 1.一如我們預期,Fed 3 月點陣圖維持先前 12 月的降息路徑 2.SEP 似乎暗示 Fed 對 2025 年金髮經濟有信心 3.關於縮表 QT,Fed 長期希望重返持有美債的狀態
Thumbnail
美國勞工部週五 (3/8) 公布 2 月非農報告,新增非農就業達 27.5 萬人,超越市場預期的 19.8 萬人,但新增就業強勁的同時,失業率也上升至 3.9%,超越市場預期和 1 月的 3.7%,顯示美國勞動力市場需求穩健之外,美國勞動力市場供給也正在穩步回升,整體勞動力市場更確定趨向「再平衡」。
Thumbnail
美味獵人YUMMY HUNTER的愛的光菠手工餅乾,有著超Q的心型菱格紋外型外,還可以在餅乾包裝封面上寫下專屬的獨特密碼,讓收到餅乾的人不僅收到酥脆好吃的餅乾,同時珍藏彼此之間獨特的友誼。
Thumbnail
Hi there,經典搖滾樂團 blink-182 在歷經了諸多變故,像是鼓手 Travis Barker 飛機失事、吉他手 Tom DeLonge 出走、貝斯手 Mark Hoppus 患上癌症等等,在經過了分分合合之後,今年是經典三人組合睽違了七年再聚首!並且大動作發行了樂團的第九張錄音
Thumbnail
題目會給定我們一個陣列和參數k,要求我們將陣列右旋k次,然後輸出內容。 例如[1,2,3,4,5] 右旋 2次,輸出就是[4,5,1,2,3]
Thumbnail
改編自《阿奇漫畫》的電視劇《河谷鎮》,主要角色有亞契·安德魯斯、鄰家女孩貝蒂·庫珀以及富有的社交名媛薇蘿妮卡·洛奇,重要配角包含亞契的勁敵雷吉·曼托、摯友賈格赫德·瓊斯以及受歡迎的同性戀角色凱文·凱勒。故事時間線在現代與過去穿梭來回,一群高中生在這看似平靜無害的小鎮,因為一起謀殺案發現了接二連三的黑
Thumbnail
1983 年,作家李昂出版了《殺夫》一書,觸動著臺灣社會的女性議題。在小說中,作者融入了家鄉鹿港的經驗,也正是因為鹿港著名的三不見:不見天、不見地和不見女人……
Thumbnail
改編1997年加拿大電影「異次元殺陣」的本片,感覺比較像是換了一批日本人來重拍一次。 故事描述六個互不認識的陌生人在完全沒有頭緒跟線索下,需要選擇密室中任一面的通道,經過可能會有死亡機關陷阱的方塊密室,試圖找到出口逃生。 本片探討的內容有經過在地化修正,主要探討日本社會常見的各種霸凌現象。 雖然是密
Thumbnail
2022/01/13台中→黑橋牌香腸博物館→海中央小舖~鹽工便當 綁蚵串DIY體驗→北門自行車道單車恣遊(北門遊客中心、北門潟湖、水晶教堂)→井仔腳瓦盤鹽田 →返 程
Thumbnail
 菅田將暉主演的新作品《超慄方殺陣》,改編自1997年加拿大經典作品《異次元殺陣》,內容與主軸沒有太大變動,拿掉了當年頗有討論度的人種問題,轉而討論起日本社會的階級制度,也算是另一種獨特的本土化展現。 但實際的成品,卻遠沒當年《異次元殺陣》出色!實際的原因,或許仍在角色的定位上。
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
11/20日NVDA即將公布最新一期的財報, 今天Sell Side的分析師, 開始調高目標價, 市場的股價也開始反應, 未來一週NVDA將重新回到美股市場的焦點, 今天我們要分析NVDA Sell Side怎麼看待這次NVDA的財報預測, 以及實際上Buy Side的倉位及操作, 從
Thumbnail
Hi 大家好,我是Ethan😊 相近大家都知道保濕是皮膚保養中最基本,也是最重要的一步。無論是在畫室裡長時間對著畫布,還是在旅途中面對各種氣候變化,保持皮膚的水分平衡對我來說至關重要。保濕化妝水不僅能迅速為皮膚補水,還能提升後續保養品的吸收效率。 曾經,我的保養程序簡單到只包括清潔和隨意上乳液
Thumbnail
重點摘要: 1.一如我們預期,Fed 3 月點陣圖維持先前 12 月的降息路徑 2.SEP 似乎暗示 Fed 對 2025 年金髮經濟有信心 3.關於縮表 QT,Fed 長期希望重返持有美債的狀態
Thumbnail
美國勞工部週五 (3/8) 公布 2 月非農報告,新增非農就業達 27.5 萬人,超越市場預期的 19.8 萬人,但新增就業強勁的同時,失業率也上升至 3.9%,超越市場預期和 1 月的 3.7%,顯示美國勞動力市場需求穩健之外,美國勞動力市場供給也正在穩步回升,整體勞動力市場更確定趨向「再平衡」。
Thumbnail
美味獵人YUMMY HUNTER的愛的光菠手工餅乾,有著超Q的心型菱格紋外型外,還可以在餅乾包裝封面上寫下專屬的獨特密碼,讓收到餅乾的人不僅收到酥脆好吃的餅乾,同時珍藏彼此之間獨特的友誼。
Thumbnail
Hi there,經典搖滾樂團 blink-182 在歷經了諸多變故,像是鼓手 Travis Barker 飛機失事、吉他手 Tom DeLonge 出走、貝斯手 Mark Hoppus 患上癌症等等,在經過了分分合合之後,今年是經典三人組合睽違了七年再聚首!並且大動作發行了樂團的第九張錄音
Thumbnail
題目會給定我們一個陣列和參數k,要求我們將陣列右旋k次,然後輸出內容。 例如[1,2,3,4,5] 右旋 2次,輸出就是[4,5,1,2,3]
Thumbnail
改編自《阿奇漫畫》的電視劇《河谷鎮》,主要角色有亞契·安德魯斯、鄰家女孩貝蒂·庫珀以及富有的社交名媛薇蘿妮卡·洛奇,重要配角包含亞契的勁敵雷吉·曼托、摯友賈格赫德·瓊斯以及受歡迎的同性戀角色凱文·凱勒。故事時間線在現代與過去穿梭來回,一群高中生在這看似平靜無害的小鎮,因為一起謀殺案發現了接二連三的黑
Thumbnail
1983 年,作家李昂出版了《殺夫》一書,觸動著臺灣社會的女性議題。在小說中,作者融入了家鄉鹿港的經驗,也正是因為鹿港著名的三不見:不見天、不見地和不見女人……
Thumbnail
改編1997年加拿大電影「異次元殺陣」的本片,感覺比較像是換了一批日本人來重拍一次。 故事描述六個互不認識的陌生人在完全沒有頭緒跟線索下,需要選擇密室中任一面的通道,經過可能會有死亡機關陷阱的方塊密室,試圖找到出口逃生。 本片探討的內容有經過在地化修正,主要探討日本社會常見的各種霸凌現象。 雖然是密
Thumbnail
2022/01/13台中→黑橋牌香腸博物館→海中央小舖~鹽工便當 綁蚵串DIY體驗→北門自行車道單車恣遊(北門遊客中心、北門潟湖、水晶教堂)→井仔腳瓦盤鹽田 →返 程
Thumbnail
 菅田將暉主演的新作品《超慄方殺陣》,改編自1997年加拿大經典作品《異次元殺陣》,內容與主軸沒有太大變動,拿掉了當年頗有討論度的人種問題,轉而討論起日本社會的階級制度,也算是另一種獨特的本土化展現。 但實際的成品,卻遠沒當年《異次元殺陣》出色!實際的原因,或許仍在角色的定位上。