国科大计算机算法分析与设计3——贪心算法
创始人
2025-06-01 17:20:44

写在前面

国科大计算机算法分析与设计中贪心算法部分,主要是一些作业题。这些题目也是贪心算法方面比较经典的题目。贪心算法在经典算法里说简单简单,因为你看到那个算法之后,好像不需要怎么想就能明白,不像动态规划算法还需要理解。但是说难也难,因为这好像是很灵性的一种算法,动态规划算法还算有迹可循,多步决策,但是这个贪心好像蛮不讲理,想到了就是想到了,没想到就不知道怎么想到了。
听老师说,国外教材中动态规划是在贪心之前讲的,因为贪心就是那么不讲理,解释一个算法不难,但是解释怎么想到这个算法比较难。可能需要知识积累和沉淀吧。

作业1:填坑问题

The given string S is represented by “x” and “.”, “x” represents a pit, “.” represents a normal road. The cost of filling k consecutive pits is k+1, please obtain the maximum normal road ( It can be non-continuous. ) with budget M.
Input: S = “xxx…xxxx…xxxxx”, M = 11
Output: 16
解释:可以填中间4个×,需要5座桥,再填最后5个×,需要6座桥,正好11座桥,而形成的通路就是4+5,再加上已经有的3+4,总数就是16。
解答:x/(x+1)是一个递增函数,因此优先选择长的“x”串。

def fix(S, M):res = 0S = [len(s) for s in S.split(‘.’)]S.sort(reserve=True)for s in S:if M>s+1:res += sreturn res

时间复杂度O(nlogn),空间复杂度O(1)。

作业2:重新排列数字

在这里插入图片描述
解答:任意2个数字x和y,如果拼起来”xy”比“yx”要小就将x放在y前面;否则将y放在x前面。

sort(nums.begin(), nums.end(), [](const int &x, const int &y) {int xy = stoi(to_string(x) + to_string(y));int yx = stoi(to_string(y) + to_string(x));return xy < yx;
});
string ret = "";
for (auto i: nums)ret += to_string(i);
return ret;

时间复杂度:排序算法的时间复杂度,O(nlogn)

作业3:会议室时间

There are n meetings, and the start time and end time of i-th meeting are si and ei. Please design a greedy algorithm to find the minimum number of meeting rooms required to arrange all meetings.
Input: [ [0, 20], [15, 20], [20, 23], [25, 30], [15, 25] ]
Output: 3
解答:对于每一个会议,它的结束时间是要大于开始时间的,假设从开始时间遍历到第k个会议,也就是到了begin_time[k]begin\_time[k]begin_time[k],那么在上一次遍历时,因为有while的循环,end_timeend\_timeend_time到了begin_time[k−1]begin\_time[k-1]begin_time[k−1],这是由end_timeend\_timeend_time的指针endroomendroomendroom保证的,那么在这次循环中就只会找begin_time[k−1]begin\_time[k-1]begin_time[k−1]到begin_time[k]begin\_time[k]begin_time[k]这一时间段结束的会议,那么每结束一个会议(因为每个会议的结束时间会大于开始时间,所以在这个时间段结束的会议,之前已经开始了,已经申请会议室了),该会议所在的会议室就会空闲,也就是freeroom会加1,因为每次遍历都是新开一个会议,所以需要一个新的会议室,如果有空闲会议室,就会申请空闲会议室,freeroom减1,没有空闲会议室,就会申请新的会议室room加1。这样遍历之后,所有会议的开始时间和结束时间都过了一遍,保证了该算法的完备性和正确性。
在这里插入图片描述

作业4:删除数字得到最大数

N is a non-negative integer, remove k digits from it to obtain a new number. Find the biggest
possible output number.
Input: N= 147128, k = 3
Output: 728
解答:删除k个数字后,保证剩下的数字最大,就需要我们从前往后删除k个最靠前的最小的数字,也就是希望尽可能留下来的数字近似“单调递减”,因此可以用单调栈来解决。具体来说,维护一个栈,按照从左向右的顺序逐个将数组元素push进栈中,当发现“新添加元素 > 栈顶元素”的时候,就将栈之前的元素pop出来,直至“新添加元素 < 栈顶元素”或者“删除总元素数达到k”为止。当遍历数组结束,留在栈中的元素就是最终我们要的结果。

string num = to_string(N)
vector stk;
for (char c: num) {while (!stk.empty() && stk.back() < c && k) {stk.pop_back();k--;}stk.push_back(c);
}
// 如果遇到某一段已经为单调递减,则之前pop掉的数字不足k
while (k--) {stk.pop_back();
}
string ret = "";
bool isLeadingZero = true;
for (int i = 0; i < stk.size(); i++) {if (isLeadingZero && stk[i] == '0')continue;isLeadingZero = false;ret += string(1, stk[i]);
}
return ret == "" ? "0": ret;

作业5:跳跃的最远位置

You are given an integer array nums. You are initially positioned at the array’s first index, and each element in the array represents your maximum jump length at that position.
Return “yes“ if you can reach the last index, or “no“ otherwise.
Input: nums = [2,3,1,1,4]
Output: “yes”
解答:遍历每个元素,记录可以到达的最远位置,如果本次可以到达更远,则更新最远位置。

class Solution: def canJump(self, nums: List[int]) -> bool: n, rightmost = len(nums), 0 for i in range(n): if i <= rightmost: rightmost = max(rightmost, i + nums[i]) if rightmost >= n - 1: return “yes“ return “no“ 

在这里插入图片描述
根据定义可以知道,在第k个位置的时候,k+nums[k]k+nums[k]k+nums[k]就代表了最远能够跳到的位置。k和k+nums[k]k+nums[k]k+nums[k]之间的位置都能达到。因此可以维护一个全局最大值max_mmax\_mmax_m,初始值为0,代表第0个位置可达。那么就计算0+nums[0]0+nums[0]0+nums[0],如果大于max_mmax\_mmax_m,就更新max_mmax\_mmax_m。因为nums数组里是有序的,因此可以从第0个位置开始往后计算max_mmax\_mmax_m,如果到第k个位置,发现k>max_mk>max\_mk>max_m,代表前k-1个位置都到达不了k,因为max_mmax\_mmax_m代表的是最远跳跃的位置,自然k+1,k+2,…,n-1的位置也到达不了。最终只需要比较max_mmax\_mmax_m和n-1的大小,如果大于n-1,则说明最远可以跳到n-1后面的位置,自然也能跳到n-1位置。因为是从前往后依次遍历的,这个算法是正确完备的。

作业6:交换两个数字使交换之后整个数最大

There is a number k and you can swap two digits at most once.
Please design a greedy algorithm to find the maximum value you can get.
Input: k = 39748
Output: 93748

解答:假设交换j,k位 (0≤j 在这里插入图片描述
在这里插入图片描述

作业7:划分k个子集使子集的差最大

Given an array of integers nums, divide them to k subsets, find a division scheme to maximize the
sum of the ranges (极差) (i.e., max - min) of all subsets.
Input: nums=[1, 2, 3, 4, 5], k = 3
Output: 6 (Optimal division scheme: {1, 5}, {2, 4}, {3}, sum of ranges: 4 + 2 + 0 = 6)
解答:为了获得最大极差的分组,应当让尽量小的数字和尽量大的数字分在一组,因此先将数组排序,然后从两端开始各选取1个元素组成一组,直到组数达到k加上剩下的元素数 = 组数的时候停止。

int dis = 0;
sort(nums.begin(), nums.end());
deque dq(nums.begin(), nums.end());
for (int i = k; i > 0; i--) {if (dq.size() > i) {int x1 = dq.pop_front();int x2 = dq.pop_back();dis += (x2 - x1);} else break;
}
return dis;

参考:贪心算法答疑ppt

相关内容

热门资讯

赛艇运动起源于哪个国家,奥运会... 赛艇运动起源于哪个国家目录赛艇运动起源于哪个国家奥运会传统比赛项目“赛艇”起源于欧洲哪个国家?赛艇运...
时空猎人首充号为什么充值会打折... 时空猎人首充号为什么充值会打折目录时空猎人首充号为什么充值会打折安卓手游充值折扣平台安卓手游充值折扣...
自助无人洗车机多少钱一台(24... 今天给各位分享自助无人洗车机多少钱一台的知识,其中也会对24小时自助共享洗车店要多少钱进行解释,如果...
白粥的做法,白粥的做法,白粥怎... 白粥的做法目录白粥的做法白粥的做法,白粥怎么做好吃,白粥的家常做法怎样煮白粥啊?白粥的做法 制...
包含抖音很火的叫爸爸是什么梗的... 今天给各位分享抖音很火的叫爸爸是什么梗的知识,其中也会对进行解释,如果能碰巧解决你现在面临的问题,别...
深圳欢乐谷的门票是怎么收费得,... 深圳欢乐谷的门票是怎么收费得目录深圳欢乐谷的门票是怎么收费得2022深圳欢乐谷万圣节老人免费吗?深圳...
阴阳师青蛙瓷器哪里多 极速百科... 阴阳师青蛙瓷器哪里多目录阴阳师青蛙瓷器哪里多阴阳师青蛙瓷器哪里多阴阳师的青蛙瓷器在哪个副本出现青蛙瓷...
一个G流量是多少MB流量,手机... 一个G流量是多少MB流量目录一个G流量是多少MB流量1G上网流量是多少MB一个G的流量等于多少MB一...
道台是什么官职 极速百科网 极... 道台是什么官职目录道台是什么官职道台是什么官职在清朝道台是个什么官“道台”是官职名吗道台是什么官职 ...
描写可怕的笑的成语笑得阴险可怕... 描写可怕的笑的成语笑得阴险可怕目录描写可怕的笑的成语笑得阴险可怕描写阴险的笑的成语表示阴险的笑有哪些...
贴春联的由来,贴春联的由来是什... 贴春联的由来目录贴春联的由来贴春联的由来是什么?贴春联的由来是什么?贴春联的由来 春联,又称对...
风雪夜归人的上一句是什么,柴门... 风雪夜归人的上一句是什么目录风雪夜归人的上一句是什么柴门闻犬吠,风雪夜归人。 上一句风雪夜归人 ;燕...
漂移是什么意思(摇杆漂移是什么... 本篇文章极速百科给大家谈谈漂移是什么意思,以及摇杆漂移是什么意思对应的知识点,希望对各位有所帮助,不...
车架号后四位是什么(车架号后四... 本篇文章极速百科给大家谈谈车架号后四位是什么,以及车架号后四位是什么在哪里看对应的知识点,希望对各位...
隐形眼镜基弧是什么意思,请问,... 隐形眼镜基弧是什么意思目录隐形眼镜基弧是什么意思请问,配隐形眼镜的时候要不要关注那个基弧?隐形眼镜基...
广西省崇左市属于什么市,祟左是... 广西省崇左市属于什么市目录广西省崇左市属于什么市祟左是地级市还是县级市崇左是南宁得直辖市吗 为什么区...
内衣尺码大小分类,内衣的型号分... 内衣尺码大小分类目录内衣尺码大小分类内衣的型号分哪几种?什么abc事什么意思?34、36是尺寸嘛?内...
几个防止卫生间反味小妙招,卫生... 几个防止卫生间反味小妙招目录几个防止卫生间反味小妙招卫生间反臭怎么办?卫生间怎么样防臭几个防止卫生间...
庄子中的成语和解释,四个出自《... 庄子中的成语和解释目录庄子中的成语和解释四个出自《庄子》的成语及解释《庄子》中的成语及解释(按篇目分...
怎么切翡翠原石(收玉石的联系方... 本篇文章极速百科给大家谈谈怎么切翡翠原石,以及收玉石的联系方式对应的知识点,希望对各位有所帮助,不要...
关于燕子的古诗,描写燕子的古诗... 关于燕子的古诗目录关于燕子的古诗描写燕子的古诗描写燕子的古诗有哪些?关于燕子的古诗关于燕子的古诗 ...
好巧不巧是什么意思,好巧不巧什... 好巧不巧是什么意思目录好巧不巧是什么意思好巧不巧什么意思?“无巧不巧”究竟何解?好巧不巧是什么意思好...
关东煮里面放什么配料啊,关东煮... 关东煮里面放什么配料啊目录关东煮里面放什么配料啊关东煮的配料关东煮需要哪些调味料呀?请问,关东煮都可...
极速进化满电出发!长安深蓝SL... 本篇文章极速百科给大家谈谈极速进化满电出发!长安深蓝SL03开启预售,以及长安蓝鲸plus新车报价对...
比亚迪f3汽车报价(比亚迪f3... 今天给各位分享比亚迪f3汽车报价的知识,其中也会对比亚迪f3价格及图片易车进行解释,如果能碰巧解决你...
两台电脑怎么共享一台打印机,两... 两台电脑怎么共享一台打印机目录两台电脑怎么共享一台打印机两台电脑如何共享一台打印机?请问一个打印机怎...
16个复韵母有哪些(16个复韵... 本篇文章极速百科给大家谈谈16个复韵母有哪些,以及16个复韵母怎么读拼音视频对应的知识点,希望对各位...
樟树有什么作用,樟树有什么作用... 樟树有什么作用目录樟树有什么作用樟树有什么作用?樟树的用途有哪些?樟树有什么作用?樟树有什么作用 ...
dazl启动子的作用,启动子和... dazl启动子的作用目录dazl启动子的作用启动子和终止子是什么作用的?dazl启动子的作用启动子的...
写字楼是干什么的 极速百科网 ... 写字楼是干什么的目录写字楼是干什么的写字楼是干什么的写字楼是干什么的 写字楼的功能介绍写字楼是干什么...