leetcode-Can Place Flowers

来源:互联网 发布:hd网络是什么意思啊 编辑:程序博客网 时间:2024/06/05 00:52

什么时候才能做到徒手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;}

代码还是要写好看呀~

原创粉丝点击