455 分发饼干
假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。
对每个孩子 i,都有一个胃口值 g[i],这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j,都有一个尺寸 s[j] 。如果 s[j] >= g[i],我们可以将这个饼干 j 分配给孩子 i ,这个孩子会得到满足。你的目标是尽可能满足越多数量的孩子,并输出这个最大数值。
来源:力扣(LeetCode)
void quicksort(int *k,int low,int high);
int findContentChildren(int* g, int gSize, int* s, int sSize){
int pivot ;
int low,high;
int i = 0;
int j = 0;
quicksort(g,low,high);//快速排序
quicksort(s,low,high);
for(;j <= sSize && i <= gSize;)
{
if(s[j] >= g[i])
{
j++;
i++;
}
else
{
j++;
}
}
return i;
}
int partition(int *d,int low,int high)//分割函数得pivot(第一趟排序)
{
int *k;
int pivot;
k = d;
pivot = k[0];
pivot = k[low];
if (low == high)//只有一个数
{
return low;
}
else{
for(;low < high;)
{
for(;k[high] >= pivot;)
{
high--;
}
k[low] = k[high];
for(;k[low] <= pivot;)
{
low++;
}
k[high] = k[low];
}
k[low] = k[0];//记录中间的数
return low;
}
}
void quicksort(int *k,int low,int high)
{
int pivot;
pivot = partition(k, low, high);
quicksort(k, low, pivot-1);//左边递归
quicksort(k, pivot+1, high);//右边递归
}
一支弓箭可以沿着 x 轴从不同点完全垂直地射出。在坐标 x 处射出一支箭,若有一个气球的直径的开始和结束坐标为 xstart,xend, 且满足 xstart ≤ x ≤ xend,则该气球会被引爆。可以射出的弓箭的数量没有限制。 弓箭一旦被射出之后,可以无限地前进。我们想找到使得所有气球全部被引爆,所需的弓箭的最小数量。
给你一个数组 points ,其中 points [i] = [xstart,xend] ,返回引爆所有气球所必须射出的最小弓箭数。
来源:力扣(LeetCode)
int findMinArrowShots(int** points, int pointsSize, int* pointsColSize){
int count=0;//箭数
int i;
int j = 2;
int points[5][3] ={{10,16},{2,8},{1,6},{7,12}};
points = sort(points,pointsSize)//按右边界排序
for(i = 1; i <= pointsSize;i = j+1)
{
for (i = 1 ;point[i][1] >= points[j][0] && j <= pointsize;)
{
j++;//气球数
}
count++;
}
}
void sort(int **d, int pointsSize)//冒泡排序
{
int i = 1;
int j = 0;
int temp1,temp2;
int m = pointsSize;
int flag =1;//记录本轮有没有发生交换,如果没有发生就不用继续排了
for (;m>0 && flag = 1;)
{
for(i = 1; i <= m; i++)
{
flag = 0;
if (d[i][1] > d[i+1][1])//前一个比后一个大交换
{
flag = 1;
temp1 = d[i+1][0];
temp2 = d[i+1][1];
d[i+1][0] = d[i][0];
d[i+1][1] = d[i+1][1];
d[i][0] = temp1;
d[i][1] = temp2;
}
m--;//
}
}
}
322 零钱问题
给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。
你可以认为每种硬币的数量是无限的。
来源:力扣(LeetCode)
#include
int coinChange(int* coins, int coinsSize, int amount) {
int i;
coins[3] ={ 1,2,5 };
amount = 11;
int a = amount;
int coinsSize = 0;
sort(coins, 0, i);
for (i = 2; i >= 0; i--)//最大的取不了则取下一个次大的
{
for (; coins[i] < a; coinsSize++)//贪心,每次都取最大的
{
a = a - coins[i];
}
}
if (a = 0)
return coinsSize;
else
{
return -1;
}
}
void sort(int* coins, int low, int high)//快速排序
{
int pivotloc;
if (low < high)
{
pivotloc = partition(coins, low, high);
sort(coins, low, pivotloc - 1);
sort(coins, pivotloc + 1, high);
}
}
int partition(int* coins, int low, int high)
{
int pivot = coins[low];
for (; low < high;)
{
for (; low < high && coins[high] > pivot;)
{
high--;
}
coins[low] = coins[high];
for (; low < high && coins[low] < pivot;)
{
low++;
}
coins[high] = coins[low];
}
return low;
}
时间复杂度:快排O(nlogn)+贪心O(n^2)
1217 玩筹码
数轴上放置了一些筹码,每个筹码的位置存在数组 chips 当中。
你可以对 任何筹码 执行下面两种操作之一(不限操作次数,0 次也可以):
将第 i 个筹码向左或者右移动 2 个单位,代价为 0。
将第 i 个筹码向左或者右移动 1 个单位,代价为 1。
最开始的时候,同一位置上也可能放着两个或者更多的筹码。
返回将所有筹码移动到同一位置(任意位置)上所需要的最小代价。
来源:力扣(LeetCode)
int minCostToMoveChips(int* position, int positionSize){
int i;
int odd;//奇数
int even;//偶数
for(i = 1 ; i <= positionSize; i++)//分别计算奇偶次数的个数
{
if (position[i] % 2 = 0)//判断是否在偶数的位置上
{
even ++;
}
else
{
odd ++;
}
}
if(even < odd)//相当于把所有的奇偶位置的数分别移到1和2号位,看哪边小就把所有移到另一边(我认为贪心就是这里)
{
return even;
}
else
{
return odd;
}
}
时间复杂度O(n)
1217 玩筹码
给定一个非负整数数组,你最初位于数组的第一个位置。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
判断你是否能够到达最后一个位置。
来源:leetcode
#include
bool canJump(int* nums, int numsSize) {
int i = 0;
int max = nums[0];//记录能达到最远的位置
int sum;
if (numsSize == 1 || numsSize == 0)//有0个或者有1个数,直接true
{
return true;
}
for (i = 0; i < numsSize; )//nums里面没有0,直接true
{
if (nums[i] != 0)
{
i++;
}
}
if (i = numsSize - 1)
{
return true;
}
for (i = 1; i <= numsSize; i++)//其他情况(贪心)以累加来算max可到达最远的距离
{
if (i < max)
{
if (i + nums[i] > max)
{
max = i + nums[i];
}
}
else
{
break;
}
}
return max >= numsSize ? true : false;//判断是否可到达终点
}
时间复杂度O(n)