【每日刷题】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;
}