Java程式:查詢陣列左旋轉K次後的第M個元素


在這個問題中,我們將對陣列進行K次左旋轉,並找到旋轉後陣列中的第M個元素。

解決這個問題的簡單方法是對陣列進行K次左旋轉,然後從M-1索引處獲取元素。

最佳化的解決方法是找到最終索引值,使得最終索引是旋轉後陣列的M-1索引。

問題陳述

我們給定一個包含正整數的nums[]陣列。我們還給定正整數K和M。我們需要將陣列左旋轉K次並列印第M個元素。

示例

Input –  nums[] = { 20, 30, 5, 6, 8, 23 }; K = 3, M = 3;
Output – 23

解釋

  • 第一次旋轉後,陣列變為{30, 5, 6, 8, 23, 20}。

  • 第二次旋轉後,更新後的陣列為{5, 6, 8, 23, 20, 30}。

  • 最終旋轉後,陣列為{6, 8, 23, 20, 30, 5}。

最終陣列中第3個位置的元素是23。

Input –  nums[] = { 20, 30, 5, 6, 8, 23 }; K = 0, M = 3;
Output – 5

解釋

我們不需要進行旋轉。因此,原始陣列中第3個位置的元素是5。

Input –  nums[] = { 20, 30, 5, 6, 8, 23 }; K = 5, M = 2;
Output – 20

解釋

左旋轉5次後的陣列將是{23, 20, 30, 5, 6, 8},更新後陣列中的第2個元素是20。

方法1

在這種方法中,我們將陣列左旋轉K次。之後,我們將訪問陣列中M-1索引處的元素。

演算法

  • 步驟1 − 開始遍歷陣列。

  • 步驟2 − 將第一個陣列元素儲存到'temp'變數中。

  • 步驟3 − 使用另一個巢狀迴圈遍歷陣列。在巢狀迴圈中,用nums[q+1]替換nums[q]。

  • 步驟4 − 在外迴圈中,用'temp'值替換nums[nums_len - 1]。

  • 步驟5 − 返回nums[M - 1]元素。

示例

import java.util.*;

public class Main {
   public static int findElement(int[] nums, int nums_len, int K, int M){
      // Making K left rotations of array
      for (int p = 0; p < K; p++) {
         int temp = nums[0];
            for (int q = 0; q < nums_len - 1; ++q) {
            nums[q] = nums[q + 1];
         }
         nums[nums_len - 1] = temp;
      }
      // Return Mth element of rotated array
      return nums[M-1];
   }
   public static void main(String[] args) {
      int nums[] = { 20, 30, 5, 6, 8, 23 };
      int nums_len = nums.length;
      int K = 3, M = 3;
      System.out.println("The element at " + M + " index after rotating array by " + K + " left rotations is "
      + findElement(nums, nums_len, K, M));
   }
}

輸出

The element at 3 index after rotating array by 3 left rotations is 23
  • 時間複雜度 − O(N*K) 進行K次左旋轉。

  • 空間複雜度 − O(1),因為我們沒有使用任何動態空間。

方法2

在這種方法中,我們將K與陣列長度取模。因為如果我們進行的左旋轉次數等於陣列長度,我們將得到原始陣列。

如果我們將陣列旋轉K次,我們將得到(K - 1)位置的元素位於第一個位置,從那裡我們需要獲取第M個元素。

演算法

  • 步驟1 − 將K與陣列長度取模。

  • 步驟2 − 將(K + M - 1)與陣列長度取模後的結果值儲存到'ind'變數中。

  • 步驟3 − 從'ind'索引訪問陣列元素,並返回其值。

示例

import java.util.*;

public class Main {
   public static int findElement(int[] nums, int nums_len, int K, int M) {
      K %= nums_len;
      // Get the index of the Mth element
      int ind = (K + M - 1) % nums_len;
      return nums[ind];
   }
   public static void main(String[] args) {
      int nums[] = { 20, 30, 5, 6, 8, 23 };
      int nums_len = nums.length;
      int K = 3, M = 3;
      System.out.println("The element at " + M + " index after rotating array by " + K + " left rotations is "
      + findElement(nums, nums_len, K, M));
   }
}

輸出

The element at 3 index after rotating array by 3 left rotations is 23
  • 時間複雜度 − O(1),因為我們沒有遍歷陣列。

  • 空間複雜度 − O(1),因為我們使用了常量空間。

結論

第一種方法旋轉陣列K次,但第二種方法根據給定的K和M值計算最終索引值,使問題解決方案更高效。

更新於:2023年10月5日

174 次瀏覽

開啟你的職業生涯

完成課程獲得認證

開始學習
廣告