2654. 使數組所有元素變成1的最少操作次數

中等 數組 數學 數論

思路

n為數組長度。

  1. 如果數組當中包含cnt1個數字 11,那麼就能透過操作n - cnt1次將整個數組都變成 11
  2. 如果數組不包含數字 11,就要看有沒有辦法通過操作得到數字 11

因為操作都用在相鄰的數字上,就相當於判斷存不存在一個子數組的最大公因數為 11
又因為最大公因數只會變得越來越小,若整個數組的數字取最大公因數都不等於 11
就不可能存在一個子數組,所有數字的最大公因數等於 11

因此,先判斷數組裡面有沒有 11,以及整個數組的最大公因數。
假如有 11,用它去操作其他數字,答案為n - cnt1
假如沒有 11,看能否操作出 11,如果能,找出操作出 11 的最小次數,最後加上n - 1(相當於cnt1 = 1的情況)。

程式碼

class Solution {
public:
    int minOperations(vector<int>& nums) {
        int n = nums.size();
        int GCD = 0, cnt1 = 0;
        for(int x : nums) {
            GCD = __gcd(GCD, x);
            cnt1 += x == 1;
        }
        if(GCD > 1) { // 沒有 1, 也弄不出 1 
            return -1;
        }
        if(cnt1 > 0) { // 有 1, 用這些 1 去操作其他數字
            return n - cnt1;
        }
        // 弄得出 1
        int mnSize = n;
        for(int i = 0; i < n; ++i) {
            int g = 0;
            for(int j = i; j < n; ++j) { // 從 i 開始, 往後延展, 直到弄出 1 
                g = gcd(g, nums[j]);
                if(g == 1) { // 弄出 1, 紀錄大小
                    mnSize = min(mnSize, j - i + 1);
                    break;
                }
            }
        }
        // 先透過 mnSize - 1次操作,獲取到一個 1, 
        // 再透過 n - 1 次操作讓剩下的數字變成 1 
        return mnSize + n - 2;
    }
};

複雜度分析

  • 時間複雜度:O(n2)O(n^2)
  • 空間複雜度:O(1)O(1)

顯示設定

背景線條
顯示背景網格線條
懸停發光
滑鼠懸停時顯示霓虹效果
聚光燈
跟隨滑鼠的聚光燈效果
背景透明度
開啟透明玻璃效果
主題顏色
自訂主要顏色