LeetCode算法學習之--數組--旋轉數組

你們好今天給你們分享下一道 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) */
複製代碼

11.png

解法二:雙指針

思路
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) */
複製代碼

22.png

解法三:unshift+pop(超時只是做爲參考)

思路
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

相關文章
相關標籤/搜索