給出乙個二進位制陣列 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...