算法课习题汇总(2)

整数划分问题

将正整数n表示成一系列正整数之和,n=n1+n2+...+nk(n1>=n2>=...>=nk,k>=1)。正整数n的这种表示称为正整数n的划分。

思路:

n表示待划分数,m表示最大减数。

cpp 复制代码
#include<iostream>
using namespace std;

int q(int n, int m)
{
	if (m == 1)
		return 1;
	if (m > n)
		return q(n, n);
	if (n == m)
		return q(n, n-1) + 1;
	return q(n - m, m) + q(n, m-1);
}

int main()
{
	int n = 0;
	cin >> n;
	cout << q(n, n) << endl;
	return 0;
}

Hanoi问题 T(n)=2^n-1

具体看:汉诺塔问题

cpp 复制代码
#include<iostream>
using namespace std;

void move(char A, char B)
{
	cout << A <<"->" << B << endl;
}

void hanoi(int n, char A, char B, char C)
{
	if (n == 0)
		return;
	hanoi(n - 1, A, C, B);
	move(A, B);
	hanoi(n - 1, C, B, A);
}

int main()
{
	int n = 0;
	cin >> n;
	hanoi(n,'A','B','C');
	return 0;
}

二分搜索 O(n)=nlogn

cpp 复制代码
int Search(int* arr, int x, int n)
{
	int left = 0;
	int right = n;
	while (left <= right)
	{
		int mid = left + (right - left) / 2;
		if (x == arr[mid])
			return mid;
		else if (x > arr[mid])
			left = mid + 1;
		else
			right = mid - 1;
	}
	return -1;
}

int main()
{
	int n = 0;
	cin >> n;
	int arr[1000];
	for (int i = 0; i < n; i++)
		cin >> arr[i];
	cout << Search(arr, 5, n - 1) << endl;
	return 0;
}

合并排序 O(n)=nlogn

cpp 复制代码
#include<iostream>
using namespace std;

void Merge(int* arr, int l, int r)
{
	if (l == r)
		return;
	int mid = l + (r - l) / 2;
	Merge(arr, l, mid);
	Merge(arr, mid + 1, r);
	int i = l, j = mid + 1, k = l;
	int arr2[10000] = {0};
	while (i <= mid && j <= r)
	{
		if (arr[i] >= arr[j])
		{
			arr2[k++] = arr[j++];
		}
		else
		{
			arr2[k++] = arr[i++];
		}
	}
	while (i <= mid)
	{
		arr2[k++] = arr[i++];
	}
	while (j <= r)
	{
		arr2[k++] = arr[j++];
	}
	for (i = l; i <= r; i++)
	{
		arr[i] = arr2[i];
	}
}

int main()
{
	int n;
	cin >> n;
	int arr[10000];
	for (int i = 0; i < n; i++)
		cin >> arr[i];
	Merge(arr, 0, n - 1);
	for (int i = 0; i < n; i++)
		cout << arr[i]<<" ";
	cout << endl;
	return 0;
}

快速排序 O(n)=nlogn

cpp 复制代码
#include<iostream>
using namespace std;

void q(int* arr, int l, int r)
{
	if (l >= r)
		return;
	int mid=l+(r-l)/2;
	swap(arr[1], arr[mid]);
	int tmp = arr[1];
	int i = l, j = r;
	while (1)
	{
		while (i < j && arr[j] >= tmp)
			j--;
		while (i < j && arr[i] <= tmp)
			i++;
		if (i >= j)
			break;
		swap(arr[i], arr[j]);
	}
	swap(arr[i],arr[1]);
	q(arr, l, i - 1);
	q(arr, i + 1, r);
}

int main()
{
	int n;
	cin >> n;
	int arr[100];
	for (int i = 0; i < n; i++)
		cin >> arr[i];
	q(arr, 0, n - 1);
	for (int i = 0; i < n; i++)
		cout << arr[i]<<" ";
	cout << endl;
	return 0;
}
相关推荐
lxmyzzs39 分钟前
【图像算法 - 16】庖丁解牛:基于YOLO12与OpenCV的车辆部件级实例分割实战(附完整代码)
人工智能·深度学习·opencv·算法·yolo·计算机视觉·实例分割
wow_DG1 小时前
【C++✨】多种 C++ 解法固定宽度右对齐输出(每个数占 8 列)
开发语言·c++·算法
Epiphany.5561 小时前
c++最长上升子序列长度
c++·算法·图论
Cx330❀2 小时前
【数据结构初阶】--排序(四):归并排序
c语言·开发语言·数据结构·算法·排序算法
余_弦2 小时前
区块链中的密码学 —— 密钥派生算法
算法·区块链
亲爱的非洲野猪3 小时前
令牌桶(Token Bucket)和漏桶(Leaky Bucket)细节对比
网络·算法·限流·服务
NAGNIP3 小时前
一文读懂LLAMA
算法
烧冻鸡翅QAQ3 小时前
62.不同路径
算法·动态规划
番薯大佬3 小时前
编程算法实例-冒泡排序
数据结构·算法·排序算法
queenlll3 小时前
P2404 自然数的拆分问题(典型的dfs)
算法·深度优先