你們好今天給你們分享下一道 LeetCode 中等難度 的題目[旋轉數組]javascript
這裏主要是分享思路和註釋,供你們更好的理解題目解法,代碼部分是參考LeetCode 轉寫成javascript 代碼,前端
給定一個數組,將數組中的元素向右移動
k
個位置,其中k
是非負數。java
示例 1:
輸入: 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]
示例 2:
輸入:nums = [-1,-100,3,99], k = 2
輸出:[3,99,-1,-100]
解釋:
向右旋轉 1 步: [99,-1,-100,3]
向右旋轉 2 步: [3,99,-1,-100]
複製代碼
1.移動k位置,k>=0算法
2.目標:最後k個元素放在前面去數組
解法markdown
1.雙數組網絡
2.reverseoop
3.pop+unshift學習
思路
1.拿2個數組,一個存放旋轉數組的前綴元素,一個存放後綴元素
2.更新原數組
*/
var rotate = function (nums, k) {
const preArr = [],
sufArr = [];
const len = nums.length;
// 排序K>len的狀況,取餘數
k = k % len;
// preArr 存放前綴元素,sufArr存放後綴元素
for (let i = 0; i < nums.length; i++) {
if (i < len - k) preArr[i] = nums[i];
else sufArr[i] = nums[i];
}
// 更新原數組
for (let i = 0; i < nums.length; i++) {
if (i < k) nums[i] = sufArr[i + len - k];
else nums[i] = preArr[i - k];
}
};
/* 複雜度 時間 O(n) 空間 O(n) */
複製代碼
思路
1.利用雙指針翻轉數組
2.把整個數組都翻轉
3.移動k位置,翻轉k以前的數組
4.翻轉k以後的數組
*/
var rotate = function (nums, k) {
const len = nums.length;
// 取餘數,防止過界
k = k % len;
// 利用雙指針進行翻轉
function reverse(arr, start, end) {
for (let left = start, right = end; left < right; ) {
// 交換元素
const temp = arr[left];
arr[left] = arr[right];
arr[right] = temp;
left++;
right--;
}
}
//翻轉整個數組
reverse(nums, 0, len - 1);
// 翻轉k以前的數組
reverse(nums, 0, k - 1);
// 翻轉k以後的數組
reverse(nums, k, len - 1);
};
/* 複雜度 時間 O(n) 空間 O(1) */
複製代碼
思路
1.取出k個元素
2.放在以後
*/
var rotate = function (nums, k) {
for (let i = 0; i < k; i++) {
const item = nums.pop();
nums.unshift(item);
}
};
/* 複雜度 時間 O(n^3) 空間 O(1) */
複製代碼
這道題考察對翻轉數組的理解,能夠經過 "翻轉" 和 "額外添加數組" 的方式來實現spa
你們能夠看看我分享的一個專欄(前端搞算法)裏面有更多關於算法的題目的分享,但願可以幫到你們,我會盡可能保持天天晚上更新,若是喜歡的麻煩幫我點個贊,十分感謝
文章內容目的在於學習討論與分享學習算法過程當中的心得體會,文中部分素材來源網絡,若有侵權,請聯繫刪除,郵箱 182450609@qq.com