iT邦幫忙

2024 iThome 鐵人賽

DAY 28
0
佛心分享-刷題不只是刷題

轉生理工組後從零開始的leetcode刷題系列 第 28

day-28[medium.2134]minimum swaps to group all 1's together ll

  • 分享至 

  • xImage
  •  

A swap is defined as taking two distinct positions in an array and swapping the values in them.

A circular array is defined as an array where we consider the first element and the last element to be adjacent.

Given a binary circular array nums, return the minimum number of swaps required to group all 1's present in the array together at any location.


題目給咱一個二進制陣列nums,而且此陣列為圓形陣列(頭尾視為相鄰),可以把任意兩個數字交換位置,目標是返回所有1都相鄰所需的最少交換次數。

我的解題思路:

  • 1可以全部連在一起(ex.01111000),也可以分成頭尾兩節(ex.11100001)
  • 我想不到,投降了;w;解法有參考chatgpt、網路大神
  1. 計算陣列裡所有的1
  2. 滑動窗口:將窗口的大小設置為與1的數量相等,並在這個窗口中統計0的數量。目標是找到一個窗口,其中 0 的數量最少。
  3. 圓形陣列處理:圓形陣列可以用模數運算(取餘數 %)來處理陣列的邊界問題。

  • 滑動窗口
    窗口:這裡的窗口指的是一個固定大小的區域或範圍,像是一個滑動的區間,透過這個窗口就可以一次只處理這個範圍內的元素。
    滑動:窗口會從資料集的開頭開始,每次移動一個元素,進行處理。每當窗口移動一次,我們更新相關的資訊。

  • 模數運算在圓形矩陣的運用
    假設有一個長度為 n = 6 的陣列:
    int[] nums = {1, 0, 1, 0, 1, 0}; // 長度為 6
    當我們想要模擬「圓形」時,可以使用模數運算來讓陣列的索引繞回開頭。
    當 i = 6 時,我們其實是想要訪問索引 0,這時可以 6 % 6 = 0。

  • 最大值Integer.MAX_VALUE
    是一個靜態常數,代表整數範圍內的最大值,也就是 2^31 - 1,數值為 2147483647。
    比較:常用來在尋找最小值的過程中設置初始值。例如,在找最小交換次數的時候,將minSwaps初始化為一個非常大的值,這樣第一次比較時,任何值都會比它小。
    溢出處理:在某些情況下,當需要處理可能會超出int範圍的數值運算時,Integer.MAX_VALUE 可用來檢查是否超出限制。


class Solution {
    public int minSwaps(int[] nums) {
        int n = nums.length;

        // 計算1的總數
        int Ones = 0;
        for (int num : nums) {
            Ones += num;
        }
        
        // 陣列中沒有1的情況
        if (Ones == 0) {
            return 0;
        }

        // 利用滑動窗口找到包含最少0的窗口
        int minSwaps = Integer.MAX_VALUE;
        int zero = 0;

        // 初始化第一個窗口(窗口大小等於 Ones)
        for (int i = 0; i < Ones; i++) {
            if (nums[i] == 0) {
                zero ++;
            }
        }
        minSwaps = zero;

        // 滑動窗口:從第Ones個元素開始遍歷
        for (int i = Ones; i < n + Ones; i++) {
            // 移動窗口,處理圓形陣列的邊界:% n
            if (nums[i % n] == 0) {
                zero++;
            }
            if (nums[(i - Ones) % n] == 0) {
                zero--;
            }
            minSwaps = Math.min(minSwaps, zero);
        }
        return minSwaps;
    }
}

結束這回合!!總之學到了新東西!!!
https://ithelp.ithome.com.tw/upload/images/20241013/20169432ajzkFgvqgN.png


上一篇
day-27[medium.2380]time needed to rearrange a binary string
下一篇
day-29[medium.2044]Count Number of Maximum Bitwise-OR Subsets
系列文
轉生理工組後從零開始的leetcode刷題30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言