示例: 輸入: nums = [1,2,3,4,5,6,7], k = 3 輸出: [5,6,7,1,2,3,4]
解題思路
最簡單的重建一個同樣大小的數組,則滿足(i+k)mod(len) 處的位置的值為原數組 i 位置的值。空間復雜度為O(N) 我們也可以構造部分數組,大小為k mod(len) 只需要將后面k個元素提前存儲起來就可以了。然后挨個循環移位就可以,時間相對第一種會節約一些。同時空間也會節約,空間復雜度為O(K), 這里的k是常量。按理說可以算做O(1). 但是相比較下一種,空間還是較多的。 最后一種應該是時間和空間都畢竟均衡的方法。也就是犧牲時間來換空間。利用三次反轉就可以了
代碼實現
1
classSolution{publicvoidrotate(int[] nums,int k){int temp;int len = nums.length;k = k % len;int[] tempNums =newint[len];for(int i =0; i < len ; i++){tempNums[(i + k)% len]= nums[i];}for(int i =0; i < len ; i++){temp = nums[i];nums[i]= tempNums[i];tempNums[i]= temp;}}}
2
classSolution{publicvoidrotate(int[] nums,int k){int temp;int len = nums.length;k = k % len;int[] numsk =newint[k];for(int i =0; i < k ; i++){numsk[i]= nums[len - k + i];}for(int i = len -1; i >=k; i--){temp = nums[i];nums[i]= nums[i-k];nums[i-k]= temp;}for(int i =0; i < k ; i++){nums[i]= numsk[i];}}}
3
classSolution{publicvoidrotate(int[] nums,int k){int temp;int len = nums.length;k = k % len;for(int i =0; i < len /2; i++){temp = nums[i];nums[i]= nums[len-1-i];nums[len -1-i]= temp;}for(int i =0; i < k /2; i ++){temp = nums[i];nums[i]= nums[k-1-i];nums[k -1-i]= temp;}for(int i = k; i <(len - k)/2+ k; i ++){temp = nums[i];nums[i]= nums[len + k-1-i];nums[len + k -1-i]= temp;}}}