iT邦幫忙

0

[LeetCode] 189. Rotate Array

  • 分享至 

  • xImage
  •  

Medium
Related Topics: Array / Math / Two Pointers
LeetCode Source

解題想法

這裡初始化 lnums 的長度
蠻直觀的解法,直接在 l - k 的地方把 nums 切開,之後將後半部放到前面
不過要注意的一點是,有時候 k 會大於 l,所以記得 k = k % l

Python

class Solution:
    def rotate(self, nums: List[int], k: int) -> None:
        """
        Do not return anything, modify nums in-place instead.
        """
        l = len(nums)
        k = k % l
        nums[:] = nums[l-k:] + nums[:l-k]
        return

Python 解法有點簡單,所以自己建議是多用其他語言解題

C++

class Solution {
public:
    void rotate(vector<int>& nums, int k) {
        int l = nums.size();
        k = k % l;
        vector<int> temp(nums.begin() + l - k, nums.end());
        temp.insert(temp.end(), nums.begin(), nums.begin() + l - k);
        nums = temp;
    }
};

這解法不是 in-place 解,我在這多宣告一個 temp 來放 nums 的後半部
後面用 insert 將原先 nums 的前半部放在 temp 的後面,最後 temp 取代 nums


有鑑於 C++ 解法並非 in-place,所以有另一種解法,用 reverse()
做法是 reverse() 三次,後面兩步可以交換順序執行

  • 整個 nums
  • 前面 k
  • 後面 l - k

解題想法

Python

class Solution(object):
    def rotate(self, nums, k):
        """
        :type nums: List[int]
        :type k: int
        :rtype: None Do not return anything, modify nums in-place instead.
        """
        k = k % len(nums)
        nums.reverse()
        nums[k:] = reversed(nums[k:])
        nums[:k] = reversed(nums[:k])

nums.reverse() 反轉整個 list
而透過 reversed(nums[k:]) 反轉 index kl 的 list
reversed(nums[:k]) 反轉 index 0k - 1 的 list

C++

class Solution {
public:
    void rotate(vector<int>& nums, int k) {
        k = k % nums.size();
        reverse(nums.begin(), nums.end());
        reverse(nums.begin(), nums.begin() + k);
        reverse(nums.begin() + k, nums.end());
    }
};

這系列文被記錄在 Top Interview 150 Series


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言