![](https://img-blog.csdnimg.cn/20201014180756919.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
分治法
Titan_h
一只追逐梦想的菜鸟和一条会飞的鱼
展开
-
分治2快排
快排就是利用一个标志,左边的都比标志小,右边的都比标志小 所以首先要做的就是确定标志 我们用数组的第一个数代表标志flag = a【start】, 此时start的位置就看成空位由p指向空位 然后进行分别查看,因为是分成两部分,所以一个从前往后一个从后往前比较方便 从后面往前走的指针我们定义为end,从前往后的我们定义为start 当end>start的时候,就说明两指针没有相遇就能操作 当在移动end的时候如果遇到比flag小的就说明应该放在前面空位中,a[p]=a[end] , p指向空位p =e原创 2020-07-21 11:44:33 · 91 阅读 · 0 评论 -
分治5残缺的棋盘
可以把他平均分成四份(因为棋盘本身就是4的倍数,而且残缺部分和其他的方块刚好构成四个,所以可以将棋盘分成4的倍数平均分成四份,没分都是4的倍数) 分为左上,左下,右上,右下 然后看残缺部分在哪里把没残缺的部分填上方格,让每个部分都有被覆盖的部分或者方格,方便递归 然后递归的看每个小部分 当只有4个方格的时候要么有坏掉的部分,要么就是有被填上东西了,然后就可以填方格。 /*残缺的棋盘*/ #include<iostream> #include<string.h> using nam原创 2020-07-22 20:45:41 · 103 阅读 · 0 评论 -
分治4循环比赛排比赛时间表
先确定其中的一个小部分,在通过小部分推其他部分 /* 循环比赛 一共有n个选手,n=2m次方 (1)一个选手与其他n-1个选手进行一次比赛 (2)每个选手一天只能参赛一次; (3)循环赛在n-1天内结束。 算法思路: 按分治策略,我们可以将所有的选手分为两半,则n个选手的比赛日程表可以通过n/2个选手的比赛日程表来决定。 */ #include<iostream> using namespace std ; int n ; void Table(int n, int原创 2020-07-22 16:27:22 · 193 阅读 · 0 评论 -
分治3寻找第k小的数但是是两个有序数组
输入两个数组的大小和要查找的k的具体位置 然后输入两个具体的数组 由于是有序数组所以元素肯定有规律左边的大于右边的 所以我们就用分治法将需要找的元素的位置确定下来;思路如图: 后面几个的舍弃同理 /*还是寻找第k小的数 不过是题目已经将原数组排序,然后将排序后两个数组结合起来,找到新数组的第k个数*/ #include<iostream> using namespace std; int find_k(int *a,int *b,int as ,int ae, int bs,int be);原创 2020-07-21 21:43:08 · 161 阅读 · 0 评论 -
分治1寻找第k个数
题目大致意思就是给一个无序数组,让你来找到第k小的数 输入nm,代表数组元素大小和查找的第k个元素 第二行输入n个数 输出第k大的数在原数组的位置。 使用快排找数,快排不懂得可以去看这个博客(快排链接) 大致意思就是将元素分组,定义一个flag 这个flag可以是数组中的任意一个元素(必须在数组中) 左边的都比flag小,右边的都比他大,如果要找第k小的元素的话就看flag的位置是大于k还是小于k,大于k就说明在flag右边,小于k就在flag左边,递归遍历左右的元素 比如原数组是 取flag=25 ___原创 2020-07-20 11:54:54 · 223 阅读 · 0 评论