【LeetCode熱題100道筆記】輪轉數組

題目描述

給定一個整數數組 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 <= nums.length <= 105
-231 <= nums[i] <= 231 - 1
0 <= k <= 105

進階:
盡可能想出更多的解決方案,至少有 三種 不同的方法可以解決這個問題。
你可以使用空間復雜度為 O(1) 的 原地 算法解決這個問題嗎?

思考一:使用額外數組

直接計算每個元素旋轉后的新位置,借助額外數組存儲結果后再復制回原數組。

算法過程

  1. 計算有效旋轉步數 k = k % n(n為數組長度)
  2. 創建與原數組等長的新數組
  3. 遍歷原數組,將每個元素 nums[i] 放入新數組的 (i + k) % n 位置
  4. 將新數組元素復制回原數組

復雜度:時間O(n),空間O(n)(額外數組占用)

代碼

/*** @param {number[]} nums* @param {number} k* @return {void} Do not return anything, modify nums in-place instead.*/
var rotate = function(nums, k) {const n = nums.length;k = k % n;if (k === 0) return;const temp = [...nums]; // 創建原數組副本for (let i = 0; i < n; i++) {// 計算旋轉后位置:原索引i的元素移到(i + k) % nnums[(i + k) % n] = temp[i];}
};

思考二:環形替換

核心思路:從起始位置開始,將元素依次移動到旋轉后的目標位置,形成閉環后切換到下一個未處理的位置,直到所有元素都被移動。

算法過程

  1. 計算有效旋轉步數 k = k % n,若k為0則返回
  2. 初始化計數器 count = 0(記錄已處理元素數量)
  3. 從索引0開始循環:
    • 記錄當前位置 current 和該位置的元素 prev
    • 計算目標位置 next = (current + k) % n
    • 交換 prev 與目標位置元素,更新 currentnext
    • 重復上述步驟,直到回到起始位置(形成閉環)
    • 計數器加1,若未處理完所有元素則從下一個索引繼續

代碼

/*** @param {number[]} nums* @param {number} k* @return {void} Do not return anything, modify nums in-place instead.*/
var rotate = function(nums, k) {const n = nums.length;k = k % n;if (k === 0) return;let count = 0; // 已處理的元素數量for (let start = 0; count < n; start++) {let current = start;let prev = nums[start];do {const next = (current + k) % n;[prev, nums[next]] = [nums[next], prev]; // 交換元素current = next;count++;} while (current !== start); // 回到起點時結束當前環}
};

思考三:反轉數組

將數組向右旋轉k步,可通過三次反轉操作實現原地修改:先反轉整個數組,再分別反轉前k個元素和剩余元素,以此等價于直接旋轉的效果,避免使用額外空間。

算法過程

  1. 計算有效旋轉步數:k = k % 數組長度(處理k大于數組長度的情況),若k為0則無需旋轉
  2. 第一次反轉:將整個數組從索引0到末尾反轉
  3. 第二次反轉:將數組前k個元素(索引0到k-1)反轉
  4. 第三次反轉:將數組剩余元素(索引k到末尾)反轉

通過三次局部反轉,最終實現數組整體向右旋轉k步的效果,時間復雜度O(n),空間復雜度O(1)。

代碼

/*** @param {number[]} nums* @param {number} k* @return {void} Do not return anything, modify nums in-place instead.*/
var rotate = function(nums, k) {const len = nums.length;const count = k % len;if (count === 0) return;reverse(nums, 0, len-1);reverse(nums, 0, count-1);reverse(nums, count, len-1);
};function reverse(nums, begin, end) {while (begin < end) {[nums[begin], nums[end]] = [nums[end], nums[begin]];begin++;end--;}
}

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

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

相關文章

【Linux我做主】細說進程等待

Linux進程等待Linux進程等待github地址0. 前言1. 進程等待的必要性1.1 避免僵尸進程與資源泄漏1.2 僵尸進程不可被直接清除1.3 獲取子進程的運行結果2. 進程等待的三個問題1. 為什么要有進程等待2. 進程等待是什么3. 怎么實現進程等待3. 僵尸進程演示4. waitwait的手冊聲明wait…

大語言模型對齊

大語言模型對齊的重要性與目標研究 一、引言 隨著大語言模型 (LLM) 能力的不斷提升和應用場景的日益廣泛,這些模型在為人類社會帶來巨大便利的同時,也引發了一系列關于安全性、可靠性和倫理問題的擔憂(9)。大語言模型的對齊 (alignment) 作為確保這些強大的 AI 系統與人類價…

數組(4)

int mid min (key - arr[min]) / (arr[max] - arr[min]) * (max - min);17.數組常見算法4 分塊查找18.數組常見算法5 冒泡排序筆記小程序錯誤#include<stdio.h> int main() {/*冒泡排序&#xff1a;1.相鄰的元素兩兩比較&#xff0c;大的放右邊&#xff0c;小的放左邊2…

STM32 讀寫備份寄存器

本章節功能利用備份寄存器&#xff08;BKP&#xff09;實現數據的掉電保存&#xff0c;并通過按鍵和OLED顯示屏進行交互。使能電源&#xff08;PWR&#xff09;和備份域&#xff08;BKP&#xff09;的時鐘&#xff08; RCC_APB1PeriphClockCmd 函數&#xff09;&#xff0c;并…

RabbitMinQ(模擬實現消息隊列項目)02

目錄 十.整合數據庫和文件數據 創建DiskDataManager類 十一.內存結構設計 創建MeneryDataCenter類: 實現集合操作: 對MemoryDataCenter類功能測試: 十二.整合內存和磁盤數據 創建VirtualHost類: Exchange: MSGQueue: Binding: 創建Router類 對Router類的TOPIC匹配…

Unity Standard Shader 解析(五)之ShadowCaster

一、ShadowCaster // ------------------------------------------------------------------// Shadow rendering passPass {Name "ShadowCaster"Tags { "LightMode" "ShadowCaster" }ZWrite On ZTest LEqualCGPROGRAM#pragma target 3.0// --…

[MRCTF2020]Ez_bypass

BUUCTF在線評測BUUCTF 是一個 CTF 競賽和訓練平臺&#xff0c;為各位 CTF 選手提供真實賽題在線復現等服務。https://buuoj.cn/challenges#[MRCTF2020]Ez_bypass啟動靶機 有提示F12&#xff0c;那查看一下源碼。和頁面顯示的代碼一樣的&#xff0c;就是格式更規范而已 include…

C/C++關鍵字——union

1.介紹union是一種特殊的數據類型&#xff0c;它允許你在同一塊內存區域中存儲不同的數據類型。它的主要目的是節省內存&#xff0c;尤其是在處理多種可能的數據類型&#xff0c;但一次只使用其中一種的場景。2.特點與 struct&#xff08;結構體&#xff09;不同&#xff0c;結…

2024 arXiv Cost-Efficient Prompt Engineering for Unsupervised Entity Resolution

論文基本信息 題目&#xff1a; Cost-Efficient Prompt Engineering for Unsupervised Entity Resolution 作者&#xff1a; Navapat Nananukul, Khanin Sisaengsuwanchai, Mayank Kejriwal 機構&#xff1a; University of Southern California, Information Sciences Institu…

【XR技術概念科普】什么是注視點渲染(Foveated Rendering)?為什么Vision Pro離不開它?

一、前言2023 年&#xff0c;蘋果推出了 Vision Pro 頭顯&#xff0c;把“空間計算”概念推向大眾。與以往的 XR 設備不同&#xff0c;Vision Pro 強調高分辨率、真實感與沉浸感。然而&#xff0c;這種體驗背后隱藏著一個巨大的技術挑戰&#xff1a;如何在有限的計算與能耗條件…

Qt 系統相關 - 1

雖然 Qt 是跨平臺的 C 開發框架&#xff0c;Qt 有很多能力其實是操作系統提供的&#xff0c;只不過 Qt 封裝了系統的 API程序時運行在操作系統上的&#xff0c;需要系統給我們提供支撐&#xff01;事件文件操作多線程編程網絡編程多媒體&#xff08;音頻&#xff0c;視頻&#…

“12306”有多牛逼?從架構師的角度詳細的告訴你

12306鐵路票務系統架構深度解析 &#x1f4da; 目錄 系統概述業務特點與技術挑戰整體架構設計核心技術架構高并發處理策略數據存儲與管理緩存體系設計分布式系統架構安全防護體系性能優化策略監控與運維技術演進歷程總結與展望 每到春節、國慶這種全民遷徙的時刻&#xff0c;…

數據采集機器人哪家好?2025 年實測推薦:千里聆 RPA 憑什么成企業首選?

在數字化轉型加速的今天&#xff0c;數據采集已成為企業運營的核心環節&#xff0c;數據采集機器人正在重構企業的效率邊界。2025 年中國 RPA 市場排名顯示&#xff0c;泛微旗下的千里聆 RPA 已躋身行業前五&#xff0c;成為中大型國央企的首選品牌。本文將通過三維評估體系&am…

基礎crud項目(前端部分+總結)

本人根據自己對前端微不足道的理解和 AI 老師的指導下&#xff0c;艱難地完成了基礎crud代碼的全棧開發&#xff0c;算是自己的第一個 Java 項目&#xff0c;對此做個簡單總結。 后端部分 在前后端分離開發中&#xff0c;前端負責頁面交互與數據展示&#xff0c;后端提供接口支…

MATLAB矩陣及其運算(二)函數

函數分為MATLAB內置函數及用戶自定義函數&#xff0c;用戶可以直接調用內置函數進行數據處理。內置函數的使用函數由三部分組成&#xff1a;名稱、輸入和輸出。內置函數示例&#xff1a;單輸入單輸出函數&#xff1a;sqrt(x)&#xff1b;單輸入多輸出函數&#xff1a;size(x)&a…

自動化運維-ansible中對于大項目的管理

自動化運維-ansible中對于大項目的管理 一、引用主機清單 在Playbook中引用主機時&#xff0c;hosts 字段指定的目標必須與Ansible主機清單中定義的標識符完全匹配。如果清單中配置的是主機名&#xff0c;則在Playbook中使用IP地址或其他別名將無法匹配&#xff0c;導致任務被跳…

59_基于深度學習的麥穗計數統計系統(yolo11、yolov8、yolov5+UI界面+Python項目源碼+模型+標注好的數據集)

目錄 項目介紹&#x1f3af; 功能展示&#x1f31f; 一、環境安裝&#x1f386; 環境配置說明&#x1f4d8; 安裝指南說明&#x1f3a5; 環境安裝教學視頻 &#x1f31f; 二、數據集介紹&#x1f31f; 三、系統環境&#xff08;框架/依賴庫&#xff09;說明&#x1f9f1; 系統環…

面試問題詳解十六:Qt 內存管理機制

在 Qt 開發過程中&#xff0c;很多初學者&#xff08;包括不少有經驗的 C 程序員&#xff09;經常會產生這樣的疑問&#xff1a;“我在 Qt 中 new 出來的控件好像都沒有 delete&#xff0c;那內存不會泄漏嗎&#xff1f;”比如下面這段代碼&#xff1a; void Widget::createLef…

Pycharm 試用

Ubuntu 重置Pycharm試用期限&#xff08;30 天&#xff09; 先關閉Pycharm刪除系統緩存 rm -rf ~/.config/JetBrains/ && rm -rf ~/.local/share/JetBrains/ && rm -rf ~/.cache/JetBrains/刪除已經安裝的 Pycharm 軟件運行目錄去官網下載新的 就行了

C++ Qt 開發核心知識

Qt 框架概述Qt 是一個跨平臺的 C 應用程序開發框架&#xff0c;廣泛用于開發圖形用戶界面程序。其核心特性包括跨平臺能力、豐富的功能模塊和強大的工具集。核心概念與機制元對象系統Qt 擴展了標準 C&#xff0c;通過元對象系統提供信號與槽機制、運行時類型信息和動態屬性系統…