LeetCode 熱題 100 189. 輪轉數組

LeetCode 熱題 100 | 189. 輪轉數組

大家好,今天我們來解決一道經典的算法題——輪轉數組。這道題在LeetCode上被標記為中等難度,要求我們將數組中的元素向右輪轉 k 個位置。下面我將詳細講解解題思路,并附上Python代碼實現。


問題描述

給定一個整數數組 nums,將數組中的元素向右輪轉 k 個位置,其中 k 是非負數。要求原地操作,不能使用額外的數組空間。

示例1:

輸入: nums = [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:

輸入: nums = [-1,-100,3,99], k = 2
輸出: [3,99,-1,-100]
解釋: 
向右輪轉 1 步: [99,-1,-100,3]
向右輪轉 2 步: [3,99,-1,-100]

解題思路

核心思想
  1. 三次反轉法

    • 首先反轉整個數組。
    • 然后反轉前 k 個元素。
    • 最后反轉剩下的 n - k 個元素。
  2. 原地操作

    • 通過反轉操作,避免使用額外的空間。

Python代碼實現

def rotate(nums, k):n = len(nums)k = k % n  # 處理k大于數組長度的情況def reverse(start, end):while start < end:nums[start], nums[end] = nums[end], nums[start]start += 1end -= 1reverse(0, n - 1)  # 反轉整個數組reverse(0, k - 1)   # 反轉前k個元素reverse(k, n - 1)   # 反轉剩下的元素# 測試示例
nums1 = [1, 2, 3, 4, 5, 6, 7]
nums2 = [-1, -100, 3, 99]rotate(nums1, 3)
rotate(nums2, 2)print(nums1)  # 輸出: [5, 6, 7, 1, 2, 3, 4]
print(nums2)  # 輸出: [3, 99, -1, -100]

代碼解析

  1. 處理 k 大于數組長度的情況

    • 使用 k = k % n 確保 k 在數組長度范圍內。
  2. 定義反轉函數

    • reverse 函數用于反轉數組中從 startend 的部分。
  3. 三次反轉操作

    • 第一次反轉整個數組,將后 k 個元素移到前面,但順序相反。
    • 第二次反轉前 k 個元素,恢復其原始順序。
    • 第三次反轉剩下的 n - k 個元素,恢復其原始順序。
  4. 原地操作

    • 直接在原數組上進行操作,不需要額外的空間。

復雜度分析

  • 時間復雜度:O(n),其中 n 是數組的長度。我們只需要遍歷數組三次。
  • 空間復雜度:O(1),只使用了常數個額外空間。

示例運行

示例1
輸入: nums = [1, 2, 3, 4, 5, 6, 7], k = 3
輸出: [5, 6, 7, 1, 2, 3, 4]
示例2
輸入: nums = [-1, -100, 3, 99], k = 2
輸出: [3, 99, -1, -100]

進階:其他解法

除了三次反轉法,我們還可以使用其他方法解決這個問題:

方法一:使用額外數組
def rotate_extra(nums, k):n = len(nums)k = k % nrotated = nums[-k:] + nums[:-k]nums[:] = rotated
  • 時間復雜度:O(n)
  • 空間復雜度:O(n)
方法二:環狀替換
def rotate_cyclic(nums, k):n = len(nums)k = k % ncount = 0start = 0while count < n:current = startprev = nums[start]while True:next_idx = (current + k) % nnums[next_idx], prev = prev, nums[next_idx]current = next_idxcount += 1if current == start:breakstart += 1
  • 時間復雜度:O(n)
  • 空間復雜度:O(1)

總結

通過使用三次反轉法,我們可以高效地將數組中的元素向右輪轉 k 個位置,同時保持原地操作。這種方法既簡單又高效,適合大多數場景。希望這篇題解對大家有所幫助,如果有任何問題,歡迎在評論區留言討論!

關注我,獲取更多算法題解和編程技巧!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/904125.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/904125.shtml
英文地址,請注明出處:http://en.pswp.cn/news/904125.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

GAEA商業前景和生態系統擴展

GAEA情感坐標系不僅增強了AI對人類情感的理解&#xff0c;也為Web3生態注入了新的活力。通過去中心化的數據存儲和共享&#xff0c;GAEA構建了一個開放透明的數據市場&#xff0c;為AI訓練提供了優質的數據源。同時&#xff0c;貢獻數據的用戶將獲得靈魂積分&#xff08;SOUL P…

[原創](現代Delphi 12指南):[macOS 64bit App開發]: [2]如何使用跨平臺消息框?

[作者] 常用網名: 豬頭三 出生日期: 1981.XX.XX 企鵝交流: 643439947 個人網站: 80x86匯編小站 編程生涯: 2001年~至今[共24年] 職業生涯: 22年 開發語言: C/C++、80x86ASM、Object Pascal、Objective-C、C#、R、Python、PHP、Perl、 開發工具: Visual Studio、Delphi、XCode、…

js逆向繞過指紋識別

??一、兼容性說明?? 官方支持 curl_cffi 明確支持 Windows 平臺&#xff0c;并提供了預編譯的安裝包。其核心功能&#xff08;如瀏覽器指紋模擬、HTTP/2 支持&#xff09;在 Windows 上與 Linux/macOS 表現一致。 版本要求 ? Python 3.8 及以上版本&#xff08;推薦 Pyth…

聊聊對Mysql的理解

目錄 1、Sql介紹 1.1、SQL的分類 1.2、數據庫的三大范式 1.3、數據表的約束 1.4、約束的添加與刪除 2、核心特性 3、主要組件 4、數據結構原理 5、索引失效 6、常用問題 7、優勢與局限 前言 MySQL是一個開源的關系型數據庫管理系統(RDBMS)&#xff0c;由瑞典MySQL A…

[HOT 100] 1617. 統計子樹中城市之間最大距離

文章目錄 1. 題目鏈接2. 題目描述3. 題目示例4. 解題思路5. 題解代碼6. 復雜度分析 1. 題目鏈接 1617. 統計子樹中城市之間最大距離 - 力扣&#xff08;LeetCode&#xff09; 2. 題目描述 給你 n 個城市&#xff0c;編號為從 1 到 n 。同時給你一個大小為 n-1 的數組 edges &…

接口自動化——參數化

之前有說過&#xff0c;通過pytest測試框架標記參數化功能可以實現數據驅動測試。數據驅動測試使用的文件主要有以下類型&#xff1a; txt 文件 csv 文件excel 文件json 文件yaml 文件.... 本文主要講的就是以上幾種文件類型的讀取和使用 一.txt 文件讀取使用 首先創建一個 …

游戲引擎學習第257天:處理一些 Win32 相關的問題

設定今天的工作計劃 今天我們本來是打算繼續開發性能分析器&#xff08;Profiler&#xff09;&#xff0c;但在此之前&#xff0c;我們認為有一些問題應該先清理一下。雖然這類事情不是我們最關心的核心內容&#xff0c;但我們覺得現在是時候處理一下了&#xff0c;特別是為了…

實驗三 觸發器及基本時序電路

1.觸發器的分類&#xff1f;各自的特點是什么&#xff1f; 1 、 D 觸發器 特點&#xff1a;只有一個數據輸入端 D &#xff0c;在時鐘脈沖的觸發沿&#xff0c;輸出 Q 的狀態跟隨輸入端 D 的 狀態變化&#xff0c;即 &#xff0c;功能直觀&#xff0c;利于理解和感受…

硬件加速模式Chrome(Edge)閃屏

Chrome開啟“硬件加速模式”后&#xff0c;打開瀏覽器會閃屏或看視頻會閃屏&#xff0c;如果電腦只有集顯&#xff0c;直接將這個硬件加速關了吧&#xff0c;沒啥必要開著 解決方法 讓瀏覽器使用獨立顯卡 在Windows左下角搜索 圖形設置 &#xff0c;將瀏覽器添加進去&#…

前端工程化利器:Node.js 文件匹配庫 fast-glob 完全指南——比傳統方案快 350% 的「文件搜索神器」

為什么需要 fast-glob&#xff1f; 在前端工程化場景中&#xff0c;文件匹配是高頻操作&#xff1a;自動化構建、資源打包、靜態資源管理等都依賴高效的路徑匹配。傳統的 node-glob 雖然功能齊全&#xff0c;但性能瓶頸明顯。fast-glob 應運而生——它以 極簡 API 和 超高性能…

React class 的組件庫與函數組件適配集成

如果你有一個 基于 React class 的組件庫&#xff0c;現在需要在 React hooks 函數組件中使用&#xff0c;你可以通過以下幾種方式實現適配和集成&#xff1a; 數據生命周期確保 class 組件使用 React.forwardRef 導出&#xff08;或手動綁定 ref&#xff09; ? 1. 直接使用 c…

Sway初體驗

Sway&#xff08;縮寫自 SirCmpwn’s Wayland compositor[1]&#xff09;是一款專為 Wayland 設計的合成器&#xff0c;旨在與 i3 完全兼容。根據官網所述&#xff1a; Sway 是 Wayland 的合成器&#xff0c;也是 x11 的 i3 窗口管理器的替代品。它可以根據您現有的 i3 配置工作…

dubbo 參數校驗-ValidationFilter

org.apache.dubbo.rpc.Filter 核心功能 攔截RPC調用流程 Filter是Dubbo框架中實現攔截邏輯的核心接口&#xff0c;作用于服務消費者和提供者的作業鏈路&#xff0c;支持在方法調用前后插入自定義邏輯。如參數校驗、異常處理、日志記錄等。擴展性機制 Dubbo通過SPI擴展機制動態…

Lesson 16 A polite request

Lesson 16 A polite request 詞匯 park n. 公園&#xff0c;停車場&#xff0c;莊園 v. 停車&#xff0c;泊車 例句&#xff1a;讓我來停車。    Let me park. 相關&#xff1a;spot n. 車位 區別&#xff1a;garden n. 花園 [小&#xff0c;私家的] 例句&#xff1a;我們…

解決 Builroot 系統編譯 perl 編譯報錯問題

本文提供一種修復 Builroot 系統編譯 perl 編譯報錯途徑 2025-05-04T22:45:08 rm -f pod/perl5261delta.pod 2025-05-04T22:45:08 /usr/bin/ln -s perldelta.pod pod/perl5261delta.pod 2025-05-04T22:45:08 /usr/bin/gcc -c -DPERL_CORE -fwrapv -fpcc-struct-return -pipe -f…

Spring MVC 中解決中文亂碼問題

在 Spring MVC 中解決中文亂碼問題&#xff0c;需要從 請求參數編碼 和 響應內容編碼 兩方面入手。以下是完整的解決方案&#xff1a; 一、解決請求參數中文亂碼 1. POST 請求編碼&#xff08;表單提交&#xff09; 配置 CharacterEncodingFilter 在 web.xml 中添加 Spring 提…

MYSQL數據庫突然消失

之前在下載mysql時發現沒有my.ini。考慮到后面的項目可能需要&#xff0c;看著教程自己創建了一次&#xff0c;當時就發生了所有數據庫消失的問題&#xff0c;近幾天這種事件又發生了。我在服務里看到我有mysql和mysql57兩個服務&#xff0c;啟動一個的時候另一個就無法啟動&am…

【Spring】idea + maven 從零創建Spring IoC容器示例

【Spring】idea maven 從零創建Spring IoC容器示例 1. 環境準備2. 創建maven項目3. 添加依賴4. 創建Java類與接口4.1 定義接口UserService4.2 實現接口UserServiceImpl 5. 配置Spring IoC容器6. 編寫主類調用IoC容器擴展&#xff1a;使用注解方式實現IoC1. 修改beans.xml2.使用…

面試回答之STAR結構

面試回答之STAR結構 1. STAR結構的起源 STAR是行為面試法&#xff08;Behavioral Interview&#xff09;的核心框架&#xff0c;由以下四個單詞首字母組成&#xff1a; ? Situation&#xff08;情境&#xff09; ? Task&#xff08;任務&#xff09; ? Action&#xff…

Kubernetes部署運行應用

①使用 Deployment 運行一個無狀態應用 ②運行一個單實例有狀態應用 ③運行一個有狀態的應用程序 ④使用 Persistent Volumes 部署 WordPress 和 MySQL