摘要:公眾號愛寫給定一個(gè)數(shù)組,將數(shù)組中的元素向右移動個(gè)位置,其中是非負(fù)數(shù)。只要截取輸入的后位的數(shù)組與輸入的剩余長度的數(shù)組,即為所求但是題目要求使用空間復(fù)雜度為的原地算法。利用切片切片組成新數(shù)組
公眾號:愛寫bug(ID:icodebugs)
給定一個(gè)數(shù)組,將數(shù)組中的元素向右移動 k 個(gè)位置,其中 k 是非負(fù)數(shù)。
Given an array, rotate the array to the right by k steps, where k is non-negative.
示例 1:
輸入: [1,2,3,4,5,6,7] 和 k = 3 輸出: [5,6,7,1,2,3,4] 解釋: 向右旋轉(zhuǎn) 1 步: [7,1,2,3,4,5,6] 向右旋轉(zhuǎn) 2 步: [6,7,1,2,3,4,5] 向右旋轉(zhuǎn) 3 步: [5,6,7,1,2,3,4]
示例 2:
輸入: [-1,-100,3,99] 和 k = 2 輸出: [3,99,-1,-100] 解釋: 向右旋轉(zhuǎn) 1 步: [99,-1,-100,3] 向右旋轉(zhuǎn) 2 步: [3,99,-1,-100]
說明:
盡可能想出更多的解決方案,至少有三種不同的方法可以解決這個(gè)問題。
要求使用空間復(fù)雜度為 O(1) 的 原地 算法。
Note:
Try to come up as many solutions as you can, there are at least 3 different ways to solve this problem.
Could you do it in-place with O(1) extra space
解題思路:? 如果按照示例那種一步一步向右移,太慢。我們直接看 示例1輸入 和 最終結(jié)果輸出(移動步數(shù)k=3):
輸入: [1,2,3,4,5,6,7]
輸出: [5,6,7,1,2,3,4]
找一下規(guī)律,我起先是以為直接以該索引 i 與 i+3 交換位置,不過仔細(xì)看一下就發(fā)現(xiàn)錯(cuò)的太離譜了。
我們可以發(fā)現(xiàn)輸出前三位數(shù)是輸入的后三位,輸出后四位數(shù)是輸入的前四位。而移動步數(shù) k=3,剩余長度=數(shù)組長度 - 移動步數(shù) = 7-3=4 ,剛好對應(yīng)我們發(fā)現(xiàn)的規(guī)律。
只要截取輸入的后k位的數(shù)組與 輸入的剩余長度的數(shù)組,即為所求:[5,6,7]+[1,2,3,4]
但是:題目要求使用空間復(fù)雜度為 O(1) 的 原地 算法。這在python中可以利用切片特性直接像上面那樣截取,而空間復(fù)雜度不變。但是在CC++、Java里是肯定會改變空間復(fù)雜度,不滿足要求。
這時(shí)候可以換個(gè)思路,如下所示不斷反轉(zhuǎn)特定長度數(shù)組:
輸入: [1,2,3,4,5,6,7]反轉(zhuǎn)整個(gè)數(shù)組: [7,6,5,4,3,2,1]
反轉(zhuǎn)前k位:[5,6,7]
反轉(zhuǎn)剩余的: [1,2,3,4]
輸出: [5,6,7,1,2,3,4]
或者改變一下順序先反轉(zhuǎn)前 剩余位數(shù)和后k位:
輸入: [1,2,3,4,5,6,7]Java(反轉(zhuǎn)數(shù)組):反轉(zhuǎn)前剩余長度的: [4,3,2,1]
反轉(zhuǎn)后k位:[7,6,5]
此時(shí)數(shù)組:[4,3,2,1,7,6,5]
反轉(zhuǎn)整個(gè)數(shù)組: [5,6,7,1,2,3,4]
輸出: [5,6,7,1,2,3,4]
class Solution { public void rotate(int[] nums, int k) { int numsLen=nums.length,temp; k=k%numsLen; if(k==0) return; swapArray(nums,0,numsLen-1);//反轉(zhuǎn)整個(gè)數(shù)組 swapArray(nums,0,k-1);//反轉(zhuǎn)0到k-1索引,前k位的數(shù)組 swapArray(nums,k,numsLen-1);//反轉(zhuǎn)k到末尾索引,后剩余位數(shù)位的數(shù)組 } private void swapArray(int[] nums,int start,int end){//反轉(zhuǎn)函數(shù) int temp; for (int i=start,j=end;i注:Java段代碼是以反轉(zhuǎn)方法里介紹的第一個(gè)方法為例,第二種方法只要改變一下
swapArray(nums,0,numsLen-1);//反轉(zhuǎn)整個(gè)數(shù)組 swapArray(nums,0,k-1);//反轉(zhuǎn)0到k-1索引,前k位的數(shù)組 swapArray(nums,k,numsLen-1);//反轉(zhuǎn)k到末尾索引,后剩余位數(shù)位的數(shù)組的順序和參數(shù)即可,不再復(fù)現(xiàn)。
Python3(利用切片):class Solution: def rotate(self, nums: List[int], k: int) -> None: """ Do not return anything, modify nums in-place instead. """ nums_len = len(nums) k = k%nums_len nums[0:nums_len] = nums[nums_len-k:] + nums[:nums_len-k]#切片組成新數(shù)組
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/45107.html
摘要:公眾號愛寫給定一個(gè)數(shù)組,將數(shù)組中的元素向右移動個(gè)位置,其中是非負(fù)數(shù)。只要截取輸入的后位的數(shù)組與輸入的剩余長度的數(shù)組,即為所求但是題目要求使用空間復(fù)雜度為的原地算法。利用切片切片組成新數(shù)組 公眾號:愛寫bug(ID:icodebugs) 給定一個(gè)數(shù)組,將數(shù)組中的元素向右移動 k 個(gè)位置,其中 k 是非負(fù)數(shù)。 Given an array, rotate the array to the ...
摘要:題目旋轉(zhuǎn)數(shù)組給定一個(gè)數(shù)組,將數(shù)組中的元素向右移動個(gè)位置,其中是非負(fù)數(shù)。例如將到反轉(zhuǎn)將到反轉(zhuǎn)全部翻轉(zhuǎn)得到最后結(jié)果。這里要注意下還有這樣的情況即大于數(shù)組長度的情況。次旋轉(zhuǎn)次旋轉(zhuǎn)轉(zhuǎn)回來了次旋轉(zhuǎn)次旋轉(zhuǎn)轉(zhuǎn)回來了次旋轉(zhuǎn)所以這里的有效等于對數(shù)組長度求余。 題目: 旋轉(zhuǎn)數(shù)組 給定一個(gè)數(shù)組,將數(shù)組中的元素向右移動 k 個(gè)位置,其中 k 是非負(fù)數(shù)。 示例: 輸入: [1,2,3,4,5,6,7] 和 k...
摘要:問題描述解題思路使用數(shù)組自帶的方法和方法把數(shù)組最后一個(gè)取出來加入到頭部。使用數(shù)組的方法得到后個(gè)數(shù),再用方法刪去后個(gè)數(shù),最后用方法把得到的后個(gè)數(shù)添加到數(shù)組前面。 問題描述: 189.Rotate Array Rotate an array of n elements to the right by k steps. For example, with n = 7 and k = 3, t...
摘要:解法一假設(shè)數(shù)組為先把換到的位置,把拿著換到的位置,把拿著換到的位置。。。停止條件姑且假設(shè)為當(dāng)置換的數(shù)回到數(shù)組的首位。不過換一個(gè)栗子上述方法就不通了,比如數(shù)組為換一輪發(fā)現(xiàn)結(jié)果是。 題目: Rotate an array of n elements to the right by k steps. For example, with n = 7 and k = 3, the array [...
摘要:給定一個(gè)鏈表,旋轉(zhuǎn)鏈表,將鏈表每個(gè)節(jié)點(diǎn)向右移動個(gè)位置,其中是非負(fù)數(shù)。按上述思路解,與旋轉(zhuǎn)數(shù)組那道題大同小異,來介紹另一種很簡單高效的方法。只需在第個(gè)節(jié)點(diǎn)之后切斷,首尾連接即可。另外可能大于鏈表長度,應(yīng)當(dāng)做求余運(yùn)算。 ?給定一個(gè)鏈表,旋轉(zhuǎn)鏈表,將鏈表每個(gè)節(jié)點(diǎn)向右移動 k 個(gè)位置,其中 k 是非負(fù)數(shù)。 Given a linked list, rotate the list to the ...
閱讀 4642·2021-10-25 09:48
閱讀 3220·2021-09-07 09:59
閱讀 2203·2021-09-06 15:01
閱讀 2704·2021-09-02 15:21
閱讀 2741·2019-08-30 14:14
閱讀 2194·2019-08-29 13:59
閱讀 2526·2019-08-29 11:02
閱讀 2544·2019-08-26 13:33