@ 代码随想录算法训练营第5周(C语言)|Day32(贪心算法)
Day32、贪心算法(包含题目 122.买卖股票的最佳时机II 55. 跳跃游戏 45.跳跃游戏II )
122.买卖股票的最佳时机II
题目描述
给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。
设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。
注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
题目解答
int maxProfit(int* prices, int pricesSize) {
int res=0;
for(int i=1;i<pricesSize;i++){
if(prices[i]-prices[i-1]>0){
res+=prices[i]-prices[i-1];
}
}
return res;
}
也可以用动态规划来做。
55. 跳跃游戏
题目描述
给定一个非负整数数组,你最初位于数组的第一个位置。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
判断你是否能够到达最后一个位置。
题目解答
bool iscovered(int *nums,int i){
for(int j=0;j<i;j++){
if(nums[j]+j>i){
return true;
}
}
return false;
}
bool canJump(int* nums, int numsSize) {
if(numsSize==1){
return true;
}
for(int i=0;i<numsSize-1;i++){
if(nums[i]==0){
if(iscovered(nums,i)==false){
return false;
}else{
continue;
}
}
}
return true;
}
bool canJump(int* nums, int numsSize) {
int cover=0;
for(int i=0;i<=cover;i++){
cover=i+nums[i]>cover?i+nums[i]:cover;
if(cover>=numsSize-1){
return true;
}
}
return false;
}
题目总结
手搓了一个版本(没用贪心)。
45.跳跃游戏II
题目描述
给定一个非负整数数组,你最初位于数组的第一个位置。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
你的目标是使用最少的跳跃次数到达数组的最后一个位置。
题目解答
int jump(int* nums, int numsSize) {
if(numsSize==1){
return 0;
}
int cur=0;
int res=0;
int nextcur=0;
for(int i=0;i<numsSize;i++){
nextcur=nextcur>(i+nums[i])?nextcur:(i+nums[i]);
if(cur==i){
if(cur!=numsSize){
cur=nextcur;
res++;
if(cur>=numsSize-1){
break;
}
}else{
break;
}
}
}
return res;
}
题目总结
每次走最大的cover,就能走最短的步数。