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都相鄰所需的最少交換次數。
我的解題思路:
滑動窗口
窗口:這裡的窗口指的是一個固定大小的區域或範圍,像是一個滑動的區間,透過這個窗口就可以一次只處理這個範圍內的元素。
滑動:窗口會從資料集的開頭開始,每次移動一個元素,進行處理。每當窗口移動一次,我們更新相關的資訊。
模數運算在圓形矩陣的運用
假設有一個長度為 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;
}
}
結束這回合!!總之學到了新東西!!!