什么时候才能做到徒手bug free…
插入n个1,不能存在任意两个连续的1。
第一反应就是遍历一遍然后判断满足 nums[i] == 0 && nums[i-1]!=1 && nums[i+1]!=1 这样的条件的i,将该nums[i]赋值为1。但是首尾会出现数组访问越界的问题。由于题目没有说对空间的要求。。故考虑copy一个数组,将原数组首尾各添加一个0(不影响操作),然后遍历1-flowerbedSize即可:
bool canPlaceFlowers(int* flowerbed, int flowerbedSize, int n) {
int * tmpArr = (int *)malloc(sizeof(int)*(flowerbedSize+2));
if(!tmpArr)return;
tmpArr[0] = 0;
tmpArr[flowerbedSize+1] = 0;
for(int i=1;i<flowerbedSize+1;i++)
tmpArr[i] = flowerbed[i-1];
for(int i=1;i<flowerbedSize+1;i++)
{
if(tmpArr[i]==0 && tmpArr[i-1]!=1 && tmpArr[i+1]!=1)
{
tmpArr[i] = 1;
n--;
}
}
free(tmpArr);
return (n>0)?false:true;
}
空间复杂度O(N)看着还是不爽。。改进一下,总之原则就是处理好首尾两个即可:
bool canPlaceFlowers(int* flowerbed, int flowerbedSize, int n) {
int prev = 0,next = 0;
for(int i=0;i<flowerbedSize;i++)
{
/*类似于前面copy数组将首尾赋值0*/
prev = (i==0)?0:flowerbed[i-1];
next = (i==flowerbedSize-1)?0:flowerbed[i+1];
if(flowerbed[i]==0 && prev!=1 && next!=1)
{
flowerbed[i] = 1;
n--;
}
}
return (n>0)?false:true;
}
代码还是要写好看呀~