1151 最少交換次數來組合所有的 1

2021-09-26 02:52:58 字數 1296 閱讀 1238

給出乙個二進位制陣列 data,你需要通過交換位置,將陣列中 任何位置 上的 1 組合到一起,並返回所有可能中所需 最少的交換次數。

示例 1:

輸入:[1,0,1,0,1]

輸出:1

解釋:

有三種可能的方法可以把所有的 1 組合在一起:

[1,1,1,0,0],交換 1 次;

[0,1,1,1,0],交換 2 次;

[0,0,1,1,1],交換 1 次。

所以最少的交換次數為 1。

示例 2:

輸入:[0,0,0,1,0]

輸出:0

解釋:

由於陣列中只有乙個 1,所以不需要交換。

示例 3:

輸入:[1,0,1,0,1,0,0,1,1,0,1]

輸出:3

解釋:交換 3 次,一種可行的只用 3 次交換的解決方案是 [0,0,0,0,0,1,1,1,1,1,1]。

1 <= data.length <= 10^5

0 <= data[i] <= 1

思路:考慮兩種寫法,借助滑動視窗處理。

第一種:首先統計出陣列中1的個數,作為滑動視窗的長度,之後再原陣列中找到某個視窗中包含1個數最多的視窗,視窗大小減最大值就是結果。

陣列大小為1e5,所以處理滑動視窗的時候要注意下,用乙個cnt變數統計每個視窗中1的個數,該視窗前乙個值若為1,cnt–,該視窗後乙個值若為1,cnt++,如此一直往後推即可。

class

solution

}int cnt =0;

for(

int i =

0; i < num1; i++)}

int maxm = cnt;

for(

int i =

1; i <= data.

size()

- num1; i++)if

(data[i+num1-1]

==1) maxm =

max(maxm, cnt);}

return num1 - maxm;}}

;

class

solution

int m = s[n]

;int res = n;

for(

int i = m; i <= n; i++

)return res;}}

;

2134 最少交換次數來組合所有的 1 II

交換 定義為選中乙個陣列中的兩個 互不相同 的位置並交換二者的值。環形 陣列是乙個陣列,可以認為 第乙個 元素和 最後乙個 元素 相鄰 給你乙個 二進位制環形 陣列 nums 返回在 任意位置 將陣列中的所有 1 聚集在一起需要的最少交換次數。class solution if ones 1 int...

最少交換次數

第乙個問題 現在想通過交換相鄰元素的操作把乙個給定序列交換成有序,最少需要交換的次數是多少?比如3 1 2 4 5需要最少交換2次。答案 需要交換的最少次數為該序列的逆序數。證明 可以先將最大數交換到最後,由於是相鄰兩個數交換,需要交換的次數為最大數後面的數的個數 可以看做是最大數的逆序數 然後,交...

最少交換次數

bfs,折半搜尋,因為直接搜大概有 12 13?因為每個狀態都會擴充套件出m種狀態大概是 12 13,然而可以折半搜尋,只搜一半,狀態數變成 12 7可以接受,但是事實上極限資料要跑很長很長時間,據說正解是啟發式搜尋?沒學過 include include include include inclu...