国科大计算机算法分析与设计1——分治算法
创始人
2025-06-01 01:02:12

写在前面

国科大算法复习的时候,想着复习一下平常的作业题,也正好记录一下。作业题总共分为四个部分,分治算法,动态规划,贪心算法,线性规划。可以说是算法学习中比较基础,经典的几个方面。

作业1:寻找两个有序数组的中位数

**问题描述:**对于两个数集A,B;已知|A| = |B| = n,且A,B集里无重复相同的数,每一次可以向A、B中任意一个提问,得到其第K小的数,其中K由提问者决定;那么试在O(logn)中求得A、 B中所有数的中位数。
**分析:**这个问题最关键的点是在O(logn)时间内求得A、 B中所有数的中位数,而对于O(logn)这种算法复杂度常见的就是二分,每次的问题规模需要减半。

**解法:**每次找两个数组的中位数,比较两个中位数,假设是amida_{mid}amid​和bmidb_{mid}bmid​,如果amid

在这里插入图片描述
另外也可以每次只去掉较小的那一部分,直到只剩n个数,那么只需要比较两个数组中最小的两个数,最小的就是要找的中位数target。

result = (findKth(nums1, 0, nums2, 0, n) + findKth(nums1, 0, nums2, 0, n)) / 2;
int findKth(int nums1[], int i, int nums2[], int j, int k)
{if (nums1.length() == 0 || nums2.length() == 0){return -1;}if (k == 1){return min(nums1[i], nums2[j]);}int midk1 = (i + k / 2 - 1 < nums1.length) ? nums1[i + k / 2 - 1] : Integer.MAX_VALUE;int midk2 = (j + k / 2 - 1 < nums2.length) ? nums2[j + k / 2 - 1] : Integer.MAX_VALUE;if (midk1 < midk2){return findKth(nums1, i + k / 2, nums2, j, k - k / 2);}else{return findKth(nums1, i, nums2, j + k / 2, k - k / 2);}
}

作业2:翻转二叉树

给定一棵二叉树,在时间复杂度O(n)对二叉树的所有左右孩子进行翻转。

解法:只需要递归的把左右子树进行翻转,然后交换左右孩子的指针,这样就实现了二叉树翻转。每个节点操作一次,算法复杂度是O(n)。

Inverse_Tree(Root)
{if Root != NULL:inverse_left_child = Inverse_Tree(Root->leftchild)inverse_right_child = Inverse_Tree(Root-> rightchild)Root->leftchild = inverse_right_child Root->rightchild = inverse_left_child return Rootelsereturn
}

作业3:越狱

监狱有连续编号为 1…N 的 N个房间,每个房间关押一个犯人,有 M种宗教,每个犯人可能信仰其中一种。如果相邻房间的犯人的宗教相同,就可能发生越狱,求有多少种状态可能发生越狱。

解法:从问题事件的对立问题入手。考虑每个相邻房间都不存在相同宗教这一事件出现的可能数目。
取最左边的犯人,得该犯人可能信仰的宗教数量是m;设该犯人选了宗教j, 那么在他右边的犯人的可供选择就只剩下m−1种了。 那么再以这个选m−1种宗教的犯人为标准,设他随便选了宗教k (k!=j) , 他的左边肯定跟他不一样,所以只要他右边也跟他不一样即可;
那么右边剩下选择依然为m−1种;
对于任意一名犯人,他需要与他左边相邻的犯人不同; 递推过去,他的右边相邻犯人会避免选择他选择的宗教,因而我们不用把相邻右边的犯人考虑进去。 所以情况数就为m×(m−1)n−1m\times\left(m-1\right)^{n-1}m×(m−1)n−1。
那么相邻房间的犯人的宗教相同(越狱)的情况数mn−m×(m−1)n−1m^n-{m\times\left(m-1\right)}^{n-1}mn−m×(m−1)n−1,通过快速幂可以实现O(log n).

//递归快速幂
int qpow(int a, int n)
{if (n == 0)return 1;else if (n % 2 == 1)return qpow(a, n - 1) * a;else{int temp = qpow(a, n / 2);return temp * temp;}
}

在递归快速幂中,每次只需要递归计算an2a^{\frac{n}{2}}a2n​,每次把结果存在temp里,不需要重复计算,进而算法复杂度是O(log n),这是递归写法,空间开销比较大,快速幂算法也能改写成非递归写法。比如我们要计算7107^{10}710,可以把指数10拆成2和8,那么就可以写成72×787^2 \times 7^872×78,是不是任意大于0的指数都能这样拆,是的,因为这就是二进制,任何指数都可以拆分1,2,4,8,16…这些组合,这其实就是二进制的每一位,当这一位是1的时候,就把结果ans乘以当前的值a,这个a值每次都会自乘,由此计算了2,4,8这种次方。

//非递归快速幂
int qpow(int a, int n){int ans = 1;while(n){if(n&1)        //如果n的当前末位为1ans *= a;  //ans乘上当前的aa *= a;        //a自乘n >>= 1;       //n往右移一位}return ans;
}

作业4:二叉树中的最大距离

给一个二叉树,假设相邻节点的距离为1,求二叉树中任意两个节点的最大距离。

解法:这个最大距离可能过根节点,也可能不过根节点,如果过了根节点,那这个最大距离就是左右子树高度之和,如果不过根节点,那这个最大距离会在左子树或者右子树里产生,同样会产生过不过左右子树根节点的问题。也就是需要维护一个全局变量,对二叉树中每个节点进行递归查询,把该节点当作根节点,看能够产生的最大距离是多少。

class Solution {int ans;int depth(TreeNode* root){if (root == NULL) return 0;int L = depth(root->left);int R = depth(root->right);ans = max(ans, L + R + 1);return max(L, R) + 1;}
public:int diameterOfBinaryTree(TreeNode* root) {ans = 1;depth(root);return ans - 1;}
};

作业5:实现三路快速排序

选择一个pivot,将数组划分为小于,大于,等于pivot三部分,对于等于pivot的部分没有必要再进行排序,剩下两部分等同于快速排序。

void triSort(int *a, int low, int high){if(low >= high)return;int key = a[low];int i = low, j = low;int k = high;while( i <= k){if(a[i] < key)swap(a[i++], a[j++]);else if(a[i] > key)swap(a[i], a[k--]);else i++;}triSort(a, low, j);triSort(a, k + 1, high);
}

作业6:切绳子

有n条不同长度绳子,从中选择m条绳子切割,使得m条绳子长度一致,求m条绳子的长度的最大值。

解法:绳子长度从0到最长的长度lmaxl_{max}lmax​,二分查找长度,每次判断在这个长度下,有没有m条绳子满足条件,也即是大于这个长度,如果有m条绳子,就在右区间找,没有m条绳子满足,就在左区间找。

在这里插入图片描述

相关内容

热门资讯

舆论战升级!巨子生物深夜回应,... 2025.06.02本文字数:2490,阅读时长大约4分钟作者 |第一财经 刘晓颖重组胶原蛋白成分之...
财经时评|以创新厚度重塑汽车产... 作者 远山中国汽车工业协会与工业和信息化部近期针对行业“内卷式”竞争的联合发声,为持续蔓延的价格战按...
恒生指数午盘下跌2.20%,恒... 6月2日午盘,香港恒生指数下跌2.20%,报22778.45点;恒生科技指数下跌2.43%,报504...
“以旧换新”带货1万亿,中国何... “美国想让制造业回流成为中国的样子,一个踏实劳作的‘生产者社会’;而中国想努力扩大消费成为美国的样子...
恒指半日跌2.2% 恒指半日跌... 【恒指半日跌2.2%】截至午间收盘,香港恒生指数下跌2.20%,报22778.45点;恒生科技指数下...
“成分之争”舆论战升级,巨子生... 重组胶原蛋白成分之争的舆论战再度升级。美妆博主 "大嘴博士" (郝宇)近日连续发文质疑,巨子生物(0...
汇川技术新注册《InoCube... 证券之星消息,近日汇川技术(300124)新注册了《InoCube-InoData数据分析系统V1....
博将控股多家所投企业荣登202... 博将控股多家所投企业荣登2025杭州独角兽与准独角兽榜单 2025年4月24日,由民建浙江省委会、浙...
刚刚,A50直线跳水!亚太股市... 6月2日,亚太股市开盘后持续走弱。富时中国A50期货开盘跌0.6%,截至目前跌幅1.91%。 截至...
问界、智界、享界、尊界,202... 2025鸿蒙智行:四界表现鸿蒙智行作为国内造车新势力的主流品牌,一共规划了“五界”车型,包括:问界、...
花样年控股:重组支持协议的最后... 6月1日,花样年控股(01777.HK)公告称,公司2024年4月29日所订立的重组支持协议的最终截...
蜜雪集团股价创上市以来新高 蜜... 新京报贝壳财经讯 6月2日,港股蜜雪集团盘中涨超7%,股价刷新上市新高。
美单边关税让全球经济面临更大不... 美国征收关税的对象和标准可能随意变更,其关税政策具有不可预测性。无论是外国企业,还是美国本土企业,都...
桃李面包创始人向其两儿子转让3... 5月30日晚间,桃李面包(沪市代码:603866)公告称,公司控股股东及实际控制人吴志刚通过大宗交易...
前4月东莞重大项目完成投资42... 本期看点:前4月东莞重大项目完成投资429.09亿元;长联科技募投项目提升年产至2.77万吨;广东省...
恒生指数跌幅扩大至2%,医药、... 6月2日,恒生指数跌幅扩大至2%,医药、地产、能源板块跌幅居前,美中嘉和跌超14%,石四药集团跌近1...
港股、A50飘绿,亚太市场多数... 早间,亚太市场多数下跌。港股、A50集体下跌其中,恒生指数、恒生科技指数开盘跌幅扩大, 港股生物技术...
雷军看好的两兄弟,要IPO了 ... 2021年夏,小米产业园办公室内,雷军饶有兴致地打量眼前一对兄弟,“为什么张波是创始人,董事长却是张...
圣阳股份涨1.66%,成交额9... 5月30日,圣阳股份涨1.66%,成交额9.82亿元,换手率15.03%,总市值66.67亿元。 异...
“龙舟溪游”点燃江南西商圈消费... 5月31日至6月2日,海珠区江南中街道一年一度的节假日消费体验活动如约而至。今年“龙舟溪游・与你童在...
恒生指数开盘跌1.06%,恒生... 6月2日,恒生指数开盘跌1.06%报23043.10点,恒生科技指数跌1.33%,恒生中国企业指数跌...
*ST天喻实控人被刑事立案 此... 5月30日,*ST天喻(300205.SZ)发布公告称,公司收到武汉市公安局送达的《立案告知书》,公...
“玩”出更多花样——“六一”礼... 能交流、讲故事的毛绒玩偶,融入中国文化、科技元素的拼插积木,电影《哪吒2》衍生开发的各类公仔……“六...
5月十大牛股出炉:中邮科技逾1... 截至5月30日收盘,沪指月内累计涨2.09%,深证成指累计涨1.42%,创业板指累计涨2.32%。在...
恒生指数止步周线七连阳,IPO... 南方财经全媒体记者 袁思杰 实习生武桐羽 香港报道上周(5月26日-5月30日),港股震荡回调,主要...
新势力车企5月放榜:零跑汽车登... 近期,国内多家主流自主汽车企业纷纷发布了5月份的销售数据。造车新势力5月交付成绩也出炉,第一名依然是...
最新!2025新势力5月销量出... 5月新势力表现如何?2025年5月的销售周期刚刚过去,不少造车新势力厂商的销量数据,已经新鲜出炉。数...
两家A股公司,收终止上市决定 又有两家A股上市公司收到股票终止上市决定,6月10日进入退市整理期。 上述自律监管决定书指出,因2...
重磅,事关教育强国,主力提前埋... 数据是个宝数据宝投资少烦恼这些产业的景气度处于上升期。《求是》杂志发表文章《加快建设教育强国》6月1...