860.柠檬水找零
public class Solution {
public bool LemonadeChange(int[] bills) {
int cnt5=0;
int cnt10=0;
for(int i=0;i<bills.Length;i++)
{
if(bills[i]==5)
{
cnt5++;
}
else if(bills[i]==10)
{
cnt5--;
cnt10++;
}
else if(cnt10!=0)
{
cnt5--;
cnt10--;
}else
{
cnt5-=3;
}
if(cnt5<0)
{
return false;
}
}
return true;
}
}
该题直接分情况讨论,收到五元、十元、二十元三种情况,分别对五元和十元两种面值计数,二十元则有两种补发十元不等于零则一张五一张十,若等于零直接三张无,最终如果五元数量为负数则说明补不起所以就返回False,否则为True。
406.根据身高重建队列
public class Solution {
public int[][] ReconstructQueue(int[][] people) {
Array.Sort(people,(a,b)=>{
if(a[0]!=b[0])
{
return b[0]-a[0];
}else
{
return a[1]-b[1];
}
});
var ans=new List<int[]>();
for(int i=0;i<people.Length;i++)
{
int[] p=people[i];
ans.Insert(p[1],p);
}
return ans.ToArray();
}
}
该题只能一次一个条件的来,首先按照身高由大到小进行一个排序,第二趟则按照比他身高高的人数依次向前进行一个插入操作,这样就保证了他前面的人都比他高。
452.用最少数量的箭引爆气球
public class Solution {
public int FindMinArrowShots(int[][] points) {
int cnt = 1;
if(points.Length==0)
{
return 0;
}
Array.Sort(points,(a,b)=>{
if(a[1]==b[1])
{
return 0;
}else
return a[1]>b[1]?1:-1;
});
for(int i=1;i<points.Length;i++)
{
if(points[i][0]>points[i-1][1])
{
cnt++;
}else
{
points[i][1]=Math.Min(points[i][1],points[i-1][1]);
}
}
return cnt;
}
}
对于本题来说首先应该对区间起点进行从小到大的排序,然后比较当前区间的起点和上一个区间终点的关系(重叠区间),如果重叠Cnt不变,不重叠则Cnt++,如果重叠需要更新当前射箭的终点,比较当前终点和上一个区间的终点,谁小取谁,依次往后遍历,最终返回Cnt数值。