自学内容网 自学内容网

【每日刷题】Day11

【每日刷题】Day11

🥕个人主页:开敲🍉

🔥所属专栏:每日刷题🍍

目录

1. 860. 柠檬水找零 - 力扣(LeetCode)

2. 976. 三角形的最大周长 - 力扣(LeetCode)

3. 1232. 缀点成线 - 力扣(LeetCode)

1. 860. 柠檬水找零 - 力扣(LeetCode)

//思路:这题实际上只需要判断5元钱的剩余数。

bool lemonadeChange(int* bills, int billsSize)

{

    int i = 0;

    int five = 0;//用于记录收到5元的数量

    int ten = 0;//用于记录收到10元的数量

    for(i = 0;i<billsSize;i++)

    {

        if(bills[i]==5)

        {

            five++;//收到5元,five++

        }

        else if(bills[i]==10)

        {

            ten++;//收到10元需要找回顾客5元,多一张10元

            five--;

        }

        else

        {

            if(ten>0)

            {

                ten--;//收到20元时,需要判断收到的10元个数,如果不为0,则可以用10元与5元结合找回给顾客

                five--;

            }

            else

            {

                five-=3;//否则只能找3张5元给顾客

            }

        }

        if(five<0)

        {

            return false;//如果最后5元数量小于0了,说明有顾客无法正确找零

        }

    }

    return true;

}

2. 976. 三角形的最大周长 - 力扣(LeetCode)

//思路:将数组先排为降序,然后从头开始三个三个遍历,因为是降序,所以需要让i+2和i+1的和大于i才能成为三角形。并且,因为是降序,所以第一个找到的能成为三角形的数据组一定是最大的

int largestPerimeter(int* nums, int numsSize)

{

    int i = 0;

    int j = 0;

    for(i = 0;i<numsSize-1;i++)

    {

        for(j = 0;j<numsSize-i-1;j++)

        {

            if(nums[j]<nums[j+1])

            {

                int tmp = nums[j];

                nums[j] = nums[j+1];//使用冒泡排序(这里可以有更好的排序算法)将数组排为降序

                nums[j+1] = tmp;

            }

        }

    }

    for(i = 0;i<numsSize-2;i++)

    {

        if(nums[i+2]+nums[i+1]>nums[i])

        {

            return nums[i]+nums[i+1]+nums[i+2];//只要找到一个能成为三角形的数据组直接返回,一定是最大的

        }

    }

    return 0;

}

3. 1232. 缀点成线 - 力扣(LeetCode)

//思路:两点确定一条直线。将第一个点移回原点,后面的点根据第一个点的位移情况相应地位移;再根据原点和第二个点创建一条直线,将后面点地x、y带入方程中,通过判断方程是否有解来判断该点是否在直线上。需要注意地是,这里我们需要考虑直线平行于x、y轴的情况。

bool checkStraightLine(int** coordinates, int coordinatesSize, int* coordinatesColSize)

{

    int i = 0;

    int flag = 1;//用于判断方程是否有解

    int flag1 = 1;//用于判断直线是否平行于y轴

    int flag2 = 1;//用于判断直线是否平行于x轴

    int equ = 0;//方程

    int firstx = coordinates[0][0];//记录第一个点的x坐标,因为后面会改变第一个点的x、y坐标,因此这里需要记录初始值

    int firsty = coordinates[0][1];//记录第一个点的y坐标

    for(i = 0;i<coordinatesSize;i++)//将第一个点移动到原点,并相应移动后面的点

    {

        coordinates[i][0]-= firstx;

        coordinates[i][1]-= firsty;

    }

    for(i = 0;i<coordinatesSize-1;i++)//判断直线是否平行于y轴

    {

        if(coordinates[i][0]!=coordinates[i+1][0])

        {

            flag1 = 0;

        }

    }

    for(i = 0;i<coordinatesSize-1;i++)//判断直线是否平行于x轴

    {

        if(coordinates[i][1]!=coordinates[i+1][1])

        {

            flag2 = 0;

        }

    }

    if(flag1)//如果flag1不为0,则说明直线平行于y轴,直接返回true

    {

        return true;

    }

    if(flag2)//如果flag2不为0,则说明直线平行于x轴,直接返回true

    {

        return true;

    }

    for(i = 2;i<coordinatesSize;i++)//直线不平行于x轴也不平行于y轴,则通过方程判断每个点是否都在给定直线上

    {

        equ = ((coordinates[1][1]*coordinates[i][0])-(coordinates[1][0]*coordinates[i][1]));

        if(equ!=0)

        {

            flag = 0;

            break;

        }

    }

    if(flag)//如果flag不为0,则说明每个点都在直线上,返回true

    {

        return true;

    }

    return false;

}


原文地址:https://blog.csdn.net/2301_78022459/article/details/137690588

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!