【每日刷题】Day60

【每日刷题】Day60

🥕个人主页:开敲🍉

🔥所属专栏:每日刷题🍍

🌼文章目录🌼

1. 1122. 数组的相对排序 - 力扣(LeetCode)

2. 419. 甲板上的战舰 - 力扣(LeetCode)

3. 513. 找树左下角的值 - 力扣(LeetCode)

1. 1122. 数组的相对排序 - 力扣(LeetCode)

//思路:哈希+记数。

int* relativeSortArray(int* arr1, int arr1Size, int* arr2, int arr2Size, int* returnSize)

{

    int* ans = (int*)malloc(sizeof(int)*1001);

    int count = 0;

    int hash[1001] = {0};

    int max = arr1[0];

    for(int i = 0;i<arr1Size;i++)

    {

        hash[arr1[i]]+=1;

        if(arr1[i]>max)

            max = arr1[i];

    }

    for(int i = 0;i<arr2Size;i++)

    {

        while(hash[arr2[i]]--)

        {

            ans[count++] = arr2[i];

        }

    }

    for(int i = 0;i<=max;i++)

    {

        while(hash[i]>0)

        {

            hash[i]--;

            ans[count++] = i;

        }

    }

    *returnSize = count;

    return ans;

}

2. 419. 甲板上的战舰 - 力扣(LeetCode)

//思路:遍历判断。本题来源于游戏《海战棋》(海战棋 (网络游戏) (battleship-game.org))

//每个相邻的X组成战舰,战舰只能横着或者竖着,比如:

//如上图,下图则是错误的形式。

//知道了规则后我们着手实现代码。

//首先,判断战舰的数量肯定是判断‘X’的数量,但是不是每个X都有效,如下图

//那么如何判断是否为无效‘X’呢,很简单,只需要判断当前位置上一个是否为‘X’即可,如果当前位置上一个为‘X’,则需要将当前位置及当前位置后面的以及下面的相邻的为‘X’的位置改为‘.’。

int countBattleships(char** board, int boardSize, int* boardColSize)

{

    int ans = 0;

    for(int i = 0;i<boardSize;i++)

    {

        for(int j = 0;j<*boardColSize;j++)

        {

            if(board[i][j]=='X')//判断当前位置是否为‘X’

            {

                ans++;//为X记为一艘战舰,当前位置记为战舰头

                int x = j+1;//将与战舰头相连的战舰身以及无法组成战舰的无效‘X’改为‘.’

                while(x<*boardColSize&&board[i][x]=='X')

                {

                    board[i][x] = 'x';

                    x++;

                }

                int y = i+1;

                while(y<boardSize&&board[y][j]=='X')

                {

                    board[y][j] = '.';

                    y++;

                }

            }

        }

    }

    return ans;

}

3. 513. 找树左下角的值 - 力扣(LeetCode)

//思路:深度优先遍历。算出二叉树的最大深度(用于判断是否遍历到了最第层),深度优先遍历二叉树,遍历到叶子结点时,判断是否是最底层,不是则继续遍历二叉树。

//判断是否为叶子结点

bool IsLeafNode(struct TreeNode* root)

{

    return !root->left&&!root->right;

}

//求二叉树最大深度

int BinaryTreeHigh(struct TreeNode* root)

{

    if(!root)

        return 0;

    int HighLeft = BinaryTreeHigh(root->left);

    int HighRight = BinaryTreeHigh(root->right);

    return 1+(HighLeft>HighRight?HighLeft:HighRight);

}

double FindVal(struct TreeNode* root,int high)

{

    if(!root||(IsLeafNode(root)&&high!=1))

        return INT_MAX+10;//不满足则返回一个>INT_MAX的值

    if(IsLeafNode(root)&&high==1)

        return root->val;//满足则返回结点值

    double left = FindVal(root->left,high-1);

    if(left!=(INT_MAX+10))//如果已经找到了则不用继续遍历

        return left;

    return FindVal(root->right,high-1);//否则继续遍历

}

int findBottomLeftValue(struct TreeNode* root)

{

    int high = BinaryTreeHigh(root);

    return (int)FindVal(root,high);

}

  • 23
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值