您好,登錄后才能下訂單哦!
本篇內容介紹了“leetcode旋轉數組問題怎么解決”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
暴力法每次旋轉1個位置, 旋轉k次即為正確答案。
旋轉的時候也是利用前驅結點來實現的, 前驅結點的更新也借助temp變量。
這里重點體會如何完成向后移動一次目前階段遇到題目不要鉆牛角尖, 暴力法能解就暴力法。
class Solution { public void rotate(int[] nums, int k) { int previous; int temp; for (int i = 0; i < k; i++) { previous = nums[nums.length-1]; //前驅結點初始為最后一個結點 for (int j = 0; j < nums.length; j++) { temp = nums[j]; //先保存當前結點 nums[j]=previous; previous=temp; //更新前驅結點 } } } }
這個方法基于這個事實:當我們旋轉數組 k 次,k%n 個尾部元素會被移動到頭部, 剩下的元素依次向后移動。
1、反轉可以把k%n個元素先放到前面,只需要對數組進行 0到k-1范圍內的反轉就可以得到想要的順序;
2、反轉剩下的k-1到n-1個元素即實現了元素依次后移;
3、前往要主義此處的k有可能超出數組長度,而如果恰等于數組長度就等于沒變所以k=k%n。
class Solution { public void rotate(int[] nums, int k) { int n = nums.length; k %= n; //k可能會查過數組長度造成錯誤 //1、反轉數組 reverse(nums,0,n-1); //2、前k個反轉,后n-k個反轉 reverse(nums,0,k-1); reverse(nums,k,n-1); } //反轉數組 用這種寫法可以方便的反轉任意區間的數組 也很使用 public void reverse(int[] nums, int start, int end) { while (start < end) { int temp = nums[start]; nums[start] = nums[end]; nums[end] = temp; start++; end--; } } }
想到了但是代碼實現的時候遇到了當 n%k==0的時候死循環而想不到解決的辦法。
以下是leetcode提供的代碼,巧妙的用了雙循環循環解決了我不能解決的尷尬,核心代碼都是一樣的,外循環的此時必定是數組長度。
用count來控制外循環次數,內循環一鏡到底都是我沒有想到的。在編碼方面還有很大提高。
public class Solution { public void rotate(int[] nums, int k) { k = k % nums.length; int count = 0; for (int start = 0; count < nums.length; start++) { int current = start; int prev = nums[start]; do { int next = (current + k) % nums.length; int temp = nums[next]; nums[next] = prev; prev = temp; current = next; count++; } while (start != current); } } }
“leetcode旋轉數組問題怎么解決”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。