經典陣列應用題 右旋陣列元素 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

86會員
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
美國總統大選只剩下三天, 我們觀察一整週民調與金融市場的變化(包含賭局), 到本週五下午3:00前為止, 誰是美國總統幾乎大概可以猜到60-70%的機率, 本篇文章就是以大選結局為主軸來討論近期甚至到未來四年美股可能的改變
Thumbnail
Faker昨天真的太扯了,中國主播王多多點評的話更是精妙,分享給各位 王多多的點評 「Faker是我們的處境,他是LPL永遠繞不開的一個人和話題,所以我們特別渴望在決賽跟他相遇,去直面我們的處境。 我們曾經稱他為最高的山,最長的河,以為山海就是盡頭,可是Faker用他28歲的年齡...
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
美國總統大選只剩下三天, 我們觀察一整週民調與金融市場的變化(包含賭局), 到本週五下午3:00前為止, 誰是美國總統幾乎大概可以猜到60-70%的機率, 本篇文章就是以大選結局為主軸來討論近期甚至到未來四年美股可能的改變
Thumbnail
Faker昨天真的太扯了,中國主播王多多點評的話更是精妙,分享給各位 王多多的點評 「Faker是我們的處境,他是LPL永遠繞不開的一個人和話題,所以我們特別渴望在決賽跟他相遇,去直面我們的處境。 我們曾經稱他為最高的山,最長的河,以為山海就是盡頭,可是Faker用他28歲的年齡...
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年加拿大經典作品《異次元殺陣》,內容與主軸沒有太大變動,拿掉了當年頗有討論度的人種問題,轉而討論起日本社會的階級制度,也算是另一種獨特的本土化展現。 但實際的成品,卻遠沒當年《異次元殺陣》出色!實際的原因,或許仍在角色的定位上。