Leetcode 189: 輪轉數組

Leetcode 189: 輪轉數組

這是一道經典問題,題目要求將一個數組向右輪轉 k 個位置,有多種解法可以快速求解,既可以通過額外空間,也可以在 O(1) 的空間復雜度內完成。本題考察數組操作、雙指針,以及算法優化能力。


題目描述

輸入:

  • 一個整數數組 nums
  • 一個整數 k(表示右移的次數)。

輸出:

  • 將數組元素旋轉 k 次后直接修改原數組,不返回值。

示例輸入輸出:

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

解法 1:額外數組輔助

思路
  1. 使用一個額外的數組 temp 來保存最終的旋轉結果。
  2. 拷貝操作
    • 遍歷原數組,將 nums[i] 放置到新位置 (i + k) % n 中。
  3. 覆蓋結果
    • temp 中的內容轉存回原數組。

代碼模板
class Solution {public void rotate(int[] nums, int k) {int n = nums.length;k %= n; // 如果 k 大于數組長度,需要取模int[] temp = new int[n];for (int i = 0; i < n; i++) {temp[(i + k) % n] = nums[i]; // 按照旋轉后的位置存儲}// 將 temp 的內容拷貝到原數組for (int i = 0; i < n; i++) {nums[i] = temp[i];}}
}

復雜度分析
  • 時間復雜度:O(n)
    • 遍歷數組兩次,一次構造 temp 數組,一次拷貝回原數組。
  • 空間復雜度:O(n)
    • 需要一個額外大小為 n 的數組存放臨時結果。

解法 2:環狀替換

思路
  1. 核心觀察
    • 通過旋轉,數組中的每個元素其實沿著環狀路徑被移動,例如第 i 個元素移動到位置 (i + k) % n
    • 從某個點出發,將該點開始的所有元素按照這種環狀方式重新排列。
    • 當訪問過的元素數量達到數組大小 n 時,正好完成所有元素的輪轉。
  2. 實現步驟
    • 統計當前訪問過的元素數量 count,從未訪問過的某個起始點出發進行 “環繞替換”。
    • 對于每個元素,將其移至新位置 (i + k) % n,直到形成一個環,然后跳到下一個未訪問的點。

代碼模板
class Solution {public void rotate(int[] nums, int k) {int n = nums.length;k %= n; // 如果 k 大于數組長度,取模去掉多余輪轉int count = 0; // 記錄訪問的元素數量for (int start = 0; count < n; start++) { // 從未訪問的點開始int current = start; // 當前節點int prev = nums[start]; // 保存當前值do {int next = (current + k) % n; // 下一個位置int temp = nums[next]; // 保存下個位置的值nums[next] = prev; // 替換值prev = temp; // 更新 "前一個值"current = next; // 跳到下一個位置count++; // 更新訪問數量} while (current != start); // 環繞回起點時退出}}
}

復雜度分析
  • 時間復雜度:O(n)
    • 每個元素最多被訪問一次。
  • 空間復雜度:O(1)
    • 沒有使用額外數據結構,原地旋轉。

解法 3:數組翻轉技巧

思路
  1. 數組輪轉可以通過 三步翻轉 實現:
    • 第 1 步:翻轉整個數組;
    • 第 2 步:翻轉前 k 個元素;
    • 第 3 步:翻轉后 n-k 個元素。
  2. 實現原理:
    • 經過數組翻轉操作后,元素將被正確排列。
    • 例如:對于輸入 nums = [1,2,3,4,5,6,7], k=3
      原始: [1, 2, 3, 4, 5, 6, 7]
      步驟 1 翻轉整個數組: [7, 6, 5, 4, 3, 2, 1]
      步驟 2 翻轉前 k 個元素:[5, 6, 7, 4, 3, 2, 1]
      步驟 3 翻轉后 n-k 個元素:[5, 6, 7, 1, 2, 3, 4]
      

代碼模板
class Solution {public void rotate(int[] nums, int k) {int n = nums.length;k %= n; // 如果 k 大于數組長度,取模處理// 翻轉函數reverse(nums, 0, n - 1); // 翻轉整個數組reverse(nums, 0, k - 1); // 翻轉前 k 個元素reverse(nums, k, n - 1); // 翻轉后 n-k 個元素}private void reverse(int[] nums, int start, int end) {while (start < end) {int temp = nums[start];nums[start] = nums[end];nums[end] = temp;start++;end--;}}
}

復雜度分析
  • 時間復雜度:O(n)
    • 翻轉整個數組花費 O(n),翻轉前后兩部分各花費 O(k) 和 O(n-k),總時間為 O(n)。
  • 空間復雜度:O(1)
    • 翻轉操作原地完成,沒有額外數據結構。

解法 4:雙指針 + 循環節

思路
  • 使用雙指針從兩端到中間進行元素篩選調整。
  • 或者結合環狀數組的位置動態安排記錄。


總結:如何快速 AC?

  1. 優先選擇三步翻轉解法:O(n) 時間復雜度,O(1) 空間復雜度,實現簡單,效率最高,是面試中優先推薦的解法。
  2. 針對特殊場景
    • 如果原數組不可修改,可以選擇額外數組解法。
    • 如果需要一定技巧性(如比特運算分析競賽題),環狀替換法更具邏輯挑戰。
  3. 邊界情況注意
    • k 大于數組長度時,需要取模:k %= n
    • 空數組或 k=0 時,直接返回。

通過掌握以上 3 種高效解法(特別是三步翻轉技巧),不僅可以輕松解決問題,還能給面試官留下深刻印象。

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

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

相關文章

優選算法的智慧之光:滑動窗口專題(二)

專欄&#xff1a;算法的魔法世界?????? 個人主頁&#xff1a;手握風云 目錄 一、例題講解 1.1. 最大連續1的個數 III 1.2. 找到字符串中所有字母異位詞 1.3. 串聯所有單詞的子串 1.4. 最小覆蓋子串 一、例題講解 1.1. 最大連續1的個數 III 題目要求是二進制數組&am…

Linux系統安裝Azure CLI完全指南

引言 Azure CLI是管理Azure云服務的重要命令行工具。本文將詳細介紹在Linux系統上安裝Azure CLI的兩種方法,并提供版本管理、故障排除等完整解決方案。 © ivwdcwso (ID: u012172506) 一、安裝前準備 1.1 系統要求 支持的Linux發行版: Ubuntu 20.04/22.04 LTSDebian 10/…

2025嵌入式軟件開發工程師--音頻方向

一、選擇題&#xff08;每題3分&#xff0c;共30分&#xff09; 1.以下哪個不是C語言中的關鍵字?&#xff08; &#xff09; A. int B. Float C. Define D. Return 2.以下代碼的輸出是: &#xff08; &#xff09; inta 5, b 10; printf("%d“, a b); A. 15 B.16 …

TCP/IP四層模型:從入門到精通

第一部分&#xff1a;基礎概念 1.1 什么是TCP/IP&#xff1f; - TCP/IP 是互聯網的基礎通信協議簇&#xff0c;定義了數據如何在網絡中傳輸和路由。 - 與OSI七層模型的對比&#xff1a;TCP/IP更簡化&#xff0c;分為四層&#xff0c;注重實際應用。 1.2 四層模型結構 1. 應…

【Python 數據結構 1.零基礎復習】

目錄 一、輸入與輸出 1.輸入 2.格式化輸出 二、數字與變量 1.字符串 & 整型 2.字符串 & 整型 & 浮點型 3.變量 練習 2235. 兩整數相加 三、運算與操作 1.四則運算 練習 2769. 找出最大的可達成數字 3.取整與取余 練習 2651. 計算列車到站時間 ?編輯 四、真與假 1…

什么是 MGX:MetaGPT

什么是 MGX:MetaGPT MetaGPT是由思碼逸(OpenDILab)團隊開發的一款專注于生成式AI驅動的軟件開發框架,MGX可能是其衍生或升級的相關成果,它創新性地將大語言模型引入軟件開發流程,模擬人類軟件團隊的協作方式,能讓用戶通過自然語言描述需求,即可自動生成完整的軟件項目,…

大模型時代下的數據標注革命:工具、挑戰與未來趨勢

引言 隨著大模型技術的飛速發展&#xff0c;人工智能對高質量標注數據的依賴愈發顯著。傳統的人工標注方式在效率、成本和場景適應性上逐漸顯現瓶頸&#xff0c;而大模型憑借其強大的泛化能力和多模態理解能力&#xff0c;正在推動數據標注從“勞動密集型”向“智能工業化”轉…

【azure openai】用tts實現語音對話【demo】

能實現&#xff1a; 只要替換里面的key&#xff0c;就能跑通。 key的查找方法&#xff1a; 【保姆級教程】如何在azure里快速找到openai的key和demo-CSDN博客 代碼結構&#xff1a; azure_openai_client.py main.py prompts_config.py speech_utils.py stt01.py tts01.…

Spark(5)host配置

&#xff08;一.)host配置的作用&#xff1a; hosts 文件是一個本地的文本文件&#xff0c;它的作用是將主機名映射到對應的 IP 地址&#xff0c;在 DNS&#xff08;域名系統&#xff09;解析之前&#xff0c;系統會先查詢 hosts 文件來確定目標主機的 IP 地址。 &#xff08;二…

Hive-04之存儲格式、SerDe、企業級調優

一、主題 hive表的數據壓縮和文件存儲格式hive的自定義UDF函數hive的JDBC代碼操作hive的SerDe介紹和使用hive的優化 二、要點 1. hive表的文件存儲格式 Hive支持的存儲數的格式主要有&#xff1a;TEXTFILE&#xff08;行式存儲&#xff09; 、SEQUENCEFILE(行式存儲)、ORC&…

Excel的行高、列寬單位不統一?還是LaTeX靠譜

想要生成田字格、米字格、帶拼音標準&#xff0c;方便小學生書法和練字。Word&#xff0c;Excel之類所見即所得是最容易相當的方式。但它們處理帶田字格之類背景時&#xff0c;如果沒有專用模板、奇奇怪怪的插件&#xff0c;使用起來會碰到各種問題。比如&#xff0c;Word里面用…

[免費]微信小程序(校園)二手交易系統(uni-app+SpringBoot后端+Vue管理端)【論文+源碼+SQL腳本】

大家好&#xff0c;我是java1234_小鋒老師&#xff0c;看到一個不錯的微信小程序(校園)二手交易系統(uni-appSpringBoot后端Vue管理端)&#xff0c;分享下哈。 項目視頻演示 【免費】微信小程序(校園)二手交易系統(uni-appSpringBoot后端Vue管理端) Java畢業設計_嗶哩嗶哩_bi…

【詳細講解在STM32的UART通信中使用DMA機制】

詳細講解在STM32的UART通信中使用DMA機制 目錄 詳細講解在STM32的UART通信中使用DMA機制一、DMA機制概述二、DMA在UART中的作用三、DMA的配置步驟四、UART初始化與DMA結合五、DMA傳輸的中斷處理六、DMA與中斷的結合使用七、注意事項與常見問題八、代碼示例九、總結 一、DMA機制…

M系列芯片 MacOS 在 Conda 環境中安裝 TensorFlow 2 和 Keras 3 完整指南

目錄 1. 引言2. 環境準備3. 安裝 TensorFlow 和必要依賴4. 結語Reference 1. 引言 Keras 是搞深度學習很可愛的工具&#xff0c;其友好的接口讓我總是將其作為搭建模型原型的首選。然而&#xff0c;當我希望在 M 系列芯片的MacBook Pro上使用 Keras時&#xff0c;使用Conda和P…

清華北大DeepSeek六冊

「清華北大-Deepseek使用手冊」 鏈接&#xff1a;https://pan.quark.cn/s/98782f7d61dc 「清華大學Deepseek整理&#xff09; 1&#xff0d;6版本鏈接&#xff1a;https://pan.quark.cn/s/72194e32428a AI學術工具公測鏈接:https://pan.baidu.com/s/104w_uBB2F42Da0qnk78_ew …

paddlehub hub TypeError 錯誤

pip install paddlehub hub install chinese_ocr_db_crnn_mobile 提示錯誤&#xff1a; TypeError: Descriptors cannot be created directly. If this call came from a _pb2.py file, your generated code is out of date and must be regenerated with protoc > 3.19.0…

零信任沙箱:為網絡安全筑牢“隔離墻”

在數字化浪潮洶涌澎湃的今天&#xff0c;網絡安全如同一艘船在波濤洶涌的大海中航行&#xff0c;面臨著重重挑戰。數據泄露、惡意軟件攻擊、網絡釣魚等安全威脅層出不窮&#xff0c;讓企業和個人用戶防不勝防。而零信任沙箱&#xff0c;就像是一座堅固的“隔離墻”&#xff0c;…

【String】917. 僅僅反轉字母

917. 僅僅反轉字母 - 力扣&#xff08;LeetCode&#xff09; 使用雙指針&#xff0c;一個指針指向s的開始&#xff0c;一個指向s的末尾&#xff0c;同時遍歷即可。

大語言模型學習

大語言模型發展歷程 當前國內外主流LLM模型 ?一、國外主流LLM? ?LLaMA2? Meta推出的開源模型&#xff0c;參數規模涵蓋70億至700億&#xff0c;支持代碼生成和多領域任務適配?57。衍生版本包括Code Llama&#xff08;代碼生成優化&#xff09;和Llama Chat&#xff08;對…

3dsmax烘焙光照貼圖然后在unity中使用

效果預覽 看不清[完蛋&#xff01;] 實現步驟 使用 軟件 軟體名稱地址photoshophttps://www.adobe.com/products/photoshop.htmlunity3Dhttps://unity.com/3dsmaxhttps://www.autodesk.com.cn/products/3ds-max/free-trialpacker-iohttps://www.uv-packer.com/HDR 貼圖地址…