会员题目 mark一下
题意:
给出一个二进制数组 data,你需要通过交换位置,将数组中 任何位置 上的 1 组合到一起,并返回所有可能中所需 最少的交换次数。
思路:
首先扫描整体数组统计1的个数,记为n,然后从头开始扫描大小为n的滑动窗口内1的个数,记为cnt,那么将不在窗口内的1全部聚集到当前滑动窗口的代价为n-cnt,统计每个窗口的n-cnt取最小值即为答案
int minSwaps(int []data){
int n=0;
if(data.length==0){
return 0;
}
for(int i=0;i<data.length;i++){
if(data[i]==1){
n++;
}
}
int l=0,r=0,cnt=0,ans=n;
for(r=0;r<n;r++){
if(data[r]==1){
cnt++;
}
}
ans=Math.min(n-cnt,ans);
while(r<data.length){
if(data[r]==1){
cnt++;
}
r++;
if(data[l]==1){
cnt--;
}
l++;
ans=Math.min(n-cnt,ans);
}
return ans;
}