2023年12月7日 星期四

[1004] Max Consecutive Ones III

(看完解答以後XD) 把 if else 好好拆開的寫可以,但比較醜!
覺得完全卡住QQ
sliding window 的左邊跟右邊長這樣子:
右邊一路往右加一,
(1)如果是 零 -> 假設k 還有剩,就往右加。k 個零不夠了,那就左邊開始往右移動,直到扣掉一個零
(2) 如果是一,無痛往右加XD
每輪都看目前的window,如果超過max 則更新max ,最後回傳max。

看到最短的寫法!可是我應該想不到這樣寫 XD
好討厭喔別人真的好聰明QQ 意思就是反正最長就是這麼長!!!不要管它零長在哪裡
一個window從頭走到尾,總之就是算裡面的零會不會超過k個,保留一個連續的"含k個零在裡面的連續1",所以在for裡面,當新進來的0超過k的時候,總之左邊就是往右移一個,若是它剛好是0,就把k的餘裕加一,不需要去一路走到"左邊的下一個零"這樣。(拿掉1的時候,有種用一換零的概念?!還是好抽象喔我要再想一下Orz 為什麼可以這樣寫XD)

int longestOnes(int* nums, int numsSize, int k) {
int i,j;
for (i=0,j=0; j <numsSize;j++)
{
if (nums[j]==0)
k--;
if (k<0 && nums[i++]==0)
k++;
}
return (j-i);
}

稍微修過一下的版本:
int longestOnes(int* nums, int numsSize, int k) {
int i,j, zero=0;
int max = 0;
for (i=0,j=0;i<=j && j <numsSize;j++)
{
if (nums[j]==0)
{
if (zero +1 <=k)
zero++;
else
{
while (nums[i]==1 && i<j)
i++;
i++;
}
}
if ((j-i)+1 > max)
max = (j-i)+1;

}
return max;
}

下面是超級原始版:
int longestOnes(int* nums, int numsSize, int k) {
int i,j, zero=0;
int max = 0;
for (i=0,j=0;i<=j && j <numsSize;)
{
if (nums[j]==0)
{
if (zero +1 <=k)
{
zero++;
j++;
}
else
{
while (nums[i]!=0 && i<j)
i++;
i++;
j++;
}
}
else
{
j++;
}
if ((j-i)> max)
max = (j-i);

}
return max;
}

沒有留言:

張貼留言