leetcode | Medium | 189. Rotate Array

更新於 2024/11/06閱讀時間約 4 分鐘

問題描述

給定長度為 n 的陣列 nums,將陣列中的元素向右旋轉 k 個位置,其中 k 是非負數。

輸入: 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]

解法一:使用額外陣列的直觀解法

直觀的想法是使用一個額外的陣列,將旋轉後的位置預先計算好,然後將元素放在正確的位置。

時間複雜度:O(n)

因為需要遍歷整個陣列一次。

C++程式碼:

class Solution {
public:
void rotate(vector<int>& nums, int k) {
int n = nums.size();
vector<int> temp(n); // 建立臨時陣列
k = k % n; // 處理 k 大於 n 的情況
for(int i = 0; i < n; i++) {
temp[(i + k) % n] = nums[i]; // 計算新位置並賦值
}
nums = move(temp); // 將結果移回原陣列
}
};

解釋:

  • 創建一個與原陣列大小相同的臨時陣列 temp
  • 遍歷原陣列,計算每個元素在旋轉後的位置 (i + k) % n,並將元素放入 temp 中的對應位置。
  • temp 中的元素移回原陣列 nums

解法二:反轉

為了減少空間複雜度,我們可以考慮在原陣列上進行操作,不使用額外的空間。核心思想是通過反轉陣列來達到旋轉的效果。

時間複雜度:O(n)

反轉操作需要遍歷陣列,但總共只遍歷了 3 次。

C++程式碼:

class Solution {
public:
void rotate(vector<int>& nums, int k) {
int n = nums.size();
k = k % n; // 處理 k 大於 n 的情況
reverse(nums.begin(), nums.end()); // 整體反轉
reverse(nums.begin(), nums.begin() + k); // 反轉前 k 個元素
reverse(nums.begin() + k, nums.end()); // 反轉後 n - k 個元素
}
};

解釋:

  • 整體反轉陣列: 將陣列的所有元素反轉,這樣原本的順序被顛倒。
  • 反轉前 k 個元素: 將陣列的前 k 個元素再次反轉,使其回到正確的順序。
  • 反轉後 n - k 個元素: 將剩下的元素(從第 k 個位置到結尾)反轉,恢復正確順序。

步驟拆分:

以陣列 [1,2,3,4,5,6,7]k = 3 為例:

  1. 整體反轉:
    複製程式碼原陣列:1 2 3 4 5 6 7

    反轉後:7 6 5 4 3 2 1
  2. 反轉前 k 個元素(前 3 個):
    複製程式碼部分反轉:5 6 7 | 4 3 2 1
  3. 反轉後 n - k 個元素(後 4 個):
    複製程式碼最終結果:5 6 7 1 2 3 4

以上是 Hua 在 LeetCode 的解題分享,有想法或是建議歡迎在底下討論。

Day Day Good, Day Day Up !


內容總結
難度
2
/5
avatar-img
9會員
8內容數
成功考上研究所,當面對大量的文獻資源時,你可能感到茫然不知如何開始閱讀,也或許不確定該如何開始撰寫畢業論文。在這裡,我將與你分享一些與做研究相關的實用技巧,期望這份指南能夠為初次踏入研究領域的新手帶來實質的協助。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
Hua的沙龍 的其他內容
這題是面試中常見的經典題目,要求從一個陣列裡找出出現次數超過一半的元素,也就是所謂的「眾數」。為了更好理解,會先用一個直觀、易懂的方式來解釋問題,透過哈希表的方法來找出答案。接著,我會介紹一個更快、更有效率的解法,也就是 Boyer-Moore 多數投票算法。
這個問題「Remove Duplicates from Sorted Array」要求我們從一個已排序的陣列中移除重複的元素,並且返回移除後的陣列新長度。由於陣列已經是排序好的,所以所有的重複元素會是相鄰的。 我們需要移除重複的元素,使每個元素最多只出現一次,並返回去重後的陣列長度。不能使用額外的空
今天介紹 LeetCode 「Container With Most Water」,分享兩種解法,包括暴力法和雙指針法。透過 C++ 的逐行解讀,幫助讀者更有效地思考問題,尤其在時間複雜度方面的差異,對於學習演算法與程式設計都有所幫助。
這題是面試中常見的經典題目,要求從一個陣列裡找出出現次數超過一半的元素,也就是所謂的「眾數」。為了更好理解,會先用一個直觀、易懂的方式來解釋問題,透過哈希表的方法來找出答案。接著,我會介紹一個更快、更有效率的解法,也就是 Boyer-Moore 多數投票算法。
這個問題「Remove Duplicates from Sorted Array」要求我們從一個已排序的陣列中移除重複的元素,並且返回移除後的陣列新長度。由於陣列已經是排序好的,所以所有的重複元素會是相鄰的。 我們需要移除重複的元素,使每個元素最多只出現一次,並返回去重後的陣列長度。不能使用額外的空
今天介紹 LeetCode 「Container With Most Water」,分享兩種解法,包括暴力法和雙指針法。透過 C++ 的逐行解讀,幫助讀者更有效地思考問題,尤其在時間複雜度方面的差異,對於學習演算法與程式設計都有所幫助。
你可能也想看
Google News 追蹤
Thumbnail
本文探討了複利效應的重要性,並藉由巴菲特的投資理念,說明如何選擇穩定產生正報酬的資產及長期持有的核心理念。透過定期定額的投資方式,不僅能減少情緒影響,還能持續參與全球股市的發展。此外,文中介紹了使用國泰 Cube App 的便利性及低手續費,幫助投資者簡化投資流程,達成長期穩定增長的財務目標。
Thumbnail
題目敘述 Make Two Arrays Equal by Reversing Subarrays 題目給定兩個輸入陣列,請問能否透過子陣列的反轉讓兩個陣列相等? 子陣列的反轉操作次數不受限制。 如果可以,返回True 如果不行,返回False
Thumbnail
題目敘述 Sort Array by Increasing Frequency Leetcode #1636 給定一個輸入陣列,請依照出現頻率的多寡從低頻到高頻排列陣列元素。 如果有兩個元素的出現頻率相同,依照元素大小從大到小排列。 測試範例 Example 1: Input: nums
Thumbnail
給定一個輸入陣列,每一個tuple代表節點之間了從屬關係。 請從從屬關係重建整顆二元樹,並且返回整顆二元樹的根結點。
Thumbnail
題目敘述 Merge Nodes in Between Zeros 給定一個鏈結串列,合併非零區間的節點(以加總的方式合併),輸出合併後的鏈結串列。
Thumbnail
題目敘述 Intersection of Two Arrays II 給定兩個輸入陣列,請找出兩個陣列交集的元素,並且依照出現次數輸出。 測試範例 Example 1: Input: nums1 = [1,2,2,1], nums2 = [2,2] Output: [2,2] 交集元素
Thumbnail
for loop、while loop、repeat
Thumbnail
給定一個字串陣列,請把它們所共有的字元伴隨著出現次數輸出。這篇文章介紹如何使用字典統計出現次數,和字典取交集的方法來解決此問題。並提供了複雜度分析和關鍵知識點。
Thumbnail
題目敘述 題目會給定一個整數陣列arr,要求我們判斷是否每個元素的出現次數都不同? 題目的原文敘述 測試範例 Example 1: Input: arr = [1,2,2,1,1,3] Output: true Explanation: The value 1 has 3 occurre
Thumbnail
巢狀迴圈For loop介紹結構及範例說明 巢狀迴圈 巢狀迴圈是在一個迴圈內包含另一個迴圈的結構 簡單來說,就是內迴圈做完,才會在跑到外迴圈,接著在做內迴圈
Thumbnail
本文探討了複利效應的重要性,並藉由巴菲特的投資理念,說明如何選擇穩定產生正報酬的資產及長期持有的核心理念。透過定期定額的投資方式,不僅能減少情緒影響,還能持續參與全球股市的發展。此外,文中介紹了使用國泰 Cube App 的便利性及低手續費,幫助投資者簡化投資流程,達成長期穩定增長的財務目標。
Thumbnail
題目敘述 Make Two Arrays Equal by Reversing Subarrays 題目給定兩個輸入陣列,請問能否透過子陣列的反轉讓兩個陣列相等? 子陣列的反轉操作次數不受限制。 如果可以,返回True 如果不行,返回False
Thumbnail
題目敘述 Sort Array by Increasing Frequency Leetcode #1636 給定一個輸入陣列,請依照出現頻率的多寡從低頻到高頻排列陣列元素。 如果有兩個元素的出現頻率相同,依照元素大小從大到小排列。 測試範例 Example 1: Input: nums
Thumbnail
給定一個輸入陣列,每一個tuple代表節點之間了從屬關係。 請從從屬關係重建整顆二元樹,並且返回整顆二元樹的根結點。
Thumbnail
題目敘述 Merge Nodes in Between Zeros 給定一個鏈結串列,合併非零區間的節點(以加總的方式合併),輸出合併後的鏈結串列。
Thumbnail
題目敘述 Intersection of Two Arrays II 給定兩個輸入陣列,請找出兩個陣列交集的元素,並且依照出現次數輸出。 測試範例 Example 1: Input: nums1 = [1,2,2,1], nums2 = [2,2] Output: [2,2] 交集元素
Thumbnail
for loop、while loop、repeat
Thumbnail
給定一個字串陣列,請把它們所共有的字元伴隨著出現次數輸出。這篇文章介紹如何使用字典統計出現次數,和字典取交集的方法來解決此問題。並提供了複雜度分析和關鍵知識點。
Thumbnail
題目敘述 題目會給定一個整數陣列arr,要求我們判斷是否每個元素的出現次數都不同? 題目的原文敘述 測試範例 Example 1: Input: arr = [1,2,2,1,1,3] Output: true Explanation: The value 1 has 3 occurre
Thumbnail
巢狀迴圈For loop介紹結構及範例說明 巢狀迴圈 巢狀迴圈是在一個迴圈內包含另一個迴圈的結構 簡單來說,就是內迴圈做完,才會在跑到外迴圈,接著在做內迴圈