目录
柠檬⽔找零(easy)
题目解析
1.题目链接:. - 力扣(LeetCode)
2.题目描述
讲解算法原理
解法(贪⼼):
贪⼼策略:
分情况讨论:
a. 遇到 5 元钱,直接收下;
b. 遇到 10 元钱,找零 5 元钱之后,收下;
c. 遇到 20 元钱:
i. 先尝试凑 10 + 5 的组合;
ii. 如果凑不出来,拼凑 5 + 5 + 5 的组合;
编写代码
c++算法代码:
class Solution
{
public:
bool lemonadeChange(vector<int>& bills)
{
int five = 0, ten = 0;
for(auto x : bills)
{
if(x == 5) five++; // 5 元:直接收下 else if(x == 10) // 10 元:找零 5 元 {
if(five == 0) return false;
five--; ten++;
}
else // 20 元:分情况讨论
{
if(ten && five) // 贪⼼
{
ten--; five--;
}
else if(five >= 3)
{
five -= 3;
}
else return false;
}
}
return true;
}
};
java算法代码:
class Solution
{
public boolean lemonadeChange(int[] bills)
{
int five = 0, ten = 0;
for(int x : bills)
{
if(x == 5) // 5 元:直接收下
{
five++;
}
else if(x == 10) // 10 元:找零 5 元 {
if(five == 0) return false;
five--; ten++;
}
else // 20 元:分情况讨论
{
if(five != 0 && ten != 0) // 贪⼼ {
five--; ten--;
}
else if(five >= 3)
{
five -= 3;
}
else return false;
}
}
return true;
}
}
将数组和减半的最少操作次数(medium)
题目解析
1.题目链接:. - 力扣(LeetCode)
2.题目描述
讲解算法原理
解法(贪⼼):
贪⼼策略:
a. 每次挑选出「当前」数组中「最⼤」的数,然后「减半」;b. 直到数组和减少到⾄少⼀半为⽌。
为了「快速」挑选出数组中最⼤的数,我们可以利⽤「堆」这个数据结构。
编写代码
c++算法代码:
class Solution
{
public:
int halveArray(vector<int>& nums)
{
priority_queue<double> heap; // 创建⼀个⼤根堆 double sum = 0.0;
for(int x : nums) // 把元素都丢进堆中,并求出累加和 {
heap.push(x);
sum += x;
}
sum /= 2.0; // 先算出⽬标和
int count = 0;
while(sum > 0) // 依次取出堆顶元素减半,直到减到之前的⼀半以下 {
double t = heap.top() / 2.0;
heap.pop();
sum -= t;
count++;
heap.push(t);
}
return count;
}
};
java算法代码:
class Solution
{
public int halveArray(int[] nums)
{
// 创建⼀个⼤根堆
PriorityQueue<Double> heap = new PriorityQueue<>((a, b) ->
b.compareTo(a));
double sum = 0.0;
for(int x : nums) // 把元素都丢进堆中,并求出累加和
{
heap.offer((double)x);
sum += x;
}
sum /= 2.0; // 先算出⽬标和
int count = 0;
while(sum > 0) // 依次取出堆顶元素减半,直到减到之前的⼀半以下 {
double t = heap.poll() / 2.0;
sum -= t;
count++;
heap.offer(t);
}
return count;
}
}