算法设计
想做大佬的菜鸟李
你得加油
展开
-
算法实验1-4查找两个有序数组合并之后的中位数
插个题:在解决这个算法题之前,先看一下冒泡排序:借个大佬的图:对于冒泡,是相邻两个元素比较,大的数向后移,每循环一次就确定一个“最大的数”,排在最后,下一次比较时就不用再排了,所以代码的第二个for循环是n-i-1。步入正题问题:设两个长度分别为m和n的有序数组a[0:m-1]和b[0:n-1],请使用分治策略找出这两个有序数组合并之后的中位数算法思路:由于两个数组合并之后的中位数,比较nums1和nums2的中位数a,b,若a<b,则合并数组的中位数在a的右边,b的左边。若a&g原创 2021-10-23 19:55:03 · 252 阅读 · 0 评论 -
算法1-3-查找第k小元素
问题:设a[0:n-1]是无序数组,请使用分治策略找出这n个元素中第k(1≤k≤n)小的元素输入输出:输入n和k:10 4输入数组:12 3 1 8 7 16 9 11 20 2结果:7算法思路:其实跟快速排序算法类似,首先确定一个基数,从第一个开始,将输入的数组分成三段:{小于基数}、{基数}、{大于基数},一轮快速排序结束后,基数的位置是确定的,所以可以判断基数所在的位置与查找的k值是否相等,如果相等则返回基数值即可,再采用递归方法,如果k值比基数所在的位置小则在数组左边查找,如果k值原创 2021-10-23 16:59:35 · 606 阅读 · 0 评论 -
算法实验1-2-非递增快速排序
问题:设a[0:n-1]是无序数组,请修改快速排序算法,将输入元素按非增序排列。先了解一下快速排序:借个图:快速排序(Quick Sort)使用分治法策略。基本思想是:选择一个基准数,通过一趟排序将要排序的数据分割成独立的两部分;其中一部分的所有数据都比另外一部分的所有数据都要小。然后,再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。快速排序流程:(1) 从数列中挑出一个基准值。(2) 将所有比基准值小的摆放在基准前面,所有比基准值大的原创 2021-10-23 15:52:34 · 836 阅读 · 0 评论 -
算法实验1-1-二分搜索算法
问题:二分搜索算法代码1:#include<stdio.h>#include<string.h>int binarySearch(int a[] ,int x, int n){ int left=0; int right=n-1; while(left<=right){ int middle = (left+right)/2; if(x==a[middle]) return middle; if(x>a[middle]) left=middle+原创 2021-10-21 22:03:34 · 221 阅读 · 0 评论 -
算法实验-最大k乘积问题
问题:给设I是一个n位十进制整数,如果将I划分为k段,则可得到k个整数。这k个整数的乘积称为I的一个k乘积。试设计一个算法,对于给定的I和k,求出I的最大k乘积。输入:正整数n和k,以及一个n位十进制整数I输出:I的最大k乘积代码如下:#include<iostream> using namespace std; #define N 100int m[N][N]; char num[N]; //把字符串转化为整型 int atoi(char arr[],int原创 2021-10-21 22:01:10 · 517 阅读 · 0 评论 -
算法实验- 矩阵连乘问题
问题:给定n个矩阵{A1,A2,…,An},Ai与Ai+1是可乘的,i=1,2,…,n-1。试设计一个算法确定矩阵的乘法顺序,使得元素相乘的总次数最小。输入:向量P=<P0,P1,…,Pn>,其中P0,P1,…,Pn为n个矩阵的行数和列数输出:最少乘法次数,以及矩阵链乘法加括号的位置代码:#include<iostream>using namespace std;#define N 7 //N为7,实际表示有6个矩阵/**矩阵链构造函数:构造m[][]和s[原创 2021-10-21 22:00:05 · 356 阅读 · 0 评论 -
算法实验-租用游艇问题
问题:长江游艇俱乐部在长江上设置了n个游艇出租站1,2,…,n。 游客可在这些游艇出租站租用游艇,并在下游的任何一个游艇出租站归还游艇。游艇出租站i到游艇出租站j之间的租金为r(i, j)(1≤i< j ≤ n)。试设计一个算法,计算出从游艇出租站1到游艇出租站n所需的最少租金。思路:本问题需要采用二维数组,利用“对角线”来计算,我是设置间隔值从2开始(不相邻)。假设从第 i 站到第 j 站的最优办法是:从 i 到 k (i<=k<=j),再从 k 到 j ,即 r( i ,原创 2021-10-21 21:58:39 · 885 阅读 · 0 评论 -
C++-最小m段和问题
问题:给定n个整数组成的序列,现在要求将序列分割为m段,每段子序列中的数在原序列中连续排列。 如何分割才能使这m段子序列的和的最大值达到最小?思路:代码:/*分析:f[i][j]表示前i个数划分j段的最大最小值;状态转移方程:f[i][j]=max{f[i-k][j-1],sum(k,j)}*/#include<memory.h>#define INF 1e9#define MAX 100#include <iostream>#include &l原创 2021-10-20 21:11:17 · 291 阅读 · 0 评论 -
C++-石子合并问题
可以看大佬文章问题:问题描述:在一个圆形操场的四周摆放着n堆石子。现要将石子有次序地合并成一堆。规定每次只能选择相邻的两堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的得分。算法设计:试设计一个算法,计算出将n堆石子合并成一堆的最小得分和最大得分。思路:最小值是总是最小的两个数相加,最大值是总是最大的两个数相加。在此我们假设有n堆石子,一字排开,合并相邻两堆的石子,每合并两堆石子得到一个分数,最终合并后总分数最少的。我们设m(i,j)定义为第i堆石子到第j堆石子合并后的最少总分数。a原创 2021-10-20 19:45:01 · 928 阅读 · 0 评论 -
C++--最长单调递增子序列
问题:在一个给定的数值序列中,找到一个子序列,使得这个子序列元素的数值依次递增,并且这个子序列的长度尽可能地大。最长递增子序列中的元素在原序列中不一定是连续的。思路:首先确定一个子序列的当前值t和子序列的长度len,循环数组,从第一个数开始与后面的值比较大小,更新t和len的值,更新t和len的值。下一次再从第二个数这样与后面的数比较大小,每一次循环完都会比较len的长度,选择最大的值,并且把最大长度的当前第一个数赋值给son(子序列的第一个数),这样就找到了最大子序列的长度和子序列的第一个值,只需原创 2021-10-20 17:21:41 · 662 阅读 · 0 评论 -
C++-改写二分搜索算法
问题:设a[0:n-1]是已排好序的数组,请改写二分搜索算法,使得当x不在数组中时,返回小于x的最大元素位置i和大于x的最小元素位置j。当搜索元素在数组中时,i和j相同,均为x在数组中的位置。...原创 2021-10-19 21:33:21 · 851 阅读 · 0 评论 -
C++-众数问题
问题:给定含有n个元素的多重集合s,每个元素在S中出现的次数称为该元素的重数。多重集S中重数最大的元素称为众数。例如:S={1,2,2,2,3,5}。多重集S的众数的2,其重数为3.算法设计:对于给定的由N个自然数组成的多重集S,计算S的众数及其重数。数据输入:第一行n,第二行n个数结果输出:输出文件有2行,第1行是众数,第2行数重数。...原创 2021-10-20 16:52:02 · 1319 阅读 · 0 评论 -
C-子数组交换问题O(1)的辅助空间
问题:设a[0:n-1]是一个有n个元素的数组,k(0<=k<=n-1)是一个非负整数。试设计一个算法将子数组a[0:k]与a[k+1,n-1]换位。要求算法在最坏情况下耗时O(n),且只用到O(1)的辅助空间。思路:我采用的是向前循环换位,对数组进行循环,每一次循环每一个元素都向前移动一个位置,最后再将第一个数赋给最后一个元素即可,以此循环k次则会将需要交换的第k个位置前的数与后的数交换,需要交换第几个元素就循环k次即可。代码如下:C++:#include<iostre原创 2021-10-19 22:03:37 · 459 阅读 · 0 评论