2019-11-06

今天开始刷leetcode中文版,为什么,可能是因为无聊吧。按照顺序,全程使用C语言(不排除真香警告)。

第一题,找不同

这个题比较简单,不过还是击败了100% 2333。

int game(int* guess, int guessSize, int* answer, int answerSize){
    return (guess[0]==answer[0])+(guess[1]==answer[1])+(guess[2]==answer[2]);
}

第二题,机器人大冒险

我一开始的思路是:对于每个位置,检测是否碰撞。结果,我第一版提交的代码遇见了超时。第一版代码如下:

bool arrived(int currentX, int currentY, int targetX, int targetY ){
    if(currentX==targetX&&currentY==targetY)
        return true;
    return false;    
}

bool collision(int currentX, int currentY, int** obstacles, int obstaclesSize){
    int i=0,j=0;
    for(i=0;i<obstaclesSize;i++){
        if(currentX==obstacles[i][0]&&currentY==obstacles[i][1])
            return true;
    }
    return false;
}

bool robot(char* command, int** obstacles, int obstaclesSize, int* obstaclesColSize, int x, int y){
    int i=0;
    int currentX=0,currentY=0;
    int command_length=strlen(command);//指令数组长度获取
    int command_index=0;
    while(true){
        if(arrived(currentX,currentY,x,y))
            return true;
        if(currentX>x||currentY>y)
            return false;
        if(collision(currentX, currentY, obstacles, obstaclesSize))
            return false;
        command_index=i%command_length;
        if(command[command_index]=='U')
            currentY++;
        else
           currentX++;
        i++;
    } 
}

很明显,第一版代码的复杂度是O(n^2)。在第二版中我稍稍修改了检测碰撞的函数。我去掉了一些第二版代码如下:

void move_tail(int i, int** obstacles, int *obstaclesSize){
    int x=0,y=0;
    x=obstacles[i][0];
    y=obstacles[i][1];
    obstacles[i][0]=obstacles[(*obstaclesSize)-1][0];
    obstacles[i][1]=obstacles[(*obstaclesSize)-1][1];
    obstacles[(*obstaclesSize)-1][0]=x;
    obstacles[(*obstaclesSize)-1][1]=y; 
}

bool arrived(int currentX, int currentY, int targetX, int targetY ){
    if(currentX==targetX&&currentY==targetY)  
        return true;
    return false;    
}

bool collision(int currentX, int currentY, int** obstacles, int *obstaclesSize){
    int i=0,j=0;

    for(i=0;i<(*obstaclesSize);i++){
        if(currentX==obstacles[i][0]&&currentY==obstacles[i][1])
            return true;
        if(currentX>obstacles[i][0]||currentY>obstacles[i][1]){
            move_tail(i, obstacles,obstaclesSize);
            (*obstaclesSize)--;
        }
    }
    return false;
}

bool robot(char* command, int** obstacles, int obstaclesSize, int* obstaclesColSize, int x, int y){
    int i=0;
    int currentX=0,currentY=0;
    int command_length=strlen(command);//指令数组长度获取
    int command_index=0;
    while(true){
        if(arrived(currentX,currentY,x,y))
            return true;
        if(currentX>x||currentY>y)
            return false;
        if(collision(currentX, currentY, obstacles, &obstaclesSize))
            return false;
        command_index=i%command_length;
        if(command[command_index]=='U')
            currentY++;
        else
           currentX++;
        i++;
    } 
}

然而还是超时。看来,我的第一个思路是不适合的。
第三版:

bool robot(char * command, int** obstacles, int obstaclesSize, int* obstaclesColSize, int x, int y){
    int i=0;
    int currentX=0,currentY=0;
    int command_index=0;
    //命令长度
    int command_length=strlen(command);
    //两个数组,分别存放x和y变动时对应的y和x值(视作两个函数)
    int* position_x_array=(int *)calloc(sizeof(int),x+1);
    int* position_y_array=(int *)calloc(sizeof(int),y+1);

    while(true){
        command_index=i%command_length;
        if(command[command_index]=='U'){
            currentY++;
            if(currentY>y)
                break;
            position_y_array[currentY]=currentX;
        } 
        else{
            currentX++;
            if(currentX>x)
                break;
            position_x_array[currentX]=currentY;
        }
        i++;
    }
    
   
    if((position_x_array[x]!=y)&&(position_y_array[y]!=x))
        return false;
    
    for(i=0;i<obstaclesSize;i++){
        if(obstacles[i][0]>x||obstacles[i][1]>y)
            continue;
        if(position_x_array[obstacles[i][0]]==obstacles[i][1]||position_y_array[obstacles[i][1]]==obstacles[i][0])
            return false;
    }
    return true;
}

非主流方法

最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容