算法课习题汇总(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;
}
相关推荐
查理零世7 分钟前
【蓝桥杯集训·每日一题2025】 AcWing 6134. 哞叫时间II python
python·算法·蓝桥杯
仟濹8 分钟前
【二分搜索 C/C++】洛谷 P1873 EKO / 砍树
c语言·c++·算法
紫雾凌寒17 分钟前
解锁机器学习核心算法|神经网络:AI 领域的 “超级引擎”
人工智能·python·神经网络·算法·机器学习·卷积神经网络
京东零售技术41 分钟前
AI Agent实战:打造京东广告主的超级助手 | 京东零售技术实践
算法
MiyamiKK572 小时前
leetcode_位运算 190.颠倒二进制位
python·算法·leetcode
C137的本贾尼2 小时前
解决 LeetCode 串联所有单词的子串问题
算法·leetcode·c#
青橘MATLAB学习2 小时前
时间序列预测实战:指数平滑法详解与MATLAB实现
人工智能·算法·机器学习·matlab
lingllllove2 小时前
matlab二维艾里光束,阵列艾里光束,可改变光束直径以及距离
开发语言·算法·matlab
88号技师2 小时前
2025年2月一区SCI-海市蜃楼搜索优化算法Mirage search optimization-附Matlab免费代码
开发语言·人工智能·算法·机器学习·matlab·优化算法
在雨中6123 小时前
【找工作】C++和算法复习(自用)
c++·算法